Concaténation de boucles VB

pour générer toute les combinaisons d’association possible ex : (111. 112. 113. 121. 131 ...jusqu’à 333) en VB.
J'ais besoin de faire 3 boucles; de 1 à 3 à chaque fois, et mettre dans une variable la concaténation du résultat des 3 boucles à chaque boucle;
Voiçi le seul code que j'ai pus créer, mais il ne fonctionne pas!

Dim 1 As string, 2 As string, 3 As string
1=1
2=2
3=3
Etiquette1:
If condition="333" Then
Goto Etiquette2 'renvoie à la fin

Else 'sinon aff générer jusqu’à 333
print "1" & "2" & "3" to "333"

End If

Goto Etiquette1

Etiquette2:

End sub
---------
Est-ce que quelcun aurait-il une idée de code plus juste ,svp?

En esperant avoir eu une reponse
je vous remercie encore et bonne apres midi à tous
merci

Marc

18 réponses

  1. Contributeur
    Bonsoir,

    fais plutôt 3 boucles imbriquées :
    Sub test()
    For i = 1 To 3
    For j = 1 To 3
    For k = 1 To 3
    MsgBox (i & j & k)
    Next k
    Next j
    Next i
    End Sub

    evite d'utiliser les etiquettes et les goto, et ne donne pas de chiffre comme nom de variable, démarre-les toujours par une lettre

    cdt
    eric
    1. merci,
      c'est gentil.

      En plus compliqué si les variables sont issue d'un fichier texte alors comment les assignerais tu?
      ex: un fichier texte avec des valeures (1, 2, 3)

      open c:fichier.txt

      c'est chaud là ?
      Merci
      1. Contributeur
        Pas sûr d'avoir bien compris mais je les mettrai dans une variable tableau
        avec liste.txt de la forme "1","2","3"

        Sub test()
        Dim a(3) As String
        fich = "e:\_tmp\liste.txt"
        Dim i As Integer
        n = FreeFile
        Open fich For Input As #n 'ouverture du fichier
        While Not EOF(n) ' et lecture tant qu'on n'est pas arrivé à la fin
        Input #n, a(i)
        i = i + 1
        Wend
        End Sub

        et ensuite tu fais travailler tes boucles i, j, k sur les indices du tableau
        si j=0 alors a(j) => "1" etc

        eric
        1. Salut erric.
          Peut tu m'éxpliquer le fonctionnement de ton code s'il te plaît.
          Notament : Input #n, a(i)
          et le lien de :

          Dim a(3) As String
          fich = "e:\_tmp\liste.txt"

          Dim i As Integer
          n = FreeFile

          Merci @+
      2. Merci sa marche déjà (on arrangeant le code)

        Je voulais dire que pour les valeurs numérique c'est assez simple à comprendre et je t'en remérci;

        Mais par example pour faire la même chose sauf que les valeurs sont dans un fichier texte séparé par un éspace
        (ou virgule)
        Alors comment déclarer des boucles imbriqué pour chaque valeur qu'il y aurait ?

        Open C:fichier1.txt
        for i= (1ére valeur du fichier)

        If (encore des valeurs)
        imbriqué les boucle

        Je sais que c'est faut mais je pense qu'il faud les prendre comme des chaine de caractère . (¿)

        Qu'en pense-tu ? C'est compliqués ?

        Merci .
        1. Contributeur
          Bonsoir marcus,
          fich = "e:\_tmp\liste.txt" : tu voulais récuperer les données fournies dans un fichier texte. Pour les test j'en ai créé un appelé liste.txt que j'ai mis sur le lecteur E:, répertoire \_tmp\. Tu remplaces par ton fichier et ton chemin. Et comme c'est long à écrire je l'ai affecté à la variable fich

          Dim a(3) As String = déclaration d'une variable tableau qui peut stocker plusieurs valeurs. Ici 4 valeurs de a(0) à a(3) mais seules 3 serviront ici. Dim a(2) était suffisant... C'est plus simple à utiliser ensuite dans les boucles. Tu fais varier i de 0 à 2 et tu lis ou écris a(i)

          Input #n, a(i) = lecture sequentielle dans le fichier ouvert sur #n
          #n est un 'canal' ouvert par windows, il faut lui demander un numero de canal libre d'où le n = FREEFILE juste avant. pour lire le fichier liste.txt. Comme ça tu peux travailler avec plusieurs fichiers ouverts simultanément et tu fais reference au fichier en donnant juste son n° de canal.
          un fichier sequentiel est un fichier texte où les données sont séparée par des virgules. En l'occurence "1","2","3"
          Chaque Input lit une donnée dans liste.txt et la stocke dans une variable tableau a() jusqu'à la fin du fichier (EOF)
          Donc en sortie de boucle tu as
          a(0) = "1"
          a(1) = "2"
          a(2) = "3"

          C'est expliqué sommairement mais ça t'éclairera peut-etre
          eric
          1. Merci eric,
            c'est sympat de ta part.

            Je vais lire ton explication, et essayer de comprendre le fonctionnement ce weekend.

            Bon weenk @+
            1. Salut eric,
              Ton éxplication est trés claire .
              Il y à seulement des points que je dois éclaircire .
              Lorsque tu dis :

              "et ensuite tu fais travailler tes boucles i, j, k sur les indices du tableau
              si j=0 alors a(j) => "1" etc.. "

              Je tourne bétement en rond car je me demande s'il faudrais rajouter trois boucle imbriqué avec A, J, et K
              et jouer avec le tableau "a" voir des conditions "IF"

              (De plus je n'ai plus accé à mon Pc mais celui d'un amie et sans mes logiciels );)

              Voilà, peut tu m'éclairer sur la fin stp,
              Merci

              marc
              1. Contributeur
                Bonjour,

                Pas bcp de différence avec ce que je t'avais mis dans le 1er message.
                Tes boucles doivent utiliser 3 variables i, j, k et utiliser a(n)

                Donc si tu as mis tes variables dans a(0) à a(2) :

                Sub test() 
                For i = 0 To 2 
                  For j = 0 To 2 
                   For k = 0 To 2 
                     ' MsgBox (i & j & k) 
                     ' il suffit de remplacer par 
                     MsgBox(a(i) & a(j) & a(k))
                   Next k 
                  Next j 
                Next i 


                eric
                1. Merci,

                  Je vais essayer de l'éxecuter pour mieux comprendre. (mais avec VBA de word car j'ai plus mon Pc)

                  Alors le code serait comme sa :

                  Sub test()
                  Dim a(3) As String
                  fich = "e:\_tmp\liste.txt"
                  Dim i As Integer
                  n = FreeFile
                  Open fich For Input As #n 'ouverture du fichier
                  While Not EOF(n) ' et lecture tant qu'on n'est pas arrivé à la fin
                  Input #n, a(i)
                  i = i + 1
                  Wend
                  End Sub

                  Sub test()
                  For i = 0 To 2
                  For j = 0 To 2
                  For k = 0 To 2
                  ' MsgBox (i & j & k)
                  ' il suffit de remplacer par
                  MsgBox(a(i) & a(j) & a(k))
                  Next k
                  Next j
                  Next i
                  End

                  Je me suis demandé s'il fallait retirer End Sub et Sub test() entre les deux code ou si c'était juste ?

                  merci

                  marc
                  1. Contributeur
                    Oui tu peux enlever ce que tu dis si tu veux que les 2 macros n'en fasse plus qu'une
                    Mais met bien End Sub à la fin
                    eric
                    1. Bonjour,
                      J'ai fini par comprendre l'ensemble ,
                      (Se que j'aurait dû faire plutôt )

                      Mais Concérnant :
                      Input #n, a(i)
                      i = i + 1

                      Le (i) de a(i) est une variable de compteur avec: i = i + 1
                      Oú c'est plutôt pour dire afficher "a" là oú il y à "i" ?

                      Voilà, c'était tout ce qui me manquait à comprendre,
                      Si sa ne te dérange pas plus,
                      merci

                      marc
                      1. Contributeur
                        Bonsoir marc,

                        a() est un tableau de 4 élements (imagine 4 cases numérotée 0,1,2,3)
                        i est l'index permettant de s'adresser au (i+1) éme élément
                        donc si i=0 tu ecris ou lit la 1ère case de a()
                        si i=2 tu ecris ou lit la 3ème case de a()

                        Dans cet exemple on lit le 1er morceau du fichier texte jusqu'à la virgule (séparateur de valeur) et on l'écrit dans a(0) (1ere case de a() )
                        puis la seconde et comme on a fait i+1 on le stocke dans la 2nde case a(1)
                        etc

                        eric
                        1. Bonjour,

                          Donc i sert juste à créer les dénomination de a() pour avoir à chaque passage de i :1er tours = a(0), 2é tours = a(1) et 3é tour de i on obtient a(3) .
                          C'est à la fois un compteur et un dénominateur.

                          J'éspers ne pas me planter car je sais que c'est niveau débutant. (puis tu éxplique assez bien en plus)

                          merci eric,

                          marc @+
                          1. Contributeur
                            Volià, c'est un compteur qu'on utilise en index d'un tableau
                            eric
                            1. Bonjour,

                              Ok
                              Je te remerci pour tes éxplications claire qui mon bien aidé.

                              A+
                              1. Salut Eric,

                                Je voudrais éxperimenter un bouton de commande :).

                                Pour aller encore plus loint (un peut;)
                                Et dans le même cadre mais avec un contrôle qui commande l'éxecution du programme çi dessus ( Sub test() ) (dans une feuille VB),

                                Dabord créer la feuille "Feuil1"
                                Et j'ésite à écrire dans la boite code projet1 :

                                Private Sub Feuil1_Load()
                                (Car je m'aide d'un example de code).

                                Puis je pense qu'il faud créer un bouton "Bt1" sur la feuille "Feuil1" puis une nouvelle procédure pour le bouton en double-cliquant dessus :

                                "procédure=Click" et Objet (Form) = "Bt1"

                                Puis son Code pour commander l'application "test":

                                Private Sub Bt1_Click()
                                test ' éxecute les boucle imbriqué nomé " Sub test() "
                                End Sub

                                Maintenant pour attaché "test" à la feuille "Feuil1" je dois faire idem en créant une procédure :

                                "procédure = "Load ou Sub test" et
                                Objet (Form) = "?"

                                Puis y coler tout le code précédament créé (avec le fichier séquenciel)

                                Voilà, j'éspers que c'est pas confus comme explication .

                                Je trouve sa assez intéressant alors je vais essayer d'étre plus claire la prochaine fois .

                                Voilà, j'éspers que c'est assez claire comme éxplication.
                                merci

                                Marc A+
                                1. Bonsoir Marc,

                                  Je te rassure, si si c'est un peu confus ;-)
                                  Les grandes lignes sont là mais tu t'égards un peu parfois...

                                  Pourquoi Feuil1_Load ? de quelle version d'excel viennent tes exemples ?
                                  Ce n'est pas un evenement sheets ça, si c'est pour lancer une procédure au chargement du classeur il faudrait utiliiser WorkbookOpen.

                                  Et pour ton 1er test bouton fait simple:
                                  dessine ton bouton, double-clique dessus et dans le code mets msgbox("yesssss!!!! ça marche")
                                  tu auras ton 1er bouton fonctionnel tu peux modifier ton code, faire d'autre procédures que tu appelles, aller voir les evenement d'une feuille, de thisworkbook etc

                                  Amuses toi bien :-)
                                  eric
                                  1. Bonjour,
                                    merci des conseil,
                                    Je reviens (j'étais absent)
                                    Je vais faire comme tu à dis.
                                    Mais l'example que j'avais datte de trés longtemps,

                                    A+