8 lettres : comment afficher toutes les combinaisons

Bonjour tout le monde,

Je suis confronté à un pépin au boulot. Après quelques recherches j'ai trouvé pas mal de topic sur mon sujet, j'ai essayé de reprendre les formules et de les adapter mais rien à faire je suis forcer d'admettre que c'est encore (largement) hors de portée pour moi.

Voilà mon objectif :

Je vends 8 types de produit différents : A, B, C, D, E, F, G, et H

> 8 colonnes : une colonne pour un produit

Le panier de mes clients peut contenir de 1 à 8 fois le même produit

>1 ligne une combinaison de 8 chiffres (un par colonne) compris entre 1 et 8

>J'ai donc n lignes correspondant pour chacune à une composition unique du panier

Il faudrait que j'arrive à avoir une matrice ou serait affiché l'ensemble des combinaisons possible.

Merci par avance pour votre aide !

N'hésitez pas à me dire si plus de précisions sont nécessaires.

Jalil

Bonjour Jalil,

J'ai besoin de quelques précisions,

Jalil a écrit :

>1 ligne une combinaison de 8 chiffres (un par colonne) compris entre 1 et 8

laquelle des propositions est correcte:

Chaque produit peut être acheté de 1 à 8 exemplaires, et tu possèdes 8 types de produits différents.

Donc un panier est forcément au moins composé d'un article de chaque type (partie qui me semble bizarre), et peut aller jusqu'à 8 fois chaque produit, soit 64 articles dans le panier (partie qui me semble aussi bizarre)

( -> 16777216 possibilités)

OU

Au total un panier est composé de 1 à 8 article. Parmi ces articles on peut avoir des articles similaires.

( -> 255 possibilitées)

Bonsoir d3d9x,

Merci pour ta réponse !

En effet il y a une faute dans ce ce que j'ai écrit

Donc un panier est forcément au moins composé d'un article de chaque

Un produit peut ne pas être dans le panier

Seule limite la plus petite commande contient au moins 1 produit

et peut aller jusqu'à 8 fois chaque produit, soit 64 articles dans le panier (partie qui me semble aussi bizarre)

Une commande de 64 unités est impossible mais en revanche l'ajout de 8 fois le même produit dans le panier est un cas courant.

La solution serait de limiter le nombre de combinaisons en excluant tous les paniers de plus de 8 produits.

Thx !

Cadeau. Me suis loupé sur le nombre de combinaisons!

https://www.cjoint.com/c/FEgwssUXORF

Si la réponse te satisfait merci de marquer le post comme résolu =)

Un grand merci !!

#EDIT C'est good, je n'avais pas vu que tu l'avais laissé

Je ne sais pas si ça se fait mais il serait possible d'avoir la macro que tu as utilisée ?

J'aimerai bien essayer de bosser dessus.

Encore merci !

Bonne soirée !

Sub test()

Dim p1%, p2%, p3%, p4%, p5%, p6%, p7%, p8%
'écriture simplifiée de Dim p1 as Integer, etc....

Dim numLigne As Integer
numLigne = 1

For i = 1 To 8 'un panier ne peut pas excéder 8 éléments
    For p1 = 0 To i
        For p2 = 0 To i - p1
            For p3 = 0 To i - p1 - p2
                For p4 = 0 To i - p1 - p2 - p3
                    For p5 = 0 To i - p1 - p2 - p3 - p4
                        For p6 = 0 To i - p1 - p2 - p3 - p4 - p5
                            For p7 = 0 To i - p1 - p2 - p3 - p4 - p5 - p6
                                For p8 = 0 To i - p1 - p2 - p3 - p4 - p5 - p6 - p7
                                    If p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 > 0 And p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 < 9 Then
                                        Cells(numLigne, 1) = p1
                                        Cells(numLigne, 2) = p2
                                        Cells(numLigne, 3) = p3
                                        Cells(numLigne, 4) = p4
                                        Cells(numLigne, 5) = p5
                                        Cells(numLigne, 6) = p6
                                        Cells(numLigne, 7) = p7
                                        Cells(numLigne, 8) = p8
                                        numLigne = numLigne + 1
                                    End If
                                Next p8
                            Next p7
                        Next p6
                    Next p5
                Next p4
            Next p3
        Next p2
    Next p1
Next i

End Sub

Salut !

Ça commence à devenir plus clair ! Thx

Que faire pour le cas suivant, disons qu'il est possible qu'un client fasse un panier

  • avec 5 fois le même produit
  • J'arriverai donc avec un panier max de 40 produits

Si j'applique cette nouvelle règle ton code cela donne

For i = 1 To 40 

J'étends la taille max de mon panier à 40

Mais par contre je voudrai que la limite de la combinaison max ne soit pas fixée par le panier max mais par le nombre d'occurrence max d'un produit A dans mon panier. En soit je veux lui dire que tu peux avoir un panier de 40 produits mais que tu ne peux pas avoir 40 fois le même produit dans ton panier : pour un panier max à 40 ma seule combinaison possible sera 5 produit de chaque type.

Enfin je pense être limité par les capacité d'excel à traiter des entier. Je crois avoir trouvé 2-3 tips. Selon toi est ce que je peux m'affranchir de cette limite en utilisant un autre type de variable tel que As Long ?

Merci

Attention, avec 8 elements dans le panier le programme est long. Avec 50 elements se sera mega hyper long, avec des millions de combinaisons. Là il faudra revoir ton besoin. Quel est l'interet d'avoir toutes les combinaisons sur autant de produits? passer numLigne en long n'empechera pas le programme de planter!

