Microsoft 365 Table répétitive

  • Initiateur de la discussion Initiateur de la discussion D.D.
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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

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
 
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.
 
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.
 
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. 🙂
 
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

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 tableaux, 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

Dernière édition:
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.
 
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

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
0
Affichages
265
Réponses
3
Affichages
443
Réponses
3
Affichages
631
Retour