Boucle VBA Pour afficher des données totales

mamarus

XLDnaute Junior
Bonjour,


J'ai fait appel il y a quelque temps de cela au forum et n’étant pas spécialiste de VB sous Excel, je recherchai et trouvé une personne qui a pu répondre à ma demande dont voici le détail :

Cela concernait quelque chose qui ressemble au loto sportif à 7 , Sachant que nous avons pour chaque match, 3 possibilités le 1, le N, et le 2, Je souhaité voir apparaître l’ensemble des combinaisons possibles pour 5 matchs ( de M1 à M5 ) .

Nombre de combinaisons possibles : 3x3x3x3x3 = soit 243 combinaisons à faire apparaitre

Ma demande d’aujourd’hui reprend la même chose, mais pour les 7 matchs soit :

3X3X3X3X3X3X3 = 2187 combinaisons

En VB cela doit correspondre à une boucle, je pense .

Voici le Rendu final que cela doit donner en affichage sur une feuille d'excel

M1 M2 M3 M4 M5 M6 M7

1 1 1 1 1 1 1

1 1 1 1 1 1 N

1 1 1 1 1 1 2

1 1 1 1 1 N 1

Etc …… jusqu’à la 2187 ème combinaisons


Si quelqu’un peut me dépanner, d’avance Merci



Mamarus
 

VDAVID

XLDnaute Impliqué
Re : Boucle VBA Pour afficher des données totales

Bonjour Mamarus,

Question intéressante :)

Un test en P.J.

J'ai raisonné par match en calculant un ratio du nombre d'itérations par match:

Ce ratio est calculé comme ceci:

(Nombre total de possibilitées)/(Nombre de valeurs possibles par cases^N° de la colonne)


Du coup tu peux faire varier le nombre de matchs où le nombres de valeurs possibles pour chaque match à volonté !

Le code:

Code:
Sub Données()
Application.ScreenUpdating = False
Application.Calculation = xlManual
t = Timer
Dim tabl()

Possi = 3
Nbcolonne = 7
Nbtotal = Possi ^ Nbcolonne

ReDim tabl(2)

tabl(0) = 1
tabl(1) = "N"
tabl(2) = 2

Dim i&, j&, k&

    For k = Nbcolonne To 1 Step -1
    j = 0
    Ratio = (Nbtotal / (Possi ^ k))
    

        For i = 1 To Nbtotal
        
            If j > 2 Then
            j = 0
            End If

        Cells(i, k).Value = tabl(j)

            If i Mod Ratio = 0 Then
            j = j + 1
            End If
            
        Next i

    Next k
    MsgBox ("Temps écoulé " & Timer - t & " secondes")
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
End Sub

Voir la pièce jointe

Bonne journée !
 

Pièces jointes

  • Donnéeentier.xls
    212.5 KB · Affichages: 87

mamarus

XLDnaute Junior
Re : Boucle VBA Pour afficher des données totales

Bonjour,

Tout d'abord merci pour le travail effectué, c'est très sympa de ta part de t'être intéressé à ce problème et le résultat est celui que je désiré.

cependant le fait de faire varier les matchs et les conditions est en fait le but recherché, avec le détail des combinaisons données, je dois filtrer ensuite à la main selon certaines conditions ( pas les matchs , nous restons toujours à 7 matchs ) les grilles données.

je me posai la question de savoir si c'était possible de le faire sur VBA, j'ai conscience que c'est super coton, mais est ce faisable de créer une sorte de systèmes réducteurs en variant les demandes , demandes qui seront renseignés par l'utilisateur, un exemple de l'approche finale sera plus claire je pense.

Exemple : ( en sachant que nous avons 7 matchs )
A:
critère demandé : DU match 1 au match 4 <== choix renseigné par l'utilisateur , mais cela peut être match 1 à 3 ou autre ...
Nombre de possibilités : 3 ( sous entendu 1 N 2 ) choix renseigné par l'utilisateur
Spécificité : Avoir qu'un seul "1" dans chaque grille (pour les matchs 1 à 4) choix renseigné par l'utilisateur
ex: 1 N N 2
2 1 N N
N N N 1
etc....
Fin du A:

