Menu déroulant dans userforme

Bonjour le forum,

Je souhaite créer 2 menus déroulants indépendant (pas en cascade) dans le même userform est ce que quelqu'un d'entre vous pourrait me donner un exemple que je puisse adapter (je sais faire des menus en cascade mais indépendant non).

Les données sont dans la feuil 2 et dans la feuil 1 je souhaite importé les données sur la 1ere ligne vide

Merci d'avance

18exemple.xlsx (16.87 Ko)

Bonjour,

Si tu sais faire des listes-cascade en utilisant des ComboBox, c'est que tu sais utiliser des ComboBox !

Et si tu sais utiliser des ComboBox, c'est que tu sais y afficher des listes !

Donc, tu sais faire : afficher des listes n'ayant pas de lien, puisque tu fais déjà plus en affichant des listes liées entre elles !

Ta question est du type : je sais additionner 3 nombre, mais comment faire pour en additionner 2 !

Très sympa comme commentaire mais ça ne résout malheureusement pas l'affaire

j’attends toujours une discussion un peut plus dans le contexte de ce sujet ^^

Pour clarifier la chose je crée à partir d'un model -_-

(je sais faire des menus en cascade mais indépendant non).

C'est bien toi qui a écrit ceci ?

Tu prétends donc ne pas savoir faire une opération élémentaire nécessairement inclue dans une opération plus élaborée que tu prétends savoir faire !!! Avoue que quelque chose ne va pas !

Ensuite, s'il est question de UserForm, un fichier xlsx n'est guère adéquat...

Mais :

Les données sont dans la feuil 2 et dans la feuil 1 je souhaite importé les données sur la 1ere ligne vide

Là on ne voit plus ce que viendrait faire un Userform muni de ComboBox dans cette opération de transfert de données d'une feuille à une autre ?

J'ai un model (ce n'ai pas moi qu'il a fait) il importe des lignes à partir d'une BDD partant sur des listes en cascade donc je recopier le code et je l'adapte au besoins de la combox pour rajouter d'autres listes en cascades qui s’enchaînent avec les anciennes.

le fichier n'est pas dans le bon format car c est un model très simplifier pour que celui qui souhaite aider (ou ce moquer dans certains cas ) il aura une idée général sur le besoin.

Maintenant j'ai avoué passant aux chose plus sérieuses

Je souhaite voir un model sur un fichier simple et je compare les 2 méthodes pour que j'apprenne c'est tout

Tout ça est quelque peu confus et embrouillé !

Des listes-cascades sont des listes de choix dépendantes les unes des autres, et impliquant que des choix se fassent successivement dans un ordre donnée :

on fait un choix1 dans la liste1, ce choix va conditionner la composition de la liste2 pour le choix suivant

on fait alors un choix2 dans la liste2, choix qui va présider éventuellement à la composition de la liste3

on peut alors faire un choix3 dans la liste3... ainsi de suite s'il y a encore d'autres listes dépendantes.

Ta façon d'en parler fait que je ne suis pas sûr que l'on parle de la même chose !

Ce système peut constituer un dispositif de recherche dans une base de données, mais l'import de données de la base vers un autre emplacement est une autre question.

Si tu montrais ton modèle sur lequel tu t'appuies (pour faire autre chose apparemment) on pourrait peut-être y voir plus clair. Mais je pense toujours que le mieux est d'indiquer ce que toi tu veux faire et à partir de quoi, sans s'encombrer d'un modèle prévu pour autre chose. Le modèle à ton usage, on le fabrique alors sur mesure.

Ci joint le fichier après avoir supprimer les données.

Le principe c'est en cliquant sur nouvelle tâche t'aura une cb qui importe certains données depuis la Base de données mais la partie de choix de l'opérateur reste manuel.

je souhaite remplacer les text box du choix des 5 opérateurs par des listes déroulantes alimentés depuis la feuil nommé RH.

j'ai essayé mais j'ai eu des erreurs

Je te remercie pour ton aide

33planning.xlsm (118.54 Ko)

Vu ton fichier... C'est effectivement un peu plus clair !

