VOICI UN EXEMPLE D'un classeur avec 3 feuilles
EXEMPLE.xlsx
En attendant voila une trame
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 Option Explicit Private RgnData As Range Private RgnSecteur As Range, iSecteur As Integer Property Let RangeData(Value As Range) 'On pointe la totalité du tableau Set RgnData = RangeData 'On peut également rechercher la position des colonne en fonction des entête 'Et renseigner ces positions dans des variables pour la suite du code 'Utilisable aussi pour configurer le contenu des combobox, comme dans l'exemple de Pierre Fauconnier '... 'C'est sans doute ici qu'il faudra gérer cette histoire de données A B C en ligne ou en colonne 'On recherche le mot Secteur sur la 1ère ligne Set RgnSecteur = RangeData.Rows(1).Find("Secteur", , xlValues, xlWhole, MatchCase:=False) If RgnSecteur Is Nothing Then Exit Property 'On prend en compte uniquement les données sans l'entête Set RgnSecteur = RgnSecteur.Resize(RgnData.Rows.Count - 1).Offset(1) End Property Private Sub ComboBox1_Change() Dim CritSecteur As String, CritLettre As String Dim CellFind As Range, StrAddress As String 'A adapter en fonction des combobox CritSecteur = "Secteur" CritLettre = "A" 'ListBox....clear 'On s'assure qu'un tableau à été précisé If RgnData Is Nothing Then Exit Sub 'On place les entêtes dans le Listbox 'Listbox.additem "Id", "Nom", "Secteur", CritLettre 'On recherche les cellules correspondant au critère Secteur Set CellFind = RgnSecteur.Find(CritSecteur, , xlValue, xlWhole, MatchCase:=False) If Not CellFind Is Nothing Then StrAddress = CellFind.Address Do 'On place les données dans Listbox avec additem en fonction de CritLettre si renseigné '... 'On passe à la suite Set CellFind = RgnSecteur.FindNext(CellFind) Loop While Not CellFind Is Nothing And CellFind.Address <> StrAddress End If End Sub
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et SeulTutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Donc ce qu'il te faudrait, c'est une boucle qui pour chaque feuille de ton classeur, recherche le libellé , et affiche toutes les lignes correspondantes ?Normalement , je voulais quand je clique sur ma Liste déroulante "A" : j'obtient le "Nom1" dans ma LISTBOX1 et en même temps toute la colonne dans ma ListBox2 . sachant que cette variable peut se trouver soit dans feuille2 ou feuille3 ou feuille4.
J'ai pensé à parcourir toutes les feuilles en comparant les entêtes dès qu'il trouve la variable il affiche la colonne . ( j'ai pas su comment écrire le code en VBA ) . Et donc , je me suis dis je ferais ça séparément avec deux listes déroulante : une qui affiche le NOM et l'autre qui affiche la colonne .
Petite question : est-il possible qu'il y est "A" sur plusieurs feuille ?
Je n'ai pas lu attentivement son code, mais je pense que tu peux modifier ce qu'il a écrit "en dur" dans le code par la valeur de ton ComboBox.D'accord maintenant je vois que je dois vraiment lui préciser la variable dans le code et si j'ai 179 variables ? y'a pas moyens de les comparer juste la variable sélectionnée avec les entêtés existants ?
pardon si j'ai mal compris
Par exemple "Secteur" par ComboBox1.Value
Oui c'est ça Wololol
En fait la property Let est utilisée avant l'affichage du UserForm.
Tu fait un truc style
Ce code exécute celui de property Let RangeData. Du cou p c'est ici qu'il faudra traiter ton tableau pour rechercher quelle variable tu veux en plus de ID, Nom, ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 'A rendre dynamique bien sûr... UserForm.RangeData = Range("A1:AZ:623") 'Ou directement le nom du tableau ce qui est l'idéal dans l'absolu
Tu peux même imaginer créer un deuxième Let pour transmettre une liste de critère (A, B, F, G), qui seront ensuite recherchée dans le tableau, si c'est le cas il faudra modifier un peu la structure de base, à toi de dire ce que tu cherche à faire exactement.
Je suis toujours preneur pour les fichiers démo et pour savoir exactement ce que tu souhaites faire, ça évitera de partir dans tous les sens pour au final faire du bricolage pour faire correspondre à ton besoin. Et je ne suis sans doute ps le seul![]()
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et SeulTutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Oui je vais essayer de faire pareil .
Je t'ai déjà passer les fichiers démo je vais les renvoyer iciEXEMPLE.xlsx
Merci beaucoup
Oupss, je l'ai pas vu passer...
Maintenant que je l'ai sous les yeux. Si j'ai bien compris.
- Chaque Feuille de ton fichier exemple représente un classeur excel différents
- Dans Feuille1 Activité | Num | VRB |Lib
- Je suppose que c'est le tableau de départ, celui qui contient le code?
- Je suppose que NUM représente ce que tu nommais dans les autres conversation "SECTEUR"? C'est donc une des données prise en compte dans les combox?
- Le seul lien que je vois avec les autres tableaux c'est VRB, c'est ça?
- Ce sont les valeurs (VRB) que tu utilises pour renseigner ton combobox ?
- Comment fais-tu ensuite pour savoir dans quel classeur sont les données?
- Il faut regarder dans tous les classeurs pour rechercher la valeur VRB choisie?
- Tu sélectionnes qu'une seule valeur VRB par recherche?
- Dans les autres feuille
- Les produits ayant le même NOM, n'ont pas le même ID, normal? Il faut donc ne tenir compte que du NOM?
- Les combo se renseignent comment? C'est toi qui fait la liste ou il doivent se renseigner en fonction du contenu des fichiers?
J'ai du mal à comprendre.
Si tu fais une recherche en précisant NUM et VRB. Hors dans les fichiers, NUM n'apparait que dans le fichier1, pas dans les autres, à quoi sert NUM dans ce cas?
Faut vraiment que tu mettes au clair ce que tu veux, on en est à deux pages de conversation et le cahier des charges n'est toujours pas complet !
Il faut te mettre à notre place, je ne connais pas ton domaine, ce qui te parait évident ne l'ai pas forcement pour moi.
Si je te dis qu'il est logique d'ouvrir le disjoncteur avec d'ouvrir le sectionneur de ligne parce que ce dernier n'a pas de pouvoir de coupure. Pour un électricien ça a du sens, est-ce que ça en a pour toi? Pourtant c'est très simple.
Donc aide nous à comprendre ce que tu fais si tu veux une aide efficace. Un problème bien posé est déjà à moitié résolu, il faut que tu poses ton problème.
++![]()
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et SeulTutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
OUBLIE SECTEUR ET MACHIN PAR CE QUE JE T'ai passé un fichier XL qui ressemble presque aux fichiers que j'ai actuellement de la BDD de l'entreprise.
Ce que je voulais que tu comprenne par mon exemple :
c'est un classeur avec 4 feuilles :
je m’intéresse actuellement qu'à la colonne VRB ( A,B,C,D,E) dans la feuille 1
POURQUOI ?
par ce que maintenant j'arrive à afficher le libelle en sélectionnant une variable dans la COMBOBOX--> ce libelle j'en ai besoin pour indiquer dans quel variable je suis , car si tu remarques bien dans les feuilles 2,3,4 les variables qui sont des cellules dans la feuille 1 deviennent des colonnes avec des valeurs dans les autres feuilles .
Le but est de pouvoir afficher la colonne portant le nom soit de ( A,B,C,D,E) qui se trouve dans l'une des feuilles (feuille 2 ou feuille 3 ou 4 ) .
Par contre si je parle des ID c'est unique pour chaque "NOM" et donc si je fais le filtre par ID je vais automatiquement avoir un seul NOM ! et donc je ne vois pas l’intérêt d'aller plus loin , mais pour pouvoir avoir une liste , certains "NOM" peuvent appartenir au même secteur ( je ne l'ai pas mentionné dans mes tableaux j'ai modifié les fichiers) et donc si "CH1" qui a pour secteur "SECTEUR" et "CH2" qui pour secteur " SECTEUR" ils vont s'afficher ..JUSQU'ICI tout fonctionne ..
Le soucis c'est que j'ai toute la ligne entière c'est à dire j'ai le "ID" "NOM" "SECTEUR" "A" et "B" .
--> PAR CE QUE je test que sur la FEUILLE1 pour l'instant .
Je dois passé à l'étape suivante et l'importante : afficher uniquement la variable concerné ( celle que j'ai sélectionné afin d'afficher le libelle ) sachant que si je sélectionne une variable je dois absolument aller la chercher dans les 3 feuilles ( 2, 3 , 4 ) pas uniquement là ou je test mon script ( FEUILE1) :
par exemple si je sélectionne A qui pour libelle : "J'AIME" --> il va s'afficher dans LISTBOX1 puis normalement dans ma LISTBOX2 je dois obtenir que :
"ID = 1000" "NOM =CH1" "SECT = SECTEUR" "A = 9,9 " ET c'est là ou je bloque !
est ce que j'ai réussi à bien expliquer SVP ?![]()
Salut
Fais des essais et dit moi.
Tu as un travail d'adaptation à faire mais l'architecture du code devrait pouvoir rendre la tâche assez simple.
J'ai mis en commentaire des parties du code, comme par exemple la possibilité de générer la liste des VRB en fonction de ce qui se trouve dans les fichiers data (Feuil2, feuil3,...), plutôt que dans le fichier principal(Feuil1). fAit des essais pour voir les avantage et les inconvénients.
Il y a des améliorations possibles, comme chercher les nom des entêtes dans les tableau plutôt que de mettre en dur leur emplacement, à voir en fonction de la structure de tes bases
[J'ai ajouté un bouton sur Feuil1] Pour lancer le userform, il faut passer par la petit macro que se trouve dans Module1, elle est faite pour être utilisée avec le fichier que tu m'as donné (un des classeurs que tu as mis dans ton message précédent est vide).
Normalement j'ai fait en sorte que l'adaptation soit possible pour utiliser des classeurs différents plutôt que des onglets mais je n'ai pas réfléchi plus que ça aux problématiques que ça pouvait engendrer.
Bonne journée
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et SeulTutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Saluuuuut
Franchement Ton code il est mille fois mieux que le mien je me suis compliqué la vie pour rien..Par contre , j'ai remarqué un truc .. quand je sélectionne le secteur et VRB j'ai le libelle (PARFAIIIT
) puis les données s'affiche dans le LISTBOX (YOUHOUU
) mais si j'essaie de faire de même avec les VRB qui se trouvent dans la colonne " E" c a d , toutes les colonnes qui sont après la colonne "D" --> Aucune données !
J'ai bien sur lis ton code attentivement ( JE PENSE) mais je ne vois pas de problème ...
Merci beaucoup pour ton aide FRANCHEMENT Tu me sauve la vie mais surtout je comprends mieux le VBA!
Bonne journée
Je l'avais disje me suis compliqué la vie pour rien
Je viens de tester ça fonctionne pourtant ?mais si j'essaie de faire de même avec les VRB qui se trouvent dans la colonne " E" c a d , toutes les colonnes qui sont après la colonne "D" --> Aucune données !
@Qwazerty : Pas mal la petite loupe pour la recherche :d
Salut
Ah oui en effet, dans Let ListBook, modifie comme ça
J'ai ajouter des explications sur le pourquoi des tests. Il serait sans doute possible de faire autrement, c'est un possibilité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 With ThisWorkbook.Sheets(Value(iBook)) 'On liste les VRB présents dans ce document 'On pointe les entêtes contenant les VRB For Each CellVRB In .Range("D1", .Cells(1, .Columns.Count).End(xlToLeft)) 'On stock le VRB et la feuille.range qui le contient 'Si aucun VRB présent dans le tableau, alors CellVRB va pointer de C1 à D1, 'C1 étant l'entête "Secteur" et D1 sera donc vide, il faut le prendre en compte If (CellVRB.Address <> "$C$1") And CellVRB.Value <> "" Then DicoVRB.Add CellVRB.Value, CellVRB Next
Cette vérification est fait pour éviter de rentrer n'importe quoi das le dico
Autre chose, modifie le code comme ça (le IF) ça permettra de pouvoir lancer une recherche uniquement en sélectionnant VRB sans préciser de secteur
++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 For Each CellTab In .Range(CellSecteur, .Cells(.Rows.Count, CellSecteur.Column).End(xlUp)) 'On regarde si le secteur correspond ou si aucun filtre n'est présent sur le secteur If (CellTab = CritSecteur) Or (CritSecteur = "") Then 'Si le listbox est vide, on place les entêtes If LBResult.ListCount = 0 Then 'On place les entêtes dans le Listbox
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et SeulTutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Non, si tu sélectionnes "Secteur3" et VRB "B", il n'affiche aucune données. Il y avait bien un problème, les colonnes étaient ignorées, j'avais mis une mauvaise valeur dans un des tests de remplissage d'un des dictionnaires (=$E$1, cf mon message du dessus)
Elle est chouette la loupe hein
c'est ce qui m'a prit le plus de temps à trouver
Bien sûr, il est possible de s'en passer, et de lancer la recherche sur changement de valeur d'un des combo de tri mais attention si le fichier évolue comme je le pense vers la recherche des VRB dans des fichiers différents et avec une grosse quantité de donnée, il vaut mieux faire la démarche de lancement du code manuellement via un bouton.
@ Peerl : D'ailleurs pour la future partie concernant la lecture des données dans les classeurs, ce tutoriel de Silkyroad te sera utile je pense. N'hésite pas à ouvrir un autre fil de discussion si tu as des problème avec cette partie la, ce fil est déjà bien chargé. Au cas ou, n'hésite pas à m'envoyer un MP pour m'indiquer ce nouveau fil.
++
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et SeulTutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
tu peux vérifier stp si j'ai bien modifier ? parceque il arrive pas à remplir COMBOsecteur ni le clique sur la loop
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Property Let ListBook(Value As Variant) 'Liste des feuilles (Classeur à l'avenir?) contenant les tableaux 'Ici on mémorise dans quel feuille/classeur se trouve chaque VRB Dim iBook As Byte Dim CellVRB As Range, CellSect As Range 'On boucle sur value For iBook = LBound(Value) To UBound(Value) 'On Récupère la zone du tableau With ThisWorkbook.Sheets(Value(iBook)) 'On liste les VRB présents dans ce document 'On pointe les entêtes contenant les VRB For Each CellVRB In .Range("D1", .Cells(1, .Columns.Count).End(xlToLeft)) 'On stock le VRB et la feuille.range qui le contient If (CellVRB.Address <> "$C$1") And CellVRB.Value <> "" Then DicoVRB.Add CellVRB.Value, CellVRB Next 'On fait de même pour Secteur For Each CellTab In .Range(CellSecteur, .Cells(.Rows.Count, CellSecteur.Column).End(xlUp)) 'On regarde si le secteur correspond ou si aucun filtre n'est présent sur le secteur If (CellTab = CritSecteur) Or (CritSecteur = "") Then 'Si le listbox est vide, on place les entêtes If LBResult.ListCount = 0 Then 'On place les entêtes dans le Listbox End With Next 'On renseigne CBVRB 'Non utilisé, la list est renseigné directement dansla propriété RowSource du Combobox 'Si tu remplace RowSource par ce code seuls les VRB présents dans les tableaux apparaitront dans la liste 'CBSet DicoVRB = TrierDictionnaireParCle(DicoVRB) 'VRB.List = DicoVRB.Keys 'On renseigne CBSecteur Set DicoSecteur = TrierDictionnaireParCle(DicoSecteur) CBSecteur.List = DicoSecteur.Keys End Property![]()
Oui les modifications semble bonnes, tu passes bien pas le bouton pour lancer le Userform? Si tu le lances directement de VBE en utilisant la touche Run ça ne fonctionnera pas parce que les propriétés (Let) n'auront pas été initialisées (regarde le code dans Module1)
Au cas ou Pièce jointe 378716
++
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et SeulTutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
oui je passe par le Bouton et aussi directement de VBE et c'est la meme chose par contre j'ai remarqué qu'il manquait la déclaration du CellTAB et CellSecteur .
ET maintenant quand je clique sur le bouton sur la feuille pour lancer le USERFORM j'ai une erreur compilation : référence incorrecte ou non qualifié et ça entoure le .ROWS dans :
Excuse moi VRAIMENT ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part For Each CellTab In .Range(CellSecteur, .Cells(.Rows.Count, CellSecteur.Column).End(xlUp))
Partager