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 c'est tres elaborés !bravo je vais essayer de comprendre tout ca

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
Rechercher des sujets similaires à "boucles"