Produit Cartésien

Philem

XLDnaute Nouveau
Bonjour,
après avoir navigué sur plusieurs forums sans trouver de réponse, je me résous à poster ma question sur le meilleur d'entre eux.

Je cherche une solution pour effectuer le produit cartésien de deux listes de valeurs.
Dans mon exemple ci-joint, les données sources sont en colonne A et B.
Je cherche le moyen de constituer le résultat indiqué en colonnes C et D.
Le pincipe : pour chaque donnée de la colonne A, on crée un couple avec chacune des données de la colonne B.

Quelques élements supplémentaires :
- le nombre de Référence - ici limité à 4 - sera variable et régulièrement supérioeur à 500
- le nombre de Valeur - ici limité à 4 - sera également variable ; généralement compris entre 1 et 10.
- je n'ai pas de contrainte sur la position des des données sources et du résultat. Une soluce qui nécessiterait que chacune des listes soit sur une feuille différente me conviendrait également.

Je vous remercie pour le temps que chacun d'entre vous pourra consacrer à ma question.
Je reste connecté pour vous apporter rapidement les informations complémentaires qui vous seraient nécessaires.
Cordialement
Philippe
 

Pièces jointes

  • Produit cartésien.xls
    27.5 KB · Affichages: 265
  • Produit cartésien.xls
    27.5 KB · Affichages: 257
  • Produit cartésien.xls
    27.5 KB · Affichages: 265

Softmama

XLDnaute Accro
Re : Produit Cartésien

Bonjour,

Vois si le fichier joint correspond à tes attentes...
VB:
Dim tabloRéf, tabloVal
Dim t#, u#, Lig#
tabloRéf = Range("A3:A" & Range("A65536").End(xlUp).Row).Value
tabloVal = Range("B3:B" & Range("B65536").End(xlUp).Row).Value
Lig = 3
For t = LBound(tabloRéf) To UBound(tabloRéf)
    For u = LBound(tabloVal) To UBound(tabloVal)
        Cells(Lig, 5) = tabloRéf(t, 1)
        Cells(Lig, 6) = tabloVal(u, 1)
        Lig = Lig + 1
    Next u
  Next t
 

Pièces jointes

  • Produit cartésien.xls
    45.5 KB · Affichages: 410
  • Produit cartésien.xls
    45.5 KB · Affichages: 422
  • Produit cartésien.xls
    45.5 KB · Affichages: 427

JNP

XLDnaute Barbatruc
Re : Produit Cartésien

Bonjour le fil :),
J'avais mal lu, j'avais cru que tu souhaitais 500 lignes et 10 colonnes :D, donc j'ai fait par formule jusqu'à 3 colonnes, mais finalement, les 2 colonnes devraient te suffire :rolleyes:...
Bonne journée :cool:
 

Pièces jointes

  • Produit cartésien(1).xls
    97.5 KB · Affichages: 615

Philem

XLDnaute Nouveau
Re : Produit Cartésien

Softmama, JNP,
Vous avez résolu le problème tous les deux.
Je n'ai plus qu'à choisir entre la macro et la formule.
Merci beaucoup pour votre réactivité !
Bonne fin de journée et à bientôt sur le forum
 

cleopatre

XLDnaute Nouveau
Re : Produit Cartésien

Bonjour le fil!!
Je viens vers vous puisque j'ai presque les memes besoins de "Philem" avec quelques spécificités.
Je souhaite à partir de mes données de réference qui se trouvent à l'onglet "données Ref":Colonne A, B Et C faire un produit cartésien de mes trois listes de valeurs dans l'onglet "BD" de mon fichier.
j'ai essayé d'adapter le programme proposé par Softmama et ça marcher mais quand une de mes colonnes de réference comporte une seule valeur (c'est qui est le cas dans mon exemple Colonne A), le programme se plante. Il mesort comme message d'erreur:
Erreur d'éxécution'13': Incompatibilité de type
Je sais qu'il s'agit d'un petit astuce mais je bloque
Ci dessous le programme que j'ai essayé de mettre en place mais qui marche toujours pas!!


Private Sub CommandButton1_Click()
Dim BD As Worksheet
Set BD = Sheets("BD")
Dim ref As Worksheet
Set ref = Sheets("Données Ref")
Dim tabloRéf, tabloVal, tablotype
Dim t#, u#, Lig#, v#
tabloRéf = ref.Range("A3:A" & Range("A65536").End(xlUp).Row).Value
tabloVal = ref.Range("B3:B" & Range("B65536").End(xlUp).Row).Value
tablotype = ref.Range("C3:C" & Range("C65536").End(xlUp).Row).Value
Lig = 3
If UBound(tabloRéf) > 1 Then
For t = LBound(tabloRéf) To UBound(tabloRéf)
For u = LBound(tabloVal) To UBound(tabloVal)
For v = LBound(tablotype) To UBound(tablotype)
BD.Cells(Lig, 5) = tabloRéf(t, 1)
BD.Cells(Lig, 6) = tabloVal(u, 1)
BD.Cells(Lig, 7) = tablotype(v, 1)
Lig = Lig + 1
Next v
Next u
Next t
Else
t = 1
For u = LBound(tabloVal) To UBound(tabloVal)
For v = LBound(tablotype) To UBound(tablotype)
BD.Cells(Lig, 5) = tabloRéf
BD.Cells(Lig, 6) = tabloVal(u, 1)
BD.Cells(Lig, 7) = tablotype(v, 1)
Lig = Lig + 1
Next v
Next u
End If
End Sub

Merci d'avance!!
 

Pièces jointes

  • Produit cartésien.xlsm
    19.3 KB · Affichages: 158

Discussions similaires

Réponses
4
Affichages
226

Statistiques des forums

Discussions
312 490
Messages
2 088 881
Membres
103 981
dernier inscrit
vinsalcatraz