Si tu en as vraiment besoin il faudrait un nouveau code.

Bonjour,

Et salut d3d9x !

Es-tu sûr que tu veux lister tous les paniers de 1 à 40 produits ?

Je viens de compter : 37 680 119

Je ne tenterais pas !

Cordialement.

Salut MFerrand, la formule que tu as utilisé m'interesse!

Oui le nombre de combinaisons est phenomenale. De plus, Excel est limité à 1million de lignes, il faudrait donc 36 feuilles, et un fichier de plusieurs Mo qui serait impossible a ouvrir.

Oh M****e !!!

Oui on va oublier cette méthode haha

Mon objectif est d'avoir toutes les compositions de commandes :

  • V1 : où je perds de l'argent. A partir de la valeur de leur panier moyen et je déterminerai un montant de frais de livraison capable de les rendre rentables.
  • V2 : où je gagne de l'argent : pour déterminer à partir de quand je peux me permettre d'offrir les frais de livraison

Note : mes coûts variables vont de la commission pris sur le CA et le volume de transaction au poids de mes produits qui impact les frais postaux.

En gros en out-put de la matrice que je souhaite j'obtiendrai deux variables qui seront l'unes de mes variables d'ajustement pour piloter la marge de ma boutique.

Je sais qu'il est impossible d'avoir des commandes de 50 produits. En revanche je peux me retrouver avec des commandes de cette forme (les produits que je vends ont une valeur faible je mise donc sur une strat de volume)

- 5A 3B 1C 2D 5E 1F 0H = 17 produits

En terme de combinaisons ça peut en faire un paquet, mais si on limite le nombre max de produit du même type à 5 on pourra supprimer toutes les combinaisons avec 6,7,8...16,17 produit du même type

Pas de formule directe... J'ai utilisé la même méthode que pour les dés !

Mais il me semble que tu avais une formule...

Le problème est analogue aux probabilités de total de 8 dés à 9 faces (0 à 8).

Avec les probabilités de chaque résultat de 0 à 64, on prélève la somme des probabilités de 1 à 40.

Pour le total 0 à 64, j'obtiens : 43 046 721 qui correspond bien à 9^8.

Le probleme n'ests pas que sur l'ecriture, meme si on limite les cas retenys, ces derniers seront quand meme calculés, mais ignorés

Ok je comprends.

Je vais utiliser la première macro au final

Merci pour ton aide.

A +!

Bonjour,

En travaillant à partir de ce code (voir code original en bas du post) je me suis aperçu qu'il y avait une erreur.

En fait chaque combinaison possible apparaît deux fois.

En réduisant le volume de valeur traitées j'ai aussi constaté certaines combinaisons manquaient :

Ex pour un panier max de 4 produits avec 2 produits différents je devrais avoir :

1:1 - 1:0 - 0:1 et 2:2 - 2:0 - 0:2

mais à la place j'ai

1:1 - 1:0 - 0:1 et 1:1 - 2:0 - 0:2 => Avec la combinaison 1:1 en doublon

Est que vous pourriez m'aider à contourner ce problème svp.

Merci par avance

Code original :

Sub test()

Dim p1%, p2%, p3%, p4%, p5%, p6%, p7%, p8%
'écriture simplifiée de Dim p1 as Integer, etc....

Dim numLigne As Integer
numLigne = 1

For i = 1 To 8 'un panier ne peut pas excéder 8 éléments
   For p1 = 0 To i
        For p2 = 0 To i - p1
            For p3 = 0 To i - p1 - p2
                For p4 = 0 To i - p1 - p2 - p3
                    For p5 = 0 To i - p1 - p2 - p3 - p4
                        For p6 = 0 To i - p1 - p2 - p3 - p4 - p5
                            For p7 = 0 To i - p1 - p2 - p3 - p4 - p5 - p6
                                For p8 = 0 To i - p1 - p2 - p3 - p4 - p5 - p6 - p7
                                    If p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 > 0 And p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 < 9 Then
                                        Cells(numLigne, 1) = p1
                                        Cells(numLigne, 2) = p2
                                        Cells(numLigne, 3) = p3
                                        Cells(numLigne, 4) = p4
                                        Cells(numLigne, 5) = p5
                                        Cells(numLigne, 6) = p6
                                        Cells(numLigne, 7) = p7
                                        Cells(numLigne, 8) = p8
                                        numLigne = numLigne + 1
                                    End If
                                Next p8
                            Next p7
                        Next p6
                    Next p5
                Next p4
            Next p3
        Next p2
    Next p1
Next i

End Sub

Désolé je me suis simplement trompé sur ma condition, par contre ça ne résout qu'un problème sur 2, j’investigue.

Sub test()

Dim p1%, p2%
'écriture simplifiée de Dim p1 as Integer, etc....

Dim numLigne As Integer
numLigne = 1

For i = 1 To 4 'un panier ne peut pas excéder 4 éléments
  For p1 = 0 To i
        For p2 = 0 To i - p1
            If p1 + p2 = i Then
            Cells(numLigne, 1) = p1
            Cells(numLigne, 2) = p2
            numLigne = numLigne + 1
            End If
        Next p2
    Next p1
Next i

End Sub

EDIT: Avec ce code toutes les combinaisons que tu dois trouver sont trouvées. D'ailleurs il y a des combinaisons que tu ignores. Le code fonctionne donc sans problème.

Rechercher des sujets similaires à "lettres comment afficher toutes combinaisons"