Je fais appel aux férus de VBA (pas comme moi, Vbiste autodidacte du dimanche).
Au fil de mes recherches j'ai trouvé dans les ressources un fichier de @Dudu2 (ICI) très pratique.
Je voudrai appliquer son code à plusieurs ComboBox. Mais je ne sais pas utilisé les modules de classe.
J'ai pourtant suivi des tutos en vidéo (l'anglais n'étant pas mon fort) sans comprendre grand chose.
Dernièrement, @patricktoulon a eu la gentillesse de corriger un code trouver sur le net et a dédié une vidéo pour expliquer ce que sont les modules de Classe. J'ai compris dans l'ensemble le principe. Mais ça coince toujours lors de l'écriture du code. Petite cervelle restera petite cervelle
Je ne joins pas de fichier, vous le trouverez en suivant le lien.
re
oui j'ai fais cette erreur jean-marie a corrigé
je vous lais éviter de repasser tout les items en revu en cas de grande liste
perso je corrigerais comme ça
VB:
For i = .ListCount - 1 To Application.Max(.ListCount - 3, 0) Step -1
tout ton code et tes controls fonctionnent dans mon userform
Très très gentil de ta part de venir à mon secours.
Mais je regarderai tout ça demain. Je suis épuisé.
à mon souci d'adaptation des codes, c'est ajouté un autre souci le copier/coller d'une feuille à une autre manuellement ne fonctionne pas dans mon fichier. Et, uniquement ce fichier. Je vais devoir repartir avec un nouveau fichier.
@patricktoulon : Je commence par te remercier tout particulièrement pour ton soutien, aide et explication de "vive voix". Je remercie aussi tous ceux qui m'ont répondus. Et ce, avant de clôturer ce fil.
1 - J'avoue que je n'ai pas pris le temps nécessaire pour bien comprendre tes codes. Un peu pressé pour passer aux tests pour introduire quelques données et passer à la suite du projet (je ne suis qu'au tout début).
2 - Mes grossières erreurs: J'ai fait du copier/coller comme toi à la différence que toi, tu as effectué des modifications manuellement en faisant très attention. Moi, j'ai utilisé l'outil de recherche et remplacement de VBE. Ma connerie, j'ai cliqué sur le bouton "Remplacer Tout" (Balo, Balo).
3 - Dans le code du post 12 (tableau plusieurs colonnes), il n'y avait pas la fonction reliste .
dans ta fonction du post63, il y avait cette ligne de code que j'ai modifié
VB:
If UBound(tbl, 2) = 1 Then tbl = Application.Transpose(tbl) 'ajouter
'au lieu
tbl = Application.Transpose(tbl)
pour injecter dans Combobox.List, si tableau à 1 colonne on le transpose, si tableau plusieurs colonnes sans transposition.
4 - Pour ne pas tout "cassé", j'avais décidé d'utiliser de renommer tes fonctions en 1D et 2D.
Voilà, j'ai fait le tour de mon retour. Je ne te remercierai jamais assez pour ta génial idée d'expliquer tes codes en vidéo, tes codes, ta générosité, ton partage.
Bonjour le Fil
ce que j'ai mis et semble fonctionner
VB:
For i = .ListCount - 1 To 0 Step -1 '.ListCount - 3 ([I]je n'ai pas compris le pourquoi du -3[/I])
If .List(i) = "" Then .RemoveItem (i) Else Exit For
Next
a voir (peut être n'ai je pas compris Lol)
Bonne Journée
Jean marie
Edit : un essai dans le Fichier joint !
re
oui j'ai fais cette erreur jean-marie a corrigé
je vous lais éviter de repasser tout les items en revu en cas de grande liste
perso je corrigerais comme ça
VB:
For i = .ListCount - 1 To Application.Max(.ListCount - 3, 0) Step -1
tout ton code et tes controls fonctionnent dans mon userform
Pièces jointes
fonction listefiltrée pour combo et list(box) 1 ou x colonnes V pat .xlsm
re
oui bonjour Jean-marie
en fait listcount est en base 1 les index sont en base 0
donc si mon listcount est 2 donc item (0) et item(1)
dans la boucle je dois remonter de la fin de la liste de 1 ou 2 items
donc dans la boucle for i(qui est sur le listcount en base 1 je dois enlever le -1 pour le dernier index et aussi 2 pour remonter les deux ietems
le application max sert a choisir 0 si le -3 renvois a index <0 sinon 0 en dur
de cette manière si ma liste est plus longue je ne remonte pas a l'index 0
je remonte juste ce qu'il faut
Merci beaucoup. Effectivement, je suis sur le même fichier. Mais j'ouvre d'autres fichiers mal fait pour récupérer des données.
J'ai voulu en quelques sortes éviter toutes mauvaises surprises.
En effet, les feuilles d'un classeur peuvent être déplacer donc leur index va changer ou leur nom modifié donc le sheet.name ne sera plus bon ainsi que l'index de la feuille dans le code.
Je me suis dit autant utiliser le CodeName.
Mais ThisWorkBook.CodeName planté, je ne comprenais le pourquoi, d'où l'ouverture de la discussion.
De cette dernière, j'ai compris on prend le codename tout court.
re
et pour tout te dire
à y réfléchir on peut simplifier la "reliste"
en enlevant les conditions et dimensionnant le tbl(donc tablo ou tablo2)
a 2 lignes supplémentaires d'office et une colonne supplémentaire
puisque je supprime ce qui est en trop dans le .list après
donc
VB:
Sub reliste(combo As ComboBox, tb As ListObject, ByRef tbl)
Dim i As Integer
tbl = Range(tb.Name).Resize(tb.ListRows.Count + 2, tb.ListColumns.Count + 1).Value
For i = 1 To UBound(tbl): tbl(i, UBound(tbl, 2)) = i: Next
With combo
.List = tbl
For i = .ListCount - 1 To 0 Step -1
If .List(i) = "" Then .RemoveItem (i) Else Exit For
Next
End With
End Sub