Une remarque préalable d'abord : en guise de base de données, tu as un tableau de données, dès lors que tu introduis des cellules fusionnées tu ne pourras plus utiliser fonctionnellement ta base comme base de données à part entière. Tu as donc un tableau, dont on extrait des données, au prix quelques manipulations supplémentaires. Je n'y toucherai pas, à toi de faire ton expérience en la matière...

Il y a pas mal de choses à voir, et ce sera après manger... Tu as toutefois la chance d'avoir hérité d'un code de plutôt bonne qualité, même si je le préfèrerais plus correctement indenté (pour tes Combo_Change et l'Initialize, la proc. bouton n'est pas de la même plume ! )

@+

Bonjour,

N'est-elle pas un peut étrange la base de données ?

Personnellement je ne travail jamais des bases de données dont les cellules fusionnées.

Quand tu vas faire une sélection sur A2 il va afficher quoi comme résultat de la colonne F ? le contenu de F2, F3, F4... ?

Cette fois, je ne peux que te donner raison... !

Cela provoquera sans doute des difficultés par la suite, mais il faut peut-être en faire l'expérience pour s'en persuader...

Le concepteur du code en a toutefois tiré partie...

Bon ! "mes" chats s'impatientent vraiment !

Bonjour messieurs,

bonne appétit à ceux qui vont manger

