dionys0s
XLDnaute Impliqué
Bonjour le forum,
je cherche en vain sur Internet (mais peut-être n'utilisé-je pas les bon mots-clé) comment combiner n listes.
Par exemple à partir de 3 tableaux en une dimension (A1.1, A1.2), (A2.1, A2.2) et (A3.1, A3.2), j'obtiendrai un tableau de deux dimensions comme ceci listant toutes les combinaisons possibles alliant les 3 tableaux :
A1.1 | A2.1 | A3.1
A1.1 | A2.1 | A3.2
A1.1 | A2.2 | A3.1
A1.1 | A2.2 | A3.2
A1.2 | A2.1 | A3.1
A1.2 | A2.1 | A3.2
A1.2 | A2.2 | A3.1
A1.2 | A2.2 | A3.2
Je sais que je dois fonctionner de manière récursive mais je n'y arrive pas.
J'en suis là pour le moment, mais j'ai l'impression de m'égarer...
je cherche en vain sur Internet (mais peut-être n'utilisé-je pas les bon mots-clé) comment combiner n listes.
Par exemple à partir de 3 tableaux en une dimension (A1.1, A1.2), (A2.1, A2.2) et (A3.1, A3.2), j'obtiendrai un tableau de deux dimensions comme ceci listant toutes les combinaisons possibles alliant les 3 tableaux :
A1.1 | A2.1 | A3.1
A1.1 | A2.1 | A3.2
A1.1 | A2.2 | A3.1
A1.1 | A2.2 | A3.2
A1.2 | A2.1 | A3.1
A1.2 | A2.1 | A3.2
A1.2 | A2.2 | A3.1
A1.2 | A2.2 | A3.2
Je sais que je dois fonctionner de manière récursive mais je n'y arrive pas.
J'en suis là pour le moment, mais j'ai l'impression de m'égarer...
VB:
Public Function Combin(ParamArray ArgList() As Variant) As Variant
Dim Elt As Variant, Bool As Boolean, x As Long, Rslt() As Variant
For Each Elt In ArgList
If Bool Then
x = x * (UBound(Elt) - LBound(Elt) + 1)
Else: Bool = True: x = UBound(Elt) - LBound(Elt) + 1: End If
Next Elt
ReDim Rslt(1 To x, LBound(ArgList) To UBound(ArgList))
sCombin Rslt, 1, LBound(ArgList), ArgList
End Function
Private Sub sCombin(ByRef Rslt() As Variant, ByVal i As Long, ByVal j As Long, ParamArray ArgList() As Variant)
Dim Elt As Variant, SubElt As Variant
For Each Elt In ArgList
' If VBA.IsArray(Elt) Then
' For Each SubElt In Elt
' sCombin Rslt, i, j, SubElt
' Next SubElt
' Else
' Stop
' MsgBox Elt
' End If
Next Elt
End Sub