Microsoft 365 Table répétitive

D.D.

XLDnaute Impliqué
Bonjour à tous,

Je souhaite créer une table répétitive basée, un peu comme une table de vérité, sur des données qui doivent se répéter de façon à créer toutes les combinaisons uniques.

Voir l'exemple ci inclus.
Voyez vous comment faire cela avec formules ?

Merci.
 

Pièces jointes

  • Table répétitive.xlsx
    25.8 KB · Affichages: 11

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir D.D.
Un essai en PJ avec :
VB:
Sub Tableau()
    Application.ScreenUpdating = False
    DLA = [A65500].End(xlUp).Row: DLB = [B65500].End(xlUp).Row
    DLC = [C65500].End(xlUp).Row: DLD = [D65500].End(xlUp).Row
    Taille = (DLA - 1) * (DLB - 1) * (DLC - 1) * (DLD - 1)
    ReDim tablo(1 To Taille, 1 To 4): IndexTablo = 1
    For A = 2 To DLA: For B = 2 To DLB: For C = 2 To DLC: For D = 2 To DLD
        tablo(IndexTablo, 1) = Cells(A, "A"): tablo(IndexTablo, 2) = Cells(B, "B")
        tablo(IndexTablo, 3) = Cells(C, "C"): tablo(IndexTablo, 4) = Cells(D, "D")
        IndexTablo = IndexTablo + 1
    Next D, C, B, A
    Range("H2:K" & Taille + 1).ClearContents
    [H2].Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
End Sub
 

Pièces jointes

  • Table répétitive.xlsm
    27.5 KB · Affichages: 1

vgendron

XLDnaute Barbatruc
un exemple par macro
VB:
Sub distrib()

Dim TabInit() As Variant
Dim TabFinal() As Variant

With ActiveSheet
    TabInit = .Range("A1").CurrentRegion.Value
    temp = 0
    mult = 0
    'on determine le nombre de combinaisons
    For j = LBound(TabInit, 2) To UBound(TabInit, 2)
        temp = 0
        For i = LBound(TabInit, 1) + 1 To UBound(TabInit, 1)
            temp = IIf(TabInit(i, j) <> "", temp + 1, temp)
        Next i
        mult = IIf(mult = 0, temp, temp * mult)
    Next j
    
    'on dimensionne le tableau final
    ReDim TabFinal(1 To mult, 1 To 4)
    
    'on récupère le nombre d'itération pour chaque colonne
    max1 = .Range("A" & .Rows.Count).End(xlUp).Row - 1
    max2 = .Range("B" & .Rows.Count).End(xlUp).Row - 1
    max3 = .Range("C" & .Rows.Count).End(xlUp).Row - 1
    max4 = .Range("D" & .Rows.Count).End(xlUp).Row - 1
    
    'on remplit le tablo final
    ind = 0
    For i = 1 To max1 Step 1
        For j = 1 To max2 Step 1
            For k = 1 To max3 Step 1
                For l = 1 To max4 Step 1
                    ind = ind + 1
                    TabFinal(ind, 1) = TabInit(i + 1, 1)
                    TabFinal(ind, 2) = TabInit(j + 1, 2)
                    TabFinal(ind, 3) = TabInit(k + 1, 3)
                    TabFinal(ind, 4) = TabInit(l + 1, 4)
                Next l
            Next k
        Next j
    Next i
    'on colle le tableau final
    .Range("M2").Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal
End With
End Sub
 

D.D.

XLDnaute Impliqué
bonjour

une question: c'est toujours sur 4 niveaux ? (4 colonnes)
as tu fait une recherche sur le forum? ca doit surement déjà exister. au moins par VBA avec des fonctions récursives..??
Hello

Ca peut être sur plus de colonnes. Jusqu'à 10, donc beaucoup de combinaisons.
Je voulais éviter de passer en VBA, avec juste des formules tarabiscotées.
Et je n'ai pas trouvé grand chose sur le Web, justement.
 

D.D.

XLDnaute Impliqué
Bonsoir D.D.
Un essai en PJ avec :
VB:
Sub Tableau()
    Application.ScreenUpdating = False
    DLA = [A65500].End(xlUp).Row: DLB = [B65500].End(xlUp).Row
    DLC = [C65500].End(xlUp).Row: DLD = [D65500].End(xlUp).Row
    Taille = (DLA - 1) * (DLB - 1) * (DLC - 1) * (DLD - 1)
    ReDim tablo(1 To Taille, 1 To 4): IndexTablo = 1
    For A = 2 To DLA: For B = 2 To DLB: For C = 2 To DLC: For D = 2 To DLD
        tablo(IndexTablo, 1) = Cells(A, "A"): tablo(IndexTablo, 2) = Cells(B, "B")
        tablo(IndexTablo, 3) = Cells(C, "C"): tablo(IndexTablo, 4) = Cells(D, "D")
        IndexTablo = IndexTablo + 1
    Next D, C, B, A
    Range("H2:K" & Taille + 1).ClearContents
    [H2].Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
End Sub
Merci, ca marche bien et j'ai pu l'étendre pour plus de colonnes.
Je voulais en formules, car tout le monde n'a pas accès au VBA ici.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Ca peut être sur plus de colonnes. Jusqu'à 10, donc beaucoup de combinaisons.
Avec 10 colonnes et seulement 4 valeurs par colonnes, cela fera 1048576 combinaisons, donc déjà la limite d' XL en lignes.
avec juste des formules tarabiscotées.
Si elle existe, effectivement la formule sera tarabiscotée.
D'où l'utilisation de VBA dans nos propositions. :)
 