c'est un travail très bien fait par un M job75 avec lequel j'ai perdu contacte et je peux pas lui demander de tout faire. ce code fait exactement ce que je veux et ça fait un moment que je travail avec (le but c d importer des pièces après d'autres données serons importés selon la selection). j'ai compris le code et j'ai pu manipulé pour créer certaine cb (dépendante) et TB pour d'autres models.

le squelette de cet outil de planification et celui là et je ne peux pas le révolutionner car les utilisateurs sont satisfaits.

la seule chose à améliorer c'est de créer des menus déroulants dans le meme userforme à partir des la feuil RH == chaque colonne représente une menu.

c pour ça que j'ai demandé de m le faire sur le petit exemple peut etre je trouve moyen de l'adapter comme je faisais avant.

j'imagine que ça va pas etre compliqué pour vous c tt simplement un menu pour les données de chaque colonne

Bonsoir,

Tu confirmes mon appréciation ! Job75 oeuvre sur un autre forum mais j'ai cependant déjà eu le loisir de lire quelques uns de ses codes qui apportaient des solutions particulièrement pertinentes... J'ai d'ailleurs eu l'occasion de l'exprimer il y a pas mal de temps, mais je ne me souviens plus si c'était sur ce Forum ci.

Certes, remplacer les TextBox concernés par des Combo, dotées des listes Opérateurs est quelque chose d'assez simple en soi, mais il y a divers éléments à revoir dans ce cadre, pour éviter de simplement coller des rustines mais avoir un résultat qui pourra absorber sans difficultés des évolutions ultérieures.

Je vois ça dès que possible (mais sous effet de calmants, ce n'est pas le meilleur moment),ce sera mieux au prochain réveil...

@+

D'accord je te remercie encore une fois.

je souhaite l'avoir le plutôt possible (sans pression) car mon stage finira dans 3 semaines et ils reste que ça à faire.

bonne soiré et au prochain réveil

Bonjour,

Un petit débroussaillage préalable.

La déclaration d'un bon nombre de variables (type Worksheet et Range) niveau module du Userform, qui n'ont en fait pas de rôle particulier dans le fonctionnement interne du Userform mais ne visent qu'à pallier des difficultés d'adressage ne sont pas ce qu'il y a de mieux et leur disparition serait de nature à simplifier grandement la maintenance du code...

On désigne habituellement une feuille par son nom (Name) mais un nom peut être facilement modifié... On introduit une plus grande stabilité en utilisant le nom de code de la feuille (CodeName), moins susceptible de modifications, mais là encore si on se transfère dans un autre classeur, on ne retrouvera pas les mêmes noms de code !

Le moyen de surmonter cette difficulté en mettant en place un système d'adressage stable qui permettra de conserver le même code sans modification lors de transferts, consiste à nommer des plages.

Le nom étant celui qu'on décide de donner, une fois pour toutes, il ne variera plus, on n'aura donc plus à retoucher au code qui l'utilise, et si le nom donné est dynamique, soit s'adapte aux variations de la plage nommée, la seule action initiale et lors de changements consiste en la mise en place du nom...

A partir d'un nom sur un feuille, on peut cibler n'importe quelle plage de la feuille et se passe de la feuille pour adresser, le nom suffit.

Exemple : je nomme BBato (pour Base colonne Bateau, soit A), en définissant le nom par la formule :

=DECALER('Base de données'!$A$2;;;NBVAL('Base de données'!$F:$F)-1)

j'obtiens un nom qui réfère à la totalité de la colonne A de la base et s'ajustera à ses variations si elle est modifiée... Ce nom me permet de couvrir tous les besoins d'adressage dans la base et plus largement dans la feuille, par décalage (Offset) et/ou redimensionnement (Resize), voire en utilisant un adressage indirect à partir d'une plage au lieu d'un adressage absolu dans la feuille...

On est dans le même cas pour ta feuille Planning, rebaptisée J2. Mais alors que pour la base il t'est interdit d'utiliser un tableau Excel en raison de sa configuration, pour le tableau de cette feuille cela demeure possible et pourrait présenter des avantages : un tableau Excel est auto-extensible, et s'étend avec la mise en forme et le cas échéant les formules dont on l'a doté...

Il me semble que tu devrais t'y pencher rapidement. Je vais m'absenter jusqu'à 14h (soit 12h00 en métropole), ce qui te laisse le temps de faire un choix à cet égard.

Dernier point : peux-tu m'éclairer sur le format de cellule de la colonne Code composé, qui fait référence à des paramètres régionaux chinois ?

Me préciser si tu comprends bien mes explications relatives aux noms de plage...

Cordialement.

Questions complémentaires :

Opérateur 6 : figure dans J2 mais pas dans Userform ?

A l'inverse, Temps de phase et Pause figurent dans Userform, mais pas dans J2 ?

Temps de phase est peut-être le Temps de référence de la base ?

Clarifier ces éléments.

Effectivement pour l'opérateur 6 on effet c'est très rare ou on a 6 opérateurs sur une seul tâche donc il n'apparait pas dans le userfporm et dans le peu de cas ou il est présent je le rajoute manuellement sur le tableau directement.

Pour les temps ci-joint le tableau de la J 2 en entier.

le temps de phase est à rentrer manuellement il représente une partie du temps référence

Dans un autre model les temps de phase sont exactement le temps de référence mais ici ce n'est pas tout a fait juste.

18planning.xlsm (106.09 Ko)

Un petit commentaire à propos de l'utilité de l'utilisation des codesname c'est que quand je travail sur plusieurs onglets de résultats (plannings) les utilisateurs changent le nom de l'onglet = la date de planning donc en utilisant un codename le userforme s'exécute quoi que ce soit le nom de la feuil.

la chose qu'on puisse améliorer concernant ce point (mais se n'est pas du tout urgent) c'est de pouvoir exécuter le user form sur activesheet comme ça on sera pas obligé de créer un user form pour chaque feuil de calcule

Bonjour,

L'utilisation du CodeName sert en effet à travailler avec des feuilles dont les noms sont susceptibles de changer. Mais comme je l'ai dit, en utilisant des noms de plages, outre le même avantage, on se passe carrément des feuilles ! Et on simplfie les procédures d'affectation.

Un Userform n'est jamais lié à une feuille, c'est même un composant qui ne fait pas partie d'Excel...

Une feuille n'intervient que comme emplacement à partir duquel tu appelles le Userform...

Mais pas de souci particulier à cet égard.

Ayant commencé à travailler sur ton premier fichier, j'y ai substitué la J2 complète de ton second fichier.

J'ai donc noté que là ton tableau est un tableau Excel, et que ton Userform permet de servir les colonnes A à N de ce tableau.

A suivre...

Oui je suis tout a fait d'accord avec tous ce que tu viens de dire.

Pour le Userform oui il alimente le tableau de A à N.

Reste qu'à visualiser le résultat que je pense qu'il sera à mon avis réussit du 1er coup vu que t'as compris exactement ce que fait le code.

J'attaque les explications :

1) Plages nommées :

Comme je l'avais déjà indiqué, j'ai nommé la première colonne de ta base : BBato

Ce nom réfère à :

=DECALER('Base de données'!$A$2;;;NBVAL('Base de données'!$F:$F)-1)

