Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Je travaille actuellement sur un projet très intéressant de gestion RH et je dois mettre en place différents dashboard et outils de saisies afin de pouvoir développer le modèle avec des personnes n'ayant pas programmé la BDD excel.
Apprenant la programmation VBA par mes propres moyens je bute en ce moment sur différents problèmes.
Voici mon principal problème actuellement:
Je cherche à faire un formulaire de saisie qui reprenne des informations contenue dans une base de données. Voici un exemple dans le fichier joint. Je bloque sur la reprise des informations dans le formulaire. J'aimerais écrire le nom et le prénom dans le formulaire 1 et qu'il aille chercher le poste, horaire et salaire correspondant dans le formulaire 2.
Si vous avez des idées, merci pour votre coup de main.
J'ai modifié mon document avec ta proposition qui en effet simplifie la lecture de celui-ci, cependant, ce n'est pas encore ce que je recherche, j'essaie de m'expliquer:
Dans le formulaire, il y a 2 combobox avec 3 ou 4 textbox.
Sur mon document à moi, j'ai rajouter une 3ème Combobox, qui doit me permettre de réduire les possibilités d'affichages d'informations afin d'éviter les erreurs.
ex: Combobox1: N° de l'étude
Combobox2: Nom de la personne
Combobox3: Prénom de la même personne (pour différencier les couples ou les personnes portant le même nom)
le tout toujours en liaison avec le N° d'étude sélectionné.
Donc en sélectionnant un N° d'étude dans ma cmbx1 j'obtiens le nom des 4 personnes interrogés en cmbx2 qui une fois sélectionné me propose les prénom correspond à ce nom et à cette étude (différencier Marie Durand Et Paul Durand par exemple).
Pour le reste du script tout fonctionne à merveille, les textbox se complètent directement et me permettent une modification, mais m'ont également fait ressortir un problème, car ma une fois mon N°d'étude sélectionné en Cmbx1 je peux sélectionner le Nom en Cmbx2 et aussi en cmbx3 (la cmbx3 agit également sur les texbox) et c'est ce que j'aimerais modifier.
Je ne sais pas si celà est très clair pour vous...
Et je vous remercie pour l'aide que vous pouvez m'apporter, et également pour les connaissances! 😀
Je n'ai pas trop le temps de te le mettre en forme, mais en gros, tu as besoin d'effectuer une recherche multicritères.
Il y a plusieurs possibilités, mais avec la fonction Find, on trouve un jolie petit tutoriel sur le site de Formation Excel VBA JB (il est vraiment excelent ce site, plus j'y vais, plus j'y trouve de merveilles! même s'il y a tellement de choses qu'on s'y perd :s )
ci-joint le tutoriel qui pourra t'aider je pense.
EDIT : il y a aussi une section sympa sur les formulaires avec menus en cascade .... je pense que ça peut t’intéresser.
Je te remercie pour le lien que tu viens de données, c'est une vrai mine d'or pour les débutants comme moi!
J'ai en partie trouvé ce que je cherchais, j'essaie de l'adapter désormais!
Je poste en fichier joint une ébauche de ce que je cherche à faire, peut-ètre pourriez vous m'indiquer mes erreurs (sachant que je suis partie du fichier proposé par Bhbh auparavant)
Mmm, aussitôt penché sur ton fichier, aussitôt arrêté : les noms des combobox, à quoi correspondent-ils? j'avoue que je ne vois pas de colonne avec une en tête qui ressemble à "nom du médecin" ou "prénom du médecin" ... Quelle combobox correspond à quelle liste? (donnes nous le nom de l'entête)
Par ailleurs, bien que ce ne soit pas gênant, tes listes sont un peu mélangées (nom du demandeur : 21/02/2013) était-ce pour tes tests ?
Je n'ai pas fait attention, les noms des colonnes ne correspondent pas en effet, c'était pour tester la fonctionnalité du formulaire.
Il n'y a pas de nom de combobox car j'aimerais par la suite les modifier, car dans mon tableau final, par exemple le nom et le prénom se trouvent en colonne 0 et N, et je ne vois pas comment assigner les combobox sur ces colonnes [je ne trouve pas la ligne de script qui les définis tout simplement (gros débutant)]
Cbbox1= N° étude
Cbbox2= Nom
cbbox3= Prénom
J'aimerais juste être éclairé sur les parties que je dois modifier pour compléter mon fichier,
Et je vous remercie du temps que vous consacrez à mes questions!
Ci-joint 2 versions du fichier.
Une première en mode gros bourrin qui ne gère que la liste des combobox 2 et 3.
Comme je n'aimais pas ma manière de faire (qui je pense te sera quand même instructive) je l'ai refais dans la version 02.
également rajouté en v02 la mise à jour des combobox. (quand tu rentre le nom, ça met à jour la liste des prénoms, et inversement)
Je l'ai mis en forme de manière à te faciliter la vie quand aux colonnes à prendre en compte : tu peux le paramétrer via les constantes de départ offsetcol1 et offsetcol2 qui gèrent respectivement les combobox2 et 3 (oui je sais, j'ai été mal inspiré). Il s'agit bien d'OFFSET par rapport à la colonne A (si tu veux désigner A, il faudra la valeur 0, 2 pour B, 3 pour C etc)
N'hésites pas à me signaler si tu croises des bugs 🙂
Je te remercie dors et déjà pour l'énorme aide que tu m'as apporté, car en effet, grâce à ta proposition je peux enfin définir mes combobox sur les colonnes de mon choix 😎
Cependant, il me reste quelque leger problème;
Je suis partie de ta deuxième version, car dans la première (la mienne que tu as légèrement modifié) il y a un probleme avec la 3ème combobox qui efface les données dans le formulaire.. mais ce n'est pas très grave que je repars avec ta version désormais.
Maintenant dans ta version je n'arrive pas à décaller les cellules propres aux textbox, je m'explique:
Auparavant ma cbbx2 définissait le Nom (colonne pas présente dans le fichier test) en partant de la deuxième colonne du tableau, maintenant une fois mon tableau adapté elle affiche parfaitement la 13ème colonne de mon tableau, cependant la 2ème colonne n'apparait dans aucune des textboxs, et celà même quand je les effaces toutes et que je reprend à zéro..
J'ai essayé de modifer la variable I afin qu'elle commence à la colonne 2 mais sans trop de resultat, je suppose que la manip se situe dans cette partie du script..
Code:
Set Cel = .Find(Me.ComboBox1, LookIn:=xlValues, LookAt:=xlWhole)
If Not Cel Is Nothing Then
FirstAddress = Cel.Address
Do
If Me.ComboBox2 = Cel.Offset(0, offsetCol1).Value And Me.ComboBox3 = Cel.Offset(0, offsetCol2).Value Then
For I = 1 To 6
Me.Controls("TextBox" & I).Value = Cel.Offset(0, I + 1).Value
Me.Controls("TextBox" & I).Enabled = True
Next I
LaLigne = Cel.Row
Exit Do
Else
Set Cel = .FindNext(Cel)
End If
Loop While Not Cel Is Nothing And Cel.Address <> FirstAddress
End If
Peuxè-tu m'éclairer sur ce leger problème?
Il y a également un nouveau probleme que je viens de découvrir, lorsque je sélectionne mon N° étude, Un nom, un Prénom, et que je modifie les textbox (6premières que ta proposition), un décallage se fait dans mon tableau en cliquant sur modifier, et je ne trouve pas le pourquoi du comment de ce décallage..
For I = 1 To 6
Me.Controls("TextBox" & I).Value = Cel.Offset(0, I + 1).Value
Me.Controls("TextBox" & I).Enabled = True
Next I
Ici, l'auteur originale utilise une astuce pour simplifier son code : les noms des textbox se suivent (textbox1, textbox2 etc) et les colonnes qui détiennent les données se suivent également (à savoir les colonnes 2, 3 etc).
L'astuce consiste à utiliser la variable I pour indicer à la fois les textbox et les colonnes de données.
C'est élégant, mais cela repose sur les hypothèses ci-dessus.
Dans ton cas, si j'ai bien compris, les colonnes ne se suivent pas. Tu as donc 2 solutions :
1ere (non conseillée)
Pour ta variable de controle I, tu peux faire comme j'ai fait précédement, avec un
Code:
For each I in array(1, 2, 5, 6) '-- renseigner les colonnes de données
Me.Controls("TextBox" & I).Value = Cel.Offset(0, I + 1).Value
Me.Controls("TextBox" & I).Enabled = True
Next I
Et tu rajoutes à ça d'adapter les noms des textbox à chaque fois que tu fais une modification. C'est lourd, et hyper contraignant.
2eme :
Tu oublies l'astuce d'élégance, et tu y va en mode bourrin. Dans ton cas, je pense que cela sera plus simple.
Code:
For I = 1 To 6
Me.Controls("TextBox" & I).Enabled = True
Next I
Me.Controls("TextBox1").Value = Cel.Offset(0, 1).Value
Me.Controls("TextBox2").Value = Cel.Offset(0, 6).Value
Me.Controls("TextBox3").Value = Cel.Offset(0, 32).Value
Me.Controls("TextBox4").Value = Cel.Offset(0, 27).Value
Me.Controls("TextBox5").Value = Cel.Offset(0, 12).Value
Me.Controls("TextBox6").Value = Cel.Offset(0, 11).Value
Dans ce cas, tu peux choisir d'inscrire les numéros des colonnes en "dur" comme dans l'exemple ci-dessus, soit en passant par une variable que tu déclares au tout début du code (pareil aux offsetCol1). C'est plus souples si tu veux modifier ton codes pour l'adapter à une nouvelle mise en forme (pas besoin de se replonger dans le code si tu donnes des noms explicites à tes variables (genre offsetColNom, offsetColPrénom, ou tout autre expression compréhensible sans même lire le code)
Si tu préfères utiliser des numéros de colonnes absolus (plutôt que relatifs par des offset àpar rapport à la colonne A (donc 1 de différence)) tu peux modifier légèrement le code et remplacer par
Code:
If Me.ComboBox2 = Cel.Offset(0, offsetCol1).Value And Me.ComboBox3 = Cel.Offset(0, offsetCol2).Value Then
LaLigne = Cel.Row '<--------------- Ré-haussé par rapport au code existant
For I = 1 To 6
Me.Controls("TextBox" & I).Enabled = True
Next I
With thisworkbook.sheets("Feuil1")
Me.Controls("TextBoxY").Value = .Cells(LaLigne, MaVariableColonne).Value
End With
Exit Do
Else
Set Cel = .FindNext(Cel)
End If
Attention à bien remonter la déclaration de la variable LaLigne. Ça ne change rien au reste du code, mais permet d'utiliser cette information plus vite 🙂
Problème 2 :
Je vais voir
EDIT :
OK, pas compliqué. L'histoire se situe dans la fonction suivante :
Code:
Private Sub CommandButton1_Click()
With Sheets("Feuil1")
For I = 1 To 6
.Cells(LaLigne, I + 2).Value = Me.Controls("TextBox" & I).Value
Next I
End With
End Sub
Le décalage vient du fait que l'on avais I+3 au lieu de I+2 (correspond aux indices jusque là utilisé) Là, la solution va dépendre de comment tu décides de gérer le 1er problème (personnellement, je préfère travailler avec des variables paramétrables et des numéros de colonnes en absolue.)
Mais en gros, il va juste falloir faire le chemin inverse : au lieu de prendre les valeurs du formulaires pour les mettre dans les textbox, ben faut prendre les valeurs des textbox pour les mettre dans le formulaire.
EDIT2 :
Si tu rencontres des difficultés, postes moi un fichier avec les bonnes entêtes dans les bonnes colonnes, avec ce que tu veux afficher. Je te travaillerai les indices.
je te remercie pour la qualité de tes réponses, qui me permettent enfin de comprendre le pourquoi du comment de la manipulation VBA..
Cependant, il reste un tout petit problème qui m'empèche de concrétiser mon classeur (pour changer!)
Il se situe dans la zone que tu as indiqué dans ton précédent message comme devant être modifier pour que les textbox prennent à leurs tours les valeurs du formulaire.
Code:
Private Sub CommandButton1_Click()
With Sheets("Feuil1")
For I = 1 To 30
.Cells(LaLigne, I + 2).Value = Me.Controls("TextBox" & I).Value
Next I
End With
End Sub
J'ai trouver la solution en modifiant le code de cette facon:
Du coup, en éditant ton message, je ne comprends plus le problème xD
Quoiqu'il en soit, tu l'as réglé et c'est un grand pas 🙂
Alors, tu as choisis d'inscrire tes colonnes en "dur" et par offset ... tout le contraire de ce que je conseillais ... xD bon ben allons y.
Sur tes 30 colonnes traitées, elles se suivent toutes. Du coup, tu peux conserver l'astuce d'élégance pour faciliter la lecture du code. (même si c'est optionnel, et on pourrais même mettre l'extraction en fonction appelée quand nécessaire, mais ça c'est du chipotage pour tes 2 occurrences)
Vis-à-vis du temps reconstitution, c'est normal que ça rame un peu dans ton cas : tu fais 30 accès à la feuille (écriture ou lecture).
Ce sont malheureusement ces accès à la feuille qui sont lents. Je te propose en pièce jointe une alternative en passant par les tableaux (mémoire vive, pas du tout géré dans les feuilles excel qui sont en fait des fichiers compressés).
Le facteur gain de temps entre des accès directs à la feuille et passer par un tableau qui sera copié entièrement dans la feuille est d'environ 200.
Voilà en PJ, j'espère que ça fera ton bonheur 🙂
Edit : PJ supprimée, version corrigée 2 messages plus bas
Oui, pardon, lors de mon édit, j'ai omis de tout corriger, car je n'avais plus aucun problème, mon tableau est à jour et fonctionne parfaitement, et je t'en remercie!
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD