Collecter les valeurs d une ligne en fonction d une combox

Sophia78

XLDnaute Nouveau
Bonjour à la communauté,

Je suis nouvelle inscrite, je me permets de vous écrire car après de multiple recherches sur le forum et sur le net je n'ai pas trouvé de réponse, ni de pistes pour mon besoin.
Voilà, j'ai une base de données (Feuil1) où il y a des questions (Colonne E) et des réponses par pays.
Les questions sont triées par Topic et sous Topic (colonne C et D).
Les réponses sont accompagnées de leurs sources dans la colonne d'à côté.

J'ai commencé à créer un userform avec des combox conditionelles qui permettent de choisir une question après avoir défini le Topic et le Sub Topic.
Dans listbox d'en dessous, j'aurais besoin de faire apparaitre les réponses et de les regrouper.
Le nombre de reponse étant changeant, il faudrait que le nombre de colonne le soit également:
C'est à dire avoir en entete des colonnes la réponse et dans le contenu les pays

Je sais que le Forum n'a pas pour vocation de donner des solutions toute faite mais Je vous serai très reconnaissante si quelqu'un pouvait me donner au moins le début d'une piste

Ci joint un extrait de mon fichier.
D'avance, je vous remercie de vos réponses:)
 

Pièces jointes

  • base a clean.xlsm
    45.8 KB · Affichages: 46

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Sophia, bonjour le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :


Code:
Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Sheets("Feuil1") 'définit l'onglet O
TV = O.Range("A2").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
    D(TV(I, 3)) = "" 'alimente le dictionnaire D avec les données ligne I colonne 3 du tableau des valeurs TV
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.Keys 'alimente la ComboBox1 avec la liste des données du dictionnaire D sans doublon
End Sub

Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Me.ComboBox2.Clear 'vide la ComboBox2
Me.ComboBox3.Clear 'vide la ComboBox3
Me.ListBox1.Clear 'vide la ListBox1
If Me.ComboBox1.Value = "" Then Exit Sub 'si la ComboBox1 est effacée, sort de la procédure
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
    'si la données ligne I colonne 3 du tableau des valeurs TV est égale à la valeur de la ComboBox1,
    'alimente le dictionnaire D avec la donnée ligne I colonne 4 du tableau des valeurs TV
    If TV(I, 3) = Me.ComboBox1.Value Then D(TV(I, 4)) = ""
Next I 'prochaine ligne de la boucle
Me.ComboBox2.List = D.Keys 'alimente la ComboBox2 avec la liste des données du dictionnaire D sans doublon
End Sub

Private Sub ComboBox2_Change() 'au changement dans la ComboBox2
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Me.ComboBox3.Clear 'vide la ComboBox3
Me.ListBox1.Clear 'vide la ListBox1
If Me.ComboBox2.Value = "" Then Exit Sub 'si la ComboBox2 est effacée, sort de la procédure
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
    'si la données ligne I colonne 3 du tableau des valeurs TV est égale à la valeur de la ComboBox1,
    'et la données ligne I colonne 4 du tableau des valeurs TV est égale à la ComboBox2
    'alimente le dictionnaire D avec la donnée ligne I colonne 5 du tableau des valeurs TV
    If TV(I, 3) = Me.ComboBox1.Value And TV(I, 4) = Me.ComboBox2.Value Then D(TV(I, 5)) = ""
Next I 'prochaine ligne de la boucle
Me.ComboBox3.List = D.Keys 'alimente la ComboBox3 avec la liste des données du dictionnaire D sans doublon
End Sub

Private Sub ComboBox3_Change() 'au changement dans la ComboBox3
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes)
Dim TL() As Variant 'déclare la variale TL (Tableau des Lignes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)

Me.ListBox1.Clear 'vide la ListBox1
If Me.ComboBox3.Value = "" Then Exit Sub 'si la ComboBox3 est effacée, sort de la procédure
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
    'si la données ligne I colonne 3 du tableau des valeurs TV est égale à la valeur de la ComboBox1,
    'et la données ligne I colonne 4 du tableau des valeurs TV est égale à la ComboBox2
    'et la données ligne I colonne 5 du tableau des valeurs TV est égale à la ComboBox3
    'définit la ligne I, sort de la boucle
    If TV(I, 3) = Me.ComboBox1.Value And TV(I, 4) = Me.ComboBox2.Value And TV(I, 5) = Me.ComboBox3.Value Then LI = I: Exit For
Next I 'prochaine ligne de la boucle
For J = 6 To 26 Step 2 'boucle sur les colonnes 6 à 26 (= F à Z) par pas de deux
    'si la donnée ligne LI colonne J du tableau des valeurs TV n'est pas vide, définit le nombre de colonnes NC
    If TV(LI, J) <> "" Then NC = NC + 1
Next J 'prochaine colonne de la boucle
Me.ListBox1.ColumnCount = NC 'définit le nombre de colonnes de la ListBox1
K = 1 'initialise la variable K
For J = 6 To 26 Step 2 'boucle sur les colonnes 6 à 26 (= F à Z) par pas de deux
    If TV(LI, J) <> "" Then 'condition : si la données ligne LI colonne J n'est pas vide
        ReDim Preserve TL(1 To 2, 1 To K) 'redimensionne le tableau des lignes TL (2 lignes, K colonnes)
        TL(1, K) = TV(1, J) 'récupère dans la ligne 1 colonne K de TL, le pays ligne 1 colonne J de TV
        TL(2, K) = TV(LI, J) 'récupère dans la ligne 2 colonne K de TL, la réponse ligne LI colonne J de TV
        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL
    End If 'fin de la condition
Next J 'prochaine colonne de la boucle
Me.ListBox1.List = TL 'alimente la ListBox1 avec le tableau TL
End Sub
 

Pièces jointes

  • Sophia_v01.xlsm
    50.9 KB · Affichages: 36

Sophia78

XLDnaute Nouveau
Bonjour Robert,

Mille Mercis pour ta réponse, car en plus d'apporter une réponse tu as mis des commentaires, cela m'a permis de comprendre.
Puis-je me permettre de te solliciter encore: ma demande initiale n'était sûrement pas assez précise.
En effet, j'aimerais pouvoir regrouper les pays ensemble par réponse.
par exemple pour la question Q17:


Le top serait d'avoir les réponses marquées en gras et considérées comme titre dans la listbox.
J'espère ne pas trop te déranger et te souhaite une bonne soirée :)
 

Alza

XLDnaute Junior
Bonjour,
Malheureusement la listbox ne gère pas .. Tu ne peux mettre des Header qu'avec la propriété rowsource qui est vraiment pas top .. Si tu veux vraiment tes titres il faut passer par un contrôle listview ou alors alimenter des labels au dessus de ta listbox si tu as un nombre de colonnes fixe c'est le plus simple.

Si tu ne fais aucun traitement mais que de l'affichage sur ta listbox tu peux aussi essayer d'enregistrer tes données sur une feuille puis d'utiliser rowSource
 

Discussions similaires

Statistiques des forums

Discussions
312 361
Messages
2 087 627
Membres
103 608
dernier inscrit
rawane