vgendron

XLDnaute Barbatruc
Hello

avec la version jointe, plus besoin des max1 max2... ils sont mis dans un tablo "ValMax"
==> plus de limite du nombre de colonnes pour cette partie la..
la limite intervient ensuite dans les for imbriqués..=> c'est la que devrait intervenir une fonction récursive (qui s'appelle elle meme). mais la.. je ne sais pas faire

qu'entends tu par "tout le monde n'a pas accès au vba?"
 

Pièces jointes

  • Table répétitive.xlsm
    35.5 KB · Affichages: 1

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonjour à toutes & à tous, bonjour @D.D.
Je suis sur mon téléphone, je n'ai pas tout lu les posts, c'est trop galère et je ne peux pas utiliser le VBA.
Mais voici en pièce jointe une solution par formules matricielles dynamiques,
adaptable pour plus de 4 Tableaux.
Tu peux essayer d'ajouter des éléments aux tableau, le résultat s'ajuste automatiquement.
Les formules sont les suivantes :
VB:
=INDEX(Tableau1[A];LET(A;LIGNES(Tableau1[A]);B;LIGNES(Tableau2[B]);C;LIGNES(Tableau3[C]);D;LIGNES(Tableau4[D]);MOD(ENT(SEQUENCE(A*B*C*D;;0)/(B*C*D));A)+1))
VB:
=INDEX(Tableau2[B];LET(A;LIGNES(Tableau1[A]);B;LIGNES(Tableau2[B]);C;LIGNES(Tableau3[C]);D;LIGNES(Tableau4[D]);MOD(ENT(SEQUENCE(A*B*C*D;;0)/(C*D));B)+1))
VB:
=INDEX(Tableau3[C];LET(A;LIGNES(Tableau1[A]);B;LIGNES(Tableau2[B]);C;LIGNES(Tableau3[C]);D;LIGNES(Tableau4[D]);MOD(ENT(SEQUENCE(A*B*C*D;;0)/(D));C)+1))
VB:
=INDEX(Tableau4[D];LET(A;LIGNES(Tableau1[A]);B;LIGNES(Tableau2[B]);C;LIGNES(Tableau3[C]);D;LIGNES(Tableau4[D]);MOD(ENT(SEQUENCE(A*B*C*D;;0));D)+1))
Pour plus de tableaux, il suffit d'adapter le principe ...
Bon courage.
Alain
 

Pièces jointes

  • Table répétitive Attheone.xlsx
    29.5 KB · Affichages: 3
Dernière édition:

D.D.

XLDnaute Impliqué
Bonjour à toutes & à tous, bonjour @D.D.
Je suis sur mon téléphone, je n'ai pas tout lu les posts, c'est trop galère et je ne peux pas utiliser le VBA.
Mais voici en pièce jointe une solution par formules matricielles dynamiques,
adaptable pour plus de 4 Tableaux.
Tu peux essayer d'ajouter des éléments aux tableau, le résultat s'ajuste automatiquement.

Pour plus de tableau, il suffit d'adapter le principe ...
Bon courage.
Alain
Hello,

Super, c'était plus ou moins ce que je cherchais. je vais adapter en conséquence.
Merci beaucoup.
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Re bonjour le fil, re bonjour @D.D.
Voici un exemple avec 8 tableaux structurés à 1 colonnes
Formule pour la 1ère colonne :
VB:
=INDEX(Tableau1;LET(A;LIGNES(Tableau1);B;LIGNES(Tableau2);C;LIGNES(Tableau3);D;LIGNES(Tableau4);E;LIGNES(Tableau5);F;LIGNES(Tableau6);G;LIGNES(Tableau7);H;LIGNES(Tableau8);MOD(ENT(SEQUENCE(A*B*C*D*E*F*G*H;;0)/(B*C*D*E*F*G*H));A)+1))
Formule pour la 2ème colonne :
VB:
=INDEX(Tableau2;LET(A;LIGNES(Tableau1);B;LIGNES(Tableau2);C;LIGNES(Tableau3);D;LIGNES(Tableau4);E;LIGNES(Tableau5);F;LIGNES(Tableau6);G;LIGNES(Tableau7);H;LIGNES(Tableau8);MOD(ENT(SEQUENCE(A*B*C*D*E*F*G*H;;0)/(C*D*E*F*G*H));B)+1))
...
Formule pour la dernière colonne :
(J'ai laissé la division par 1 volontairement pour montrer l'homogénéité des formules)
VB:
=INDEX(Tableau8;LET(A;LIGNES(Tableau1);B;LIGNES(Tableau2);C;LIGNES(Tableau3);D;LIGNES(Tableau4);E;LIGNES(Tableau5);F;LIGNES(Tableau6);G;LIGNES(Tableau7);H;LIGNES(Tableau8);MOD(ENT(SEQUENCE(A*B*C*D*E*F*G*H;;0)/(1));H)+1))
 

Pièces jointes

  • Table répétitive 8 colonnes Attheone.xlsx
    65.9 KB · Affichages: 1

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 182
dernier inscrit
moutassim.amine