Concaténation de boucles VB

Fermé
marcus - 16 sept. 2007 à 22:42
 marcus - 18 oct. 2007 à 00:00
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
A voir également:

18 réponses

eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
16 sept. 2007 à 23:33
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
0
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
0
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
19 sept. 2007 à 11:36
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
0
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 @+
0
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 .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
22 sept. 2007 à 01:51
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
0
Merci eric,
c'est sympat de ta part.

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

Bon weenk @+
0
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
0
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
26 sept. 2007 à 14:41
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
0
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
0
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
26 sept. 2007 à 23:44
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
0
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
0
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
27 sept. 2007 à 23:19
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
0
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 @+
0
eriiic Messages postés 24597 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 22 septembre 2024 7 235
29 sept. 2007 à 09:53
Volià, c'est un compteur qu'on utilise en index d'un tableau
eric
0
Bonjour,

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

A+
0
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+
0
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
0
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+
0