Nous recommençons le A, jusqu'à concurrence de nos 7 matchs, si on suit l'exemple cela peut par exemple donner pour la suite :

critère demandé : DU match 5 au match 6 <== toujours choix que l'utilisateur renseignera
Nombre de possibilités : 2 ( sous entendu 1 N )
Spécificité : Avoir qu'un seul "1" dans chaque grille (pour les matchs 5 à 6)

et enfin le match N° 7:

critère demandé : match 7 <== toujours choix que l'utilisateur renseignera (pour les 3)
Nombre de possibilités : 3 ( sous entendu 1 N 2 )
Spécificité : Aucune sous entendu 1 triple sec sans conditions.

D'après le travail de filtre qui sera fait, si je le faisais sur le papier, on procédera d'abord en 1èr ou en 2ème ( peu importe l'ordre ) par éliminer toutes les grilles dont les matchs 5 et 6 auront un 2 , puisque pas demandé.
Ensuite les grilles ou les matchs 1 à 4 auront plus de 1 "1" ( puisqu'elles ne sont pas dans la condition )
Voici un exemple que cela pourrait donné au final :

1 N N 2 1 N 1
N N 1 2 N 1 N
2 2 N 1 1 N 2

etc ...

Voilà le résultat espéré, quand je t'avais dit que c'était coton !!!

Je sais pas si c'est faisable.

Merci par avance de t’intéresser à la chose.

Cordialement;

Mamarus
 

job75

XLDnaute Barbatruc
Re : Boucle VBA Pour afficher des données totales

Bonjour mamarus, VDAVID, le forum,

Voici 2 fichiers avec leur macro dans Module1 (Alt+F11).

Le 1er fichier établit la liste des 2187 combinaisons.

Intéressant de noter que la macro convertit en base N (=3) les nombres de 0 à 2186.

Le 2ème fichier filtre cette liste en utilisant les critères crit1 et crit2.

On obtient ainsi 432 combinaisons.

Les macros sont très rapides (<0,1 s) car on utilise un tableau VBA.

Edit : en base N = 4 avec 8 colonnes , sur Win7/Excel 2010, exécution en :

- 2,6 s pour le 1er fichier (65536 lignes créées)

- 1,3 s pour le 2ème fichier (critères inchangés, 24192 lignes créées).

A+
 

Pièces jointes

  • Liste base N(1).xls
    44 KB · Affichages: 74
  • Liste base N avec critères(1).xls
    45 KB · Affichages: 68
Dernière édition:

mamarus

XLDnaute Junior
Re : Boucle VBA Pour afficher des données totales

Bonjour Job75

Merci de t'être intéressé à mon problème, cela correspond partiellement à ce que je recherché, je m'explique:

le but final est d'obtenir quelque chose d'interactif ou l'utilisateur rentrera ses choix ex:
il rentre d'abord le nombre de matchs que va contenir le critère: ici par exemple les Matchs 1 à 2 mais cela aurait pu être 1 à 5, 3 à 5 etc... le but étant qu'on reste dans le maxi du nombre de matchs , c'est à dire 7.

Le critere : Ici des doubles ( 1 et N )

Spécificité : Obligation et uniquement d'avoir 1 "1" sur les 2 matchs ( si sur le match, 1 on a un 1, on aura au match 2 un N, puisque la condition c'est 1 seul "1" sur les 2 matchs pour chaque grille. Le but étant d'avoir les conditions respectées des 7 matchs pour chaque grille.
On voit sur le fichier "liste base avec critères" que la condition donnée en exemple pour les matchs 1 à 4 était d'avoir 1 seul "1" sur les 4 matchs, or je crois que c'est à partir de la ligne 140 que l'on voit 2 "1" sur ces 4 matchs.

Pour Résumer : sera demandé à l'utilisateur ces 3 phases en boucle jusqu'à ce que le nombre des 7 matchs ait été atteint :

* Le nombre de matchs
* Le critère ( un simple, un double, un triple )
* La spècificité ( un "1" sur les 2, les 3 ou les 4 .... matchs

Voilà j'espère avoir été plus clair, cela dit, tu as bien assimilé l'essentiel, mais j'ai conscience que le problème est très coton à mettre en place.

Te remerciant par avance;

Cordialement;

Mamarus
 

job75

XLDnaute Barbatruc
Re : Boucle VBA Pour afficher des données totales

Re,

Je ne comprends pas vos explications et je n'aime pas me prendre la tête.

Dans le 2ème fichier j'ai appliqué les critères de filtrage que vous avez définis au post #3.

S'ils sont différents ou s'il y en a d'autres, à vous de les adapter.

Quant à l'interactivité, mettez des InputBox ou un UserForm.

Complément :

Pour ceux que ça intéresse voici une fonction VBA qui convertit un nombre entier positif en base N :

Code:
Function BaseN(EntierPositif&, N As Byte) As String
Dim s$, t$, i&, j As Byte
s = String(Int(Log(EntierPositif) / Log(N)) + 2, "0")
t = 0
For i = 1 To EntierPositif
  t = Format(t + 1, s)
  While InStr(t, N)
    j = InStrRev(t, N)
    t = Left(t, j - 2) & Mid(t, j - 1, 1) + 1 & 0 & Mid(t, j + 1)
  Wend
Next
BaseN = Val(t) 'Val pour 0 non significatif
End Function
Fichier joint.

A+
 

Pièces jointes

  • Conversion en base N(1).xls
    39 KB · Affichages: 51

job75

XLDnaute Barbatruc
Re : Boucle VBA Pour afficher des données totales

Re,

On voit sur le fichier "liste base avec critères" que la condition donnée en exemple pour les matchs 1 à 4 était d'avoir 1 seul "1" sur les 4 matchs

Le critère que j'ai utilisé était d'avoir au maximum un "1" :

Code:
crit1 = Not Mid(t, 1, colcrit1) Like "*0*0*"
S'il faut qu'il y ait un "1" au moins et pas plus, utilisez :

Code:
crit1 = Mid(t, 1, colcrit1) Like "*0*" And Not Mid(t, 1, colcrit1) Like "*0*0*"
Fichier (2).

On trouve maintenant 288 combinaisons.

A+
 

Pièces jointes

  • Liste base N avec critères(2).xls
    45.5 KB · Affichages: 69

mamarus

XLDnaute Junior
Re : Boucle VBA Pour afficher des données totales

Re Bonjour,

Merci pour le travail qui a été fait, j'ai conscience que c'est une prise de tête, ce qui a été demandé est assez coton, je vais essayer de m'en arranger, après réflexion une idée m'est venue j'aurai voulu savoir si j'inversai les critères au lieu de :

Avoir au maximum un "1" sur chaque grille , je voudrai l'inverse à savoir " en enlever que 1 "1" sur chaque condition de chaque grille.

le code est il compliqué à modifier ?

Merci de ta réponse.

Cordialement;

Mamarus
 

job75

XLDnaute Barbatruc
Re : Boucle VBA Pour afficher des données totales

Re,

Avoir au maximum un "1" sur chaque grille , je voudrai l'inverse à savoir " en enlever que 1 "1" sur chaque condition de chaque grille.

Cela n'a aucun sens.

Pour la simple et bonne raison qu'on ne modifie aucune combinaison.

Il y a une liste, et on y prend les combinaisons qui répondent aux critères. Point barre.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 308
Messages
2 087 103
Membres
103 469
dernier inscrit
Thibz