Boucles
Bonjour, je pose une question qui n 'aura certainement pas de réponse (faisabilité), voilà j ai un code à écrire mais avec un nombre important de boucle en for/next disons une dizaine, et peut être voir plus,(car beaucoup de variables) existe t il un moyen de condenser voir de réduire le nombre de boucles ? Parceque des for/next 15 fois C est pas très, élégant en codage ?... En tout cas merci pour vos commentaires, cordialement.
Bonjour Rocket,
Je crois que pour ce genre de problème, il faut faire un module de Class,
fais une recherche sur des bons tutos et cela devrait aboutir
Bonjour,
une exemple de solution possible avec un code récursif
Sub aargh()
Cells.Clear
boucle 4, 1, 3 '4 boucles imbriquées, valeur initiale de chaque boucle =1, valeur finale de chaque boucle=3
End Sub
Sub boucle(nombreboucles, valeurinitiale, valeurfinale, Optional niveau = 1, Optional valeursencours = "")
sauve = valeursencours
For i = valeurinitiale To valeurfinale
valeursencours = valeursencours & " " & i
If niveau < nombreboucles Then
boucle nombreboucles, valeurinitiale, valeurfinale, niveau + 1, valeursencours 'boucle suivante
Else
vb = Split(Trim(valeursencours), " ")
'les valeurs des différentes boucles sont dans le vecteur vb(0 à nombreboucles)
'mettre ici le code pour exploiter les valeurs générées par la succession de boucles imbriquées
'par exemple
dl = Cells(Rows.Count, 1).End(xlUp).Row
Cells(dl + 1, 1).Resize(, UBound(vb)) = vb ' copier les valeurs générées dans la feuille active
End If
valeursencours = sauve
Next i
End Sub
Merci H2sO4
une notation que je ne comprend pas au debut :
boucle 4, 1, 3
j'ai compris qu'on designe 4 boucles et chacune allant de 1 à 3 , mais d'ou viens ce type de notation c'est un tableau comme array(,...) ?
merci
bonjour,
j'ai compris qu'on designe 4 boucles et chacune allant de 1 à 3 , mais d'ou viens ce type de notation c'est un tableau comme array(,...) ?
il s'agit de l'appel d'une procédure avec 3 paramètres
attention imbriquer 15 fois la boucle valeurinitiale à valeurfinale génère (1+valeurfinale-valeurinitiale)^15 valeurs possibles, ça devient vite ENORME.
re-Bonjour,
une autre solution sans code récursif.
Sub aargh()
Dim b(), valeurinitiale(), valeurfinale()
nombreboucles = 4 'nombre de boucles
ReDim b(1 To nombreboucles)
valeurinitiale = 1 'valeur initiale pour chaque boucle
valeurfinale = 3 'valeur finale pour chaque boucle
k = 0
i = 1
b(i) = valeurinitiale
Do
If i < nombreboucles Then
i = i + 1
b(i) = valeurinitiale
Else
Do While b(i) >= valeurfinale
i = i - 1
If i = 0 Then Exit Do
Loop
If i = 0 Then Exit Do
b(i) = b(i) + 1
End If
If i = nombreboucles Then ' les valeurs des différentes boucles sont dans le vecteur b(0 à nombreboucles)
'mettre ici le code pour exploiter les valeurs générées par la succession de boucles imbriquées
' par exemple
k = k + 1
Cells(k, 1).Resize(, nombreboucles) = b
'fin de l'exemple
End If
Loop
End Sub
Un grand merci pour avoir pris le temps de répondre h2s04, je vais regarder ta 2 ieme solution de pré
salut h2so4 , j'ai tenté une solution a ma sauce (histoire de ne pas faire du copier coller mais plutot de s'inspirer des conseils fournis) , mais qui sera pas aussi elegante que la tienne , la voici :
Function comp(x As Variant, nbr As Integer) As Variant '(x est un tableau à 3 variables et nbr est le nombre de boucles, ici 3 pour l'exemple executé depuis la macro test_boucle)
Dim mem(), u As Variant
n = 0
k = 0
ReDim u(0 To nbr - 1)
For k = 0 To nbr - 1
u(k) = k + 1
Next
For i = 0 To UBound(x)
For j = 0 To UBound(u)
ReDim Preserve mem(0 To n)
mem(n) = x(i) & " " & u(j)
n = n + 1
Next
Next
comp = mem
End Function
Sub test_boucle() 'macro associée à la fonction ecrite précedement
nbr_boucle = CInt(InputBox("saisir un nombre de boucles >=3"))
x = comp(Array(1, 2, 3), 3)
i = 1
Do
a = comp(x, 3)
x = a
i = i + 1
Loop Until i = nbr_boucle - 1
'la variables a donne toutes les composantes des 3 boucles
'msgbox a(UBound(a)) 'ligne de test
'traitement :
For s = 0 To UBound(a)
somme = 0
For v = 1 To Len(a(s))
If IsNumeric(Mid(a(s), v, 1)) Then
somme = somme + Val(Mid(a(s), v, 1))
End If
Next
If somme >= 5 Then
plus = plus + 1
End If
Next
msgbox plus ' retourne 25
End Sub
'***************************************'je compare avec ensuite avec
Sub comparaison()
For i = 1 To 3
For j = 1 To 3
For k = 1 To 3
If i + j + k >= 5 Then
n = n + 1
End If
Next
Next
Next
msgbox n ' retourne 25
End Sub