Problème avec ComboBox
Bonjour à tous,
J'ai créer un formulaire de consultation d'une petite base de données.
A l'ouverture du formulaire, j'alimente mon ComboBox (nommé Nom) avec mes noms et prénoms : jusque là pas de souci. Le seul hic se présente quand le ComboBox est vide : mes Textbox, au lieu de se vider eux aussi, se remplissent avec mes entêtes de colonnes (ligne 1). Idem quand je tape des lettres dans le ComboBox pour rechercher un nom : par exemple je tape GU et que je n'ai aucun nom qui commence par GU, les Textbox se remplissent encore avec mes entêtes de colonnes.
Private Sub UserForm_Initialize()
Dim i As String
Dim c As Variant
i = 0
Me.Nom.Clear
For Each c In Range(Sheets("Suivi FI").[C2], Sheets("Suivi FI").[C65000].End(xlUp))
Me.Nom.AddItem
Me.Nom.List(i, 0) = c & " " & c.Offset(0, 1)
i = i + 1
Next c
'Me.Nom.ListIndex = 0
Me.TextBox1.Visible = False
End SubJe ne pense pas que ce soit dans cette partie du code mais plutôt dans :
Private Sub Nom_Change()
Dim ligne As Integer
Dim Commentaire As Comment
ligne = Me.Nom.ListIndex + 2
Me.Unité = Sheets("Suivi FI").Cells(ligne, 1)
Me.Grade = Sheets("Suivi FI").Cells(ligne, 2)
Me.Corps = Sheets("Suivi FI").Cells(ligne, 5)
Me.DES = Sheets("Suivi FI").Cells(ligne, 6)
.....qu'il faut interagir.
Merci d'avance pour ceux qui viendront éclairer ma lanterne.
Bon après-midi et bon week-end.
Bonjour,
Pourrais tu joindre un fichier à ton message, ce n'est pas simple de travailler uniquement sur des codes. Merci
Bonjour
Une idée en passant
Testes ta cellule C2 avant de remplir ta ComboBox
Private Sub UserForm_Initialize()
Dim i As String
Dim c As Variant
i = 0
Me.Nom.Clear
If Sheets("Suivi FI").Range("C2")<>"" Then
For Each c In Range(Sheets("Suivi FI").[C2], Sheets("Suivi FI").[C65000].End(xlUp))
Me.Nom.AddItem
Me.Nom.List(i, 0) = c & " " & c.Offset(0, 1)
i = i + 1
Next c
End If
'Me.Nom.ListIndex = 0
Me.TextBox1.Visible = False
End SubBonjour Wal, Banzai,
Je vais poster un extrait de mon fichier : ce sera peut-être plus simple.
Banzai : j'ai essayé ta proposition mais hélas cela ne fonctionne pas.
Bonne soirée.
Bonsoir,
Quand tu écris la ligne "ligne = Me.Nom.ListIndex + 2" tu dis que le numéro de ligne est égal à la valeur de l'index +2 de ton combobox :
Private Sub Nom_Change()
Dim ligne As Integer
Dim Commentaire As Comment
ligne = Me.Nom.ListIndex + 2
Me.Unité = Sheets("Suivi FI").Cells(ligne, 1)
Me.Grade = Sheets("Suivi FI").Cells(ligne, 2)
Me.Corps = Sheets("Suivi FI").Cells(ligne, 5)
Me.DES = Sheets("Suivi FI").Cells(ligne, 6)
Me.Fin_PPI = Sheets("Suivi FI").Cells(ligne, 7)Le problème est que la valeur ListIndex est égal à -1 quand aucune valeur n'est sélectionner, donc la viariable ligne est égale à 1... Et les textbox se remplissent avec la ligne A. Il faut donc écrire cette condition :
If Nom.ListIndex>-1 Then
' ton code de chargement des textbox
End if
Bonsoir Benoît,
Merci pour ton explication. je viens de tester et cela fonctionne : je n'ai plus les entêtes de colonne dans les TextBox.
Reste juste un petit détail à adapter, s'il te plaît : quand je vide ma ComboBox, les TextBox ne se vident pas et gardent les valeurs du nom précédent. D'où ma question : y a t'il une propriété qui vident tous mes TextBox quand je vide la ComboBox ?
Je pense savoir faire mais un par un et je pense qu'il y a mieux comme par exemple une boucle sur tous les TextBox : je me trompe ?
Merci d'avance et bonne soirée.
Bonjour Criscris11,
Il faut gérer les sélections d'items du combobox de cette façon :
Private Sub Nom_Change()
Dim ligne As Integer, Ctrl As MSForms.Control
Dim Commentaire As Comment
If Nom.ListIndex > -1 Then
' Chargement des TextBox
Else
' Déchargement de TOUS les Textbox
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" Then Ctrl.Value = Empty
Next Ctrl
End If
End SubSans vouloir te donner des conseils, le fait de renommer tous tes controls par un nom qui t'es familié est très bien pour s'y retrouver... Mais te posera probablement des problèmes plus difficile à résoudre ou alors une multiplication de ligne de codes.
Pourquoi ?
Imaginons simplement que tu aies deux ComboBox et que chacun doit charger 10 TextBox et 3 ListBox, combien de lignes de code dois-tu écrire pour charger et décharger les 13 contrôles textbox et listbox ? Une ligne par textbox et au moins 3 lignes par Listbox ? multiplié par deux pour le déchargement des textbox et une ligne par listbox ? On dit donc 32 plus les conditions de chargement déchargement, cela fait plus de 35 lignes... Et si tu pour 50 textbox ? Cela fera certainement beaucoup de lignes...
Dans mon exemple joint, le le fait en 25 lignes, qu'il y ait 13 ou 100 contrôles. Ce n'est qu'une méthode comme une autre.
Tout cela pour te dire qu'il faut souvent savoir être astucieux avec Excel pour le faire travailler à ta place. Et la réponse pour qu'Excel bosse à ta place est le paramétrage.
Si tu paramètres tes colonnes en leur donnant des noms courts en ligne 1 (ligne masquée) et que tu donnes des noms de contrôles (toujours préfixés pour créer des groupes : TxB, CoB, LiB...) en y incluant le nom des colonnes, tu pourras alors charger tous tes textbox et remplir toutes tes lignes en quelques lignes de codes. Par exemple en ligne 1 de la feuille : Nom, Grade, et en nom de TextBox : TxBNom, TxBGrade... Ensuite les boucles se chargent de tout.
Voici le test de chargement-déchargement de 10 textbox et 3 listbox en 24 lignes de code par combobox :
Bonjour Benoît, le forum,
Merci Benoît, non seulement pour avoir donné suite à ma demande mais également pour avoir pris le temps de m'expliquer comment gérer les contrôles d'un formulaire : je prends bonne note de tes précieux conseils.
Encore merci et très bon week-end.
@+.