Liste déroulante alimentée par des TextBox ET des ComboBox

Bonjour à toutes et à tous,

Ce site est une véritable mine d'or, cependant, je cherche depuis des jours la solution à ce problème (je suis débutant) :

j'essaie de créer une base de données avec 27 colonnes qui sont alimentées par des saisies à la fois dans des TextBox ET des ComboBox.

Je n'arrive pas à finaliser le code de la liste déroulante qui permettrait de charger dans un formulaire la suite de TextBox et ComboBox intriques (je sais, on peut déplacer les colonnes pour les rendre jointives, mais ça ne résout pas mon problème alors qu'il n'y en a pas quand il n'y a que des TextBox). Je cherche un code soit colonne par colonne, ou plus élégamment avec des boucles.

J'ai utilisé un UserForm multipage en pensant qu'il serait plus facile de transférer les données d'une page à l'autre (les nom et prénom de la personne sélectionnée sur la première page devant être visible sur les pages suivantes qui fourniront d'autres informations, mais je n'en vois plus très bien l'intérêt. (l'Userform ne se lance pas correctement car j'ai supprimé des pages pour alléger le fichier)

Merci d'avance à celle ou celui qui prendra le temps de me répondre.

Cordialement

nemo1664

70multi-test.xlsm (52.33 Ko)

Bonjour,

Au cas particulier, la variable Ligne n'étant pas initialisée, vouloir charger des données de la ligne 0 a peu de chances de fonctionner...

Mais je crois qu'il conviendrait de vérifier la totalité de la conception... Le bouton au mileu de ta base, on se demande ce qu'il a à y faire ! On ne sait quelle opération est lancée : saisie ou modification, cela peut se régler de l'extérieur avant lancement du Userform ou après (dans ce cas ouverture en saisie et bascule en modif si on recherche un enregistrement à cette fin...).

NB - Nouveau et Ajouter me semble être la même chose ! On ajoute un nouvel enregistrement ou on le modifie... ou alors ta conception me paraîtra bizarre.

La conception est donc globalement à revoir...

Je ne vois pas l'utilité des onglets. L'ouverture en non modal est par contre toujours contre indiquée pour un Userform destiné à la saisie ou modif d'éléments d'une base.

Les contrôles se renomment, c'est toujours conseillé, et rien n'empêche de renommer des TextBox et des ComboBox en utilisant un même nom générique...

De toutes façons il est toujours possible de faire des boucles...

L'utilisation de noms s'avère généralement plus pratique et permet de s'affranchir de la désignation de la feuille pour les opérations d'affectation et de prélèvement.

Il est toujours souhaitable de rechercher l'organisation la plus simple et la plus économique, elle n'en sera que plus fiable : articulation des fonctionnalités dévolues au Userform, propriétés par défaut des contrôles (à l'ouverture, à définir au maximum dans la fenêtre de propriétés), modalités de recherche, passage de mode ajout en modif et vice-versa, réinitialisations nécessaires en cours d'exécution lors de passage d'un mode à l'autre, procédures de chargement( recherche-modif), et d'affectation (commune à ajout et modif)... Dans tous les cas, ce qui n'est pas pensé et bien conçu avant de passer à la réalisation ne se retrouvera pas (ou mal) à l'arrivée.

Cordialement.

Bonjour,

Merci pour cette réponse rapide.

Je vais suivre tes conseils et essayer de revoir l'ensemble de la conception notamment en renommant les box et en essayant de simplifier la structure.

Mais je pense avoir trop réduit le fichier en supprimant des pages pour l'alléger ce qui le rend peu compréhensible.

Je vais revoir tout ça et ferai (rapidement) une nouvelle version.

Cordialement

nemo1664

Bonjour MFerrand

je pensais avoir fait une réponse avec une pièce jointe, mais je ne la retrouve pas dans les courriers. Sans doute une mauvaise manoeuvre ?

En tout cas, ça a été plus compliqué que je ne pensais de suivre vos recommandations : j'ai tout recommencé à zéro avec des formulaires indépendants et en mettant des noms génériques sur les ComboBox et TextBox et en revoyant tous le code et notamment en essayant en mode modal.

Mais ça ne fonctionne pas mieux : je ne peux toujours pas afficher la liste déroulante qui est le noyau de toute la base et même maintenant des difficultés pour passer d'un formulaire à l'autre (de IDENTITE à START, le code START View génère une d'erreur).

Je voudrais de même que l'identité sélectionnée (Identite1 à Identite3 soit transférée automatiquement dans les autres formulaires pour des saisies complémentaires et les enregistrer sur la bonne ligne.

Le boutons CHERCHERchercher initialise le ComboBox de la ligne déroulante ainsi que l'id de la personne qui fait la recherche pour afficher l'id du créateur et on registre ensuite avec MODIFIER sur la même ligne ; Le bouton NOUVEAU fait l'inverse et crée une nouvelle ligne.

Avec l'espoir que vous pourrez m'aider.

Bien cordialement

nemo1664

Bien cordialement

108test-2.xlsm (79.72 Ko)

Bonsoir,

Je sature un peu et je vais finir par me mélanger avec des sujets aux intitulés proches (mais seulement les intitulés)... j'ai failli supprimer le message pensant que je venais justement de lire... Je regarde dès que possible mais ta question étant relativement vaste à examiner ce sera après que j'aie déblayé celles en cours de finalisation..

Cordialement.

Merci d'avance

nemo1664

Bonsoir,

Sur un premier examen que j'ai pu faire j'aurai deux questions :

Est-ce que tu connais la fenêtre de propriétés et son utilité ?

Comment insères-tu les déclarations de procédure dans un module de Userform ?

Je serais par ailleurs curieux de savoir si la taille des Userform (et l'abondance des Frame tant qu'on y est) répond à une nécessité ?

(C'est peut-être archaïque mais j'appris à économiser autant que faire se peut l'espace dans les formulaires, ajuster les tailles des contrôles en fonction de leur contenu potentiel , éviter les espaces morts dans la disposition et faire en même temps en sorte que l'ensemble se voit d'un seul coup d'oeil... Alors quand j'ai des Userforms à moitié vide mais que je ne peux afficher en entier sur mon écran, même travaillant avec un portable ça me laisse un peu dubitatif ! )

Cordialement.

Bonjour,

- Oui, je pense connaître un peu la fenêtre des propriétés, notamment pour la mise en forme des formulaires, mais je n'en connais certainement pas toutes les propriétés (je suis vraiment débutant en VBA).

- Insertion / procédure / Sur ... mais je ne sais pas si c'est nécessaire pour tous les UserForm ni ce qu'il faut obligatoirement y mettre.

- Pour la taille des UserForm, c'est pour conserver un certaine cohérence de surface à l'écran entre tous (je sais que c'est embêtant, j'ai un 17 pouces ), mais certains UserForm vont être très chargés (je travaille dans une association qui fait de la formation et de la reconversion professionnelle des personnes handicapées et dans l'UserForm concernant l'évaluation médicale, il y a 52 items à pointer avec chaque fois 4 propositions d'adaptation selon le degré de handicap. J'ai du utiliser là 7 onglets de catégorie, la synthèse de cette évaluation étant renvoyée vers une feuille A4 (AdItem dans des TextBox) qui sera imprimée, d'où le grand format). C'est une application qui doit me servir au quotidien et qui à ma connaissance n'existe pas. Par ailleurs, je prévois d'y associer aussi la visualisation de fichiers pdf).

J'ai continué à travailler sur le code et je penses que je ne peux pas traiter les TextBox comme les ComboBox, c'est à dire avec le même nom générique, ça ne marche pas pour la liste déroulante et là je ne sais pas comment m'y prendre.

Voilà, j'ai vraiment besoin d'aide

Bien cordialement

nemo1664


Bonjour,

- Oui, je pense connaître un peu la fenêtre des propriétés, notamment pour la mise en forme des formulaires, mais je n'en connais certainement pas toutes les propriétés (je suis vraiment débutant en VBA).

- Insertion / procédure / Sur ... mais je ne sais pas si c'est nécessaire pour tous les UserForm ni ce qu'il faut obligatoirement y mettre.

- Pour la taille des UserForm, c'est pour conserver un certaine cohérence de surface à l'écran entre tous (je sais que c'est embêtant, j'ai un 17 pouces ), mais certains UserForm vont être très chargés (je travaille dans une association qui fait de la formation et de la reconversion professionnelle des personnes handicapées et dans l'UserForm concernant l'évaluation médicale, il y a 52 items à pointer avec chaque fois 4 propositions d'adaptation selon le degré de handicap. J'ai du utiliser là 7 onglets de catégorie, la synthèse de cette évaluation étant renvoyée vers une feuille A4 (AdItem dans des TextBox) qui sera imprimée, d'où le grand format). C'est une application qui doit me servir au quotidien et qui à ma connaissance n'existe pas. Par ailleurs, je prévois d'y associer aussi la visualisation de fichiers pdf).

J'ai continué à travailler sur le code et je penses que je ne peux pas traiter les TextBox comme les ComboBox, c'est à dire avec le même nom générique, ça ne marche pas pour la liste déroulante et là je ne sais pas comment m'y prendre.

Voilà, j'ai vraiment besoin d'aide

Bien cordialement

nemo1664

Bonjour,

J'ai continué à travailler sur le code et je penses que je ne peux pas traiter les TextBox comme les ComboBox, c'est à dire avec le même nom générique, ça ne marche pas pour la liste déroulante et là je ne sais pas comment m'y prendre.

Là je ne comprends pas bien ce que tu veux dire... Quel que soit le nom que tu lui donnes une ComboBox restera une ComboBox avec les mêmes propriétés et même chose pour les TextBox !

Pour le reste, explications plus tard... J'essaierai de commencer par d'abord remettre sur pied ton Userform d'accueil qui me semble avoir subi des avanies (modifs non répercutées dans le code...)

Cordialement.

Quelques mots avant de m'absenter, et je poursuivrais ensuite...

La fenêtre de propriété : elle sert principalement à régler les propriétés par défaut des contrôles, c'est à dire celle que tu veux avoir à l'ouverture. Dès lors qu'elles sont définies et constantes, c'est à faire dans la fenêtre de propriété, certaines exigent de ne toucher à rien (comme ouvrir avec des TextBox vides, c'est la valeur par défaut, sauf si tu la modifies pour en avoir une autre...), d'autres ne correspondant par aux valeurs par défaut prédéfinies, tu les changes : mettre Visible à False pour les contrôles masqués à l'ouverture, le caractère de remplacement du mot de passe... J'ai noté que tu l'avais en partie fait avec Locked à True pour les TextBox non saisis par l'utilisateur, pour compléter, il y a aussi lieu de mettre TabStop à False pour qu'il ne constituent plus un poin d'arrêt lors de tabulation.

A la procédure d'initialisation (qui s'exécute une seule fois à l'ouverture du Userform, avant son affichage) revient les propriétés qui ne peuvent être définies une fois pour toutes, et seront donc redéfinies à chaque lancement : il ne reste donc plus dans ton Initialize (de Start) que la date de dernière mise à jour...

Par la suite, tu les fais varier de façon dyamique, tel que tu le prévoies selon les actions de l'utilisateur.

L'insertion des procédures d'évènement : conseil qui s'applique à tous les modules d'objets, laisser autant que possible faire VBA, cela évite beaucoup d'erreurs et on s'y retrouvera mieux par la suite.

Les contrôles utilisés sont listés dans la liste déroulante de gauche, lorsqu'on en sélectionne un, VBA inscrit la déclaration de procédure concernant l'évènement par défaut du contrôle choisi. Si l'on vise à programmer un autre évènement pour le contrôle, en étant positionné su la première déclaration, on trouvera la liste des évènements disponibles dans la liste déroulante de droite. Un clic et la nouvelle déclaration apparaît, il n'y aura plus qu'à effacer celle que l'on n'utilise pas.

Cela t'évitera notamment des Start_Activate... Les évènements de l'objet auquel est dédié le module sont toujours déclaré sous le nom générique de l'objet : UserForm_Activate... il en est de même dans les modules de feuilles de calculs (c'est Worksheet_...) ou dans ThisWorkbook (c'est Workbook_...)

Je conseille aussi à l'expérience de laisser VBA classer les procédures, il les classe simplement par ordre alphabétique, ce qui garantit au moins que les procédures d'un même contrôle seront groupées. On peut souhaiter les classer dans un ordre que l'on trouve plus logique mais dès que l'on en a un certain nombre, il est rare qu'il n'y en ait pas qui échappe à ladite logique et au bout de compte on passe plus de temps à les chercher que si l'on avait laissé VBA opérer...

Autre élément que je conseille s'agissant de procédures (hors évènements des contrôles) que l'on est amené à ajouter : toujours les placer en tête du module, à la suite des déclarations de niveau module, elle seront dans la zone qui s'affiche sous le terme (Général) dans la liste déroulante de gauche (ceci est règle conventionnelle de programmation VBA), également de ne pas les rendre privée (en les affublant d'un Private), elles seront certes publiques (toutes les procédures sont publiques par défaut) mais dans un module privé, donc ne pouvant être appelées du dehors sans faire référence au module, ce qui élimine pratiquement tout risque qu'elles soient lancées par erreur, par contre on les distinguera ainsi du premier coup d'oeil des procédures d'évènements (qui elles, sont privées par définition qu'on ne pourrait rendre publique en ôtant le mot-clé Private).

Comme dans tous les modules, si l'on a des procédures Sub et des Function, les Function se placent toujours avant les Sub, juste après les déclarations (encore une règle conventionnelle, qui a également pour but d'assurer un accès plus rapide aux fonctions.

Voilà pour les généralités avant de passer aux éléments concrets de ton classeur... J'en dis deux mots, pour ne laisser que le Userform Start proprement pour la prochaine fois.

Ton classeur n'est pas complet, donc je ne le serai pas non plus. Il convient à mon sens que tu le dotes d'une feuille d'accueil (que tu appelles comme tu veux...) car il n'est pas concevable qu'il s'ouvre sur la feuille Param, et aucune n'est non plus spécialement indiquée.

Pour cette feuille Param, j'ai d'emblée ajouté à ta proc. BeforeSave le masquage en VeryHidden de cette feuille. Elle n'a à mon avis aucune raison d'être jamais affichée (sauf exceptionnellement...), si tu mets des mots de passe, ce n'est pas pour en mettre la liste à disposition.... !

J'ai par ailleurs nommé la colonne A de ta Base. Un nom permet d'appeler l'objet nommé sans autre référence (si une plage est nommée on n'a plus à se préoccuper de la feuille qui la contient pour l'atteindre, on dispose sans calcul en permanence du nombre d'éléments de la Base (nb de lignes de la plage : .Rows.Count). Nommer une colonne est suffisant et offre plus de souplesse pour pointer n'importe quelle colonne de la Base (.Offset(, x)), et n'importe quelle partie ou cellule individuelle (en adjoignant .Resize(r, k)). Cela facilite les opérations de prélèvement et celles d'affectation...

Je crois que j'ai fait le tour des éléments hors Userform... A+

Merci pour ce cours didactique (je vais faire des progrès )

Pour la feuille de démarrage, je l'avais supprimée pour simplifier

Je vais essayer de retenir tout ça.

Merci encore !

Nemo1664

On poursuit !

Comme je l'ai dit l'initialisation est réduite, les autres éléments étant préalablement fixés.

La procédure Activate se déclenche elle à chaque réaffichage du Userform, j'y ai conservé la commande d'affichage en TextBox du nombre d'éléments de la base. Cependant comme tu n'affichais cette information qu'après Entrée, je l'ai mis sous condition pour qu'elle ne s'affiche pas avant qu'un utilisateur se soit identifié. (La gestion d'erreur répond à la possibilité d'un démarrage avec la base vide...)

J'ai renommé les contrôles qui ne l'avaient pas été et supprimé le bouton Changer, Entrer peut jouer ce rôle en plus du sien...

En suivant le déroulement logique, l'utilisateur doit saisir identifiant et mot de passer et actionner le bouton Entrer : la procédure teste la saisie, si OK appelle la fonction de vérification, si OK encore, le nom de l'entrant est inscrit sur Param. puis une procédure de mise en état du Userform est lancée....

Le bouton jouant aussi le rôle dévolu à Changer, la distinction des deux rôles est faite sur le libellé du bouton : ENTRER au démarrage, et une fois une Entrée réussie, elle devient : Changer d'utilisateur.

Lorsqu'il est actionné en mode Changer, il lance la même procédure qu'indiqué précédemment, nommée RéinitEntrée, avec un paramètre booléen True. Dans le cas Entrer, elle est lancée sans paramètre (il est optionnel), par défaut à False.

La procédure, dans le cas où l'entrée est réalisée (False), efface les TextBox Id et MdP, les masque ainsi que leurs étiquettes, rend visible les bouton Dossiers et Gestion, change le libellé d'Entrer, affiche le nombre de dossiers, et donne le focus au bouton Dossiers.

Si lancée avec True elle fait l'inverse pour remettre le Userform en l'état de faire entrer un utilisateur : effacement du nb de dossiers, masquage boutons Dossiers et Gestion, rend visible les TextBox et étiquettes, rétablit le libellé d'Entrer à ENTRER, met à jour la date de dernier enregistrement et donne le focus au TextBox d'indentification.

A noter que l'appui sur Changer clôt une session d'utilisateur mais n'oblige pas à en ouvrir immédiatement une autre.

La fonction de vérification, qui n'intéresse que ce lot de procédure a été ramenée dans le Userform, et légèrement modifiée pour éviter la multiplicité de renvois de False sur des tests successifs... On cherche la correspondance identifiant - motde passe, si on la trouve, c'est True, sinon renvoi de False.

J'ai substitué une boucle de parcours des identifiants (qui vu la configuration de la feuille ne devraient pas excéder une douzaine, à Find. Dans ce cas de figure la boucle sera plus rapide...

Une autre modification devra être appliquée à cette fonction, après rapatriement dans le userform de la procédures d'affichage des feuilles (qui ne concerne aussi que le même lot de procédures), que j'ai laissé momentanément de côté, et qu'il faut aussi compléter par un remasquage.

Pour la fonction, au lieu de renvoyer une valeur booléenne, elle pourra renvoyer le numéro de ligne (ou 0), lequel pourra être passée à la procédure d'affichage, évitant de le chercher deux fois...

On a fait le tour de la fonction de ce Userform. Dossiers est programmé pour ouvrir un autre, Gestion pas encore programmé. Start étant masqué alors.

Quitter, j'y ai ajouter Unload Me pour fermer proprement...

Je livre donc avec quelques finitions restant à faire, et avant d'avoir testé, donc prudence... et signale-moi les clash (il y en a toujours quelques uns).

Bonsoir,

Merci pour ta patience, mais je n'y comprends rien : impossible de lancer le programme : il plante systématiquement au moment ou j'entre le mot de passe. Comme il n'y a pas de bouton de lancement, je pars du code de START avec F5 et je ne sais pas accéder à la feuille PARAM ultra-cachée. .

Comme ça va être la soirée électorale, je reverrai ça demain matin.

Merci encore.

J'ai rétabli le lancement du Userform à l'ouverture (que j'avais désactivé). J'ai bouclé la prise en charge des feuilles affichage et masquage, sous gestion d'erreur car les feuilles manquent ! sauf PARAM.

Pour les besoins provisoires une proc. dans Module1 affiche ou masque PARAM tour à tour. Il suffit de se positionner dessus, et cliquer sur la petite flèche verte de lancement de l'exécution de macro.

Une chose m'intrigue un peu : on affiche des feuilles, on les remasque... mais ton fonctionnement reposant uniquement sur des Userforms (Userform à l'ouverture, fermeture de l'application à partir du Userform) on n'est jamais dans le classeur, donc les feuilles !

Bonjour,

C'est vrai qu'on a absolument pas besoin de visualiser les feuilles.

Je me posais la question de savoir s'il était préférable de créer de nouvelles feuilles correspondant aux intitulés des prochains UserForm qui contiendront beaucoup d'informations (en alimentant les 3 premières colonnes avec nom, prénom et NumRef (n° unique) lors de la saisie de l'identité) ou d'allonger considérablement les lignes de la feuille de Base. Personnellement la première solution me semblerait plus opportune en permettant une modification plus facile des prochains UserForm.

Merci à MFerrand pour ses conseils avisés;

J'ai réussi à mener à bien mon projet

Bonne journée à tous

Cordialement

nemo1664

Rechercher des sujets similaires à "liste deroulante alimentee textbox combobox"