Comme tu le vois, on utilise une formule pour donner un nom dynamique. On utilise la fonction DECALER en prenant pour base la cellule supérieure gauche de la plage nommée (ici A2), on n'opère aucun décalage en ligne ou en colonne, mais on utilise le 4e argument de la fonction pour définir le nombre de lignes qui va dimensionner la plage sur le nombre de valeurs dans une colonne qui ne comporte pas de vides et ici on ôte 1 pour éliminer l'en-tête de ce décompte. (Si besoin, on utilise le 5e argument de la fonction pour dimensionner la plage en colonnes, inutile ici puisqu'on ne nomme qu'une colonne, ce qui suffit comme tu pourras le voir dans les procédures Change de CB1 et CB2.)

Tu trouveras ce nom dans le code sous la forme [BBato], entre crochets, qui est une façon appelée compacte d'accéder à des références.

(Nota- Le nom est un nom dans le classeur, donc unique, et permet d'accéder directement à la plage. Pas de souci si on change les noms des feuilles, Excel répercute automatiquement les changements dans la formule.)

Autre nom : Opér1, qui nomme la cellule A1 de la feuille RH. Ici le nom nous sert à nous passer de la feuille, et nommer une seule cellule est suffisant pour l'utilisation qui consistera à extraire les listes d'opérateurs (à voir dans l'Initialize).

Bien entendu, tu peux modifier les noms que j'ai utilisé pour en choisir de plus évocateurs pour toi, le cas échéant. Il faut alors les modifier partout où ils sont dans le code...

Enfin, en ce qui concerne ton tableau d'affectation, il s'agit d'un tableau Excel. Pour ces tableaux, Excel insère automatiquement un nom dans le classeur. celui-ci est nommé Tableau1, nom que tu peux bien sûr modifier (dans l'Onglet Création lorsque tu es positionné dans le tableau).

Ce nom, correspond à la partie données du tableau (en-tête exclue). Et il est utilisable en VBA, on ne rajoute donc pas d'autre nom et on se servira de celui-ci pour accéder au tableau.

2) Ajustements du Userform :

J 'ai remplacé les 5 TextBox dédiées aux opérateurs par 5 ComboBox, nommées cbxOp1 à cbxOp5 (j'utilise une méthode fréquemment utilisée pour le renommage des contrôles, qui consiste à placer un préfixe en minuscules permettant une identification aisée du type de contrôle, suivi d'un nom générique à un groupe de contrôle et commençant par une Majuscule, suivi éventuellement d'un numéro d'ordre dans le groupe, cette méthode permet en principe de s'y retrouver facilement, bien que le cas échéant il puisse être judicieux d'y déroger pour faciliter le traitement au moyen de boucles, mais on ne manque pas de méthodes pour parvenir à faire des boucles dans tous les cas de figure...)

J'ai rajouté un TB3 (TextBox destinée à saisir un opérateur 6 éventuel, cela correspond à la colonne K de ton tableau, et il nous faut donc un contrôle correspondant à cette colonne, qu'il soit servi ou non lors de l'utilisation du Userform).

Et j'ai renuméroté les TextBox restant en : TB4 (nb d'opérateurs), TB5 (temps de phase), TB6 (temps de pause).

Bonne chose que d'avoir mis la propriété Locked des TB1 et TB2 à True. Ils sont servis automatiquement. Pour compléter, il convient de mettre la propriété TabStop à False, afin de les exclure de l'ordre de tabulation.

Mais TB4 est dans la même situation, le nombre d'opérateurs peut être inséré automatiquement. J'ai donc aligné ses propriétés sur TB1 et TB2, y compris la couleur de fond, pensant que cela indiquait les TextBox à ne pas servir par l'utilisateur.

J'ai également vérifié l'ordre de tabulation pour les contrôles à servir (en cas de besoin, clic droit dans une zone vide du Userform et Ordre de tabulation...)

Je reviens pour poursuivre avec l'Initialize, mais "mes" chats deviennent de plus en plus impatients lorsqu'arrive le soir ! (je dis "mes" mais en fait ce sont eux qui ont élu restaurant chez moi !)

Rechercher des sujets similaires à "menu deroulant userforme"