Extraire plusieurs résultats d'une plage en fonction d'un test

Alex444

XLDnaute Nouveau
Bonjour,

ma 1ère question sur ce forum :)

Avant toute chose, je n'ai jamais mis les mains dans VBA donc j'espère pouvoir me dépatouiller de ma question sans ça avec les fonctions Excel ^^

Voici mon problème... plusieurs heures que je tourne en rond avec ça et que j'épluche Google ^^:

Je crée un fichier automatisé pour un jeu de stratégie.

Colonne A: une liste de compétences (une quinzaine en tout sur le fichier complet)
Colonne B, C, D etc.: pour chaque troupe la mention "oui" lorsque la troupe a la compétence correspondante de la colonne A.

Puis tout en bas, je souhaiterais idéalement lister l'ensemble des compétences de la troupe sur 5 lignes distinctes (chaque troupe a 5 compétences maximum).

Ci-joint un fichier avec un exemple de données d'entrée et ce que j'aimerais récupérer en sortie...

Là je cale... :confused:

Alex. :)
 

Pièces jointes

  • Description_besoin_concaténer_plusieurs_résultats.xlsx
    9.7 KB · Affichages: 31

Modeste

XLDnaute Barbatruc
Re : Extraire plusieurs résultats d'une plage en fonction d'un test

Bonjour Alex444 et bienvenue,

En B11, essaie de coller la formule suivante:
Code:
=SIERREUR(INDEX($A$3:$A$8;PETITE.VALEUR(SI(B$3:B$8="oui";LIGNE($A$3:$A$8)-2);LIGNES($1:1)));"")
Attention: n'appuie pas ensuite sur la touche Enter pour valider, mais sur la combinaison Ctrl+Shift+Enter (des accolades devraient "encadrer" la formule ... qu'on appelle dans ce cas une "formule matricielle"). Recopie ensuite en bas et à droite.

Attention (bis): la formule teste l'existence d'un "oui" dans les cellules de ton tableau vert. La mention "Soins" en D7 ne provoque donc pas l'apparition de cette compétence en D14. Inscris "oui" en D7 et définis une validation de données sur ton tableau vert pour que l'utilisateur ne puisse encoder que "oui " ou ... rien
 

Alex444

XLDnaute Nouveau
Re : Extraire plusieurs résultats d'une plage en fonction d'un test

Ça fonctionne!

Merci beaucoup :)
J'avais complètement oublié cette possibilité de faire des formules matricielles...
Je vais éplucher la formule pour essayer de comprendre comment elle est construite et surtout ça me donne plein d'autres idées pour le reste de mon fichier!

Génial et encore merci :)))

Alex.
 

gosselien

XLDnaute Barbatruc
Re : Extraire plusieurs résultats d'une plage en fonction d'un test

Les formules matricielles sont très gourmandes en ressources mémoire...
Parfois, c'est plus intéressant sur une grand nombre de données de faire ça par vba :)

P.
 

klin89

XLDnaute Accro
Re : Extraire plusieurs résultats d'une plage en fonction d'un test

Bonsoir le forum :)

Pour le fun :p
VB:
Sub test()
Dim a, b(), i As Long, j As Long, n As Long, cpt As Long, maxcpt As Long
    a = Range("a1").CurrentRegion
    ReDim b(1 To UBound(a, 1) - 2, 1 To UBound(a, 2))
    For i = 2 To UBound(a, 2)
        n = 0: cpt = 0
        For j = 3 To UBound(a, 1)
            n = n + 1
            If a(j, i) <> "" Then
                cpt = cpt + 1
                If cpt > maxcpt Then
                    b(j - 1 - n, 1) = "Comp" & j - 1 - n
                End If
                b(j - 1 - n, i) = a(j, 1)
                n = n - 1
            End If
        Next
        If maxcpt < cpt Then maxcpt = cpt
    Next
    Range("a" & Rows.Count).End(xlUp)(3).Resize(maxcpt, UBound(b, 2)) = b
End Sub
klin89
 

klin89

XLDnaute Accro
Re : Extraire plusieurs résultats d'une plage en fonction d'un test

Re,

Moins tordu :rolleyes:
VB:
Sub test()
Dim a, b(), i As Long, j As Long, n As Long, maxcpt As Long
    a = Range("a1").CurrentRegion
    ReDim b(1 To UBound(a, 1) - 2, 1 To UBound(a, 2))
    For i = 2 To UBound(a, 2)
        n = 0
        For j = 3 To UBound(a, 1)
            If a(j, i) <> "" Then
                n = n + 1
                If n > maxcpt Then
                    b(n, 1) = "Comp" & n
                End If
                b(n, i) = a(j, 1)
            End If
        Next
        If maxcpt < n Then maxcpt = n
    Next
    If maxcpt > 0 Then
        Range("a" & Rows.Count).End(xlUp)(3).Resize(maxcpt, UBound(b, 2)) = b
    Else
        MsgBox "Aucune donnée"
    End If
End Sub
klin89
 

Discussions similaires

Statistiques des forums

Discussions
311 726
Messages
2 081 955
Membres
101 852
dernier inscrit
dthi16088