IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment parcourir plusieurs boucles for ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 10
    Par défaut Comment parcourir plusieurs boucles for ?
    Bonsoir, je suis débutante en vba et voici moi problème :
    j'ai 360 variables sur lesquelles je veux appliquer une boucle for qui va d'un min vers un max, pour avoir plusieurs combinaisons de ces variables comme dans cette exemple avec 4 variables mais au lieu de faire à chaque fois for sur 360 variables je veux les regrouper dans une macro s'il est possible.
    voici l 'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                   For asset1 = Range("asset1min").Value To Range("asset1max").Value Step Range("pas").Value
     
                             For asset2 = Range("asset2min").Value To Range("asset2max").Value Step Range("pas").Value
                                            For asset3 = Range("asset3min").Value To Range("asset3max").Value Step Range("pas").Value
    tel que asset1min ....les valeurs minimales que j'ai renseignées, asset1max .... les valeurs maximales

    0 0 0 2000000
    0 0 200000 1800000
    0 0 400000 1600000
    0 0 600000 1400000
    0 0 800000 1200000
    0 0 1000000 1000000
    0 0 1200000 800000
    0 0 1400000 600000
    0 0 1600000 400000
    0 0 1800000 200000
    0 0 2000000 0
    0 200000 0 1800000
    0 200000 200000 1600000
    0 200000 400000 1400000
    0 200000 600000 1200000
    0 200000 800000 1000000
    0 200000 1000000 800000
    0 200000 1200000 600000
    0 200000 1400000 400000
    0 200000 1600000 200000
    0 200000 1800000 0
    0 400000 0 1600000
    0 400000 200000 1400000
    0 400000 400000 1200000
    0 400000 600000 1000000
    0 400000 800000 800000
    0 400000 1000000 600000
    0 400000 1200000 400000
    0 400000 1400000 200000
    0 400000 1600000 0
    0 600000 0 1400000
    0 600000 200000 1200000
    0 600000 400000 1000000
    0 600000 600000 800000
    0 600000 800000 600000
    0 600000 1000000 400000
    0 600000 1200000 200000
    0 600000 1400000 0
    0 800000 0 1200000
    0 800000 200000 1000000
    0 800000 400000 800000
    0 800000 600000 600000
    0 800000 800000 400000
    0 800000 1000000 200000
    0 800000 1200000 0
    0 1000000 0 1000000
    0 1000000 200000 800000
    0 1000000 400000 600000
    0 1000000 600000 400000
    0 1000000 800000 200000
    0 1000000 1000000 0
    0 1200000 0 800000
    0 1200000 200000 600000
    0 1200000 400000 400000
    0 1200000 600000 200000
    0 1200000 800000 0
    0 1400000 0 600000
    0 1400000 200000 400000
    0 1400000 400000 200000
    0 1400000 600000 0
    0 1600000 0 400000
    0 1600000 200000 200000
    0 1600000 400000 0
    0 1800000 0 200000
    0 1800000 200000 0
    0 2000000 0 0
    200000 0 0 1800000
    200000 0 200000 1600000
    200000 0 400000 1400000
    200000 0 600000 1200000
    200000 0 800000 1000000
    200000 0 1000000 800000
    200000 0 1200000 600000
    200000 0 1400000 400000
    200000 0 1600000 200000
    200000 0 1800000 0
    200000 200000 0 1600000
    200000 200000 200000 1400000
    200000 200000 400000 1200000
    200000 200000 600000 1000000
    200000 200000 800000 800000
    200000 200000 1000000 600000
    200000 200000 1200000 400000
    200000 200000 1400000 200000
    200000 200000 1600000 0
    200000 400000 0 1400000
    200000 400000 200000 1200000
    200000 400000 400000 1000000
    200000 400000 600000 800000
    200000 400000 800000 600000
    200000 400000 1000000 400000
    200000 400000 1200000 200000
    200000 400000 1400000 0
    200000 600000 0 1200000
    200000 600000 200000 1000000
    200000 600000 400000 800000
    200000 600000 600000 600000
    200000 600000 800000 400000
    200000 600000 1000000 200000
    200000 600000 1200000 0
    200000 800000 0 1000000
    200000 800000 200000 800000
    200000 800000 400000 600000
    200000 800000 600000 400000
    200000 800000 800000 200000
    200000 800000 1000000 0
    200000 1000000 0 800000
    200000 1000000 200000 600000
    200000 1000000 400000 400000
    200000 1000000 600000 200000
    200000 1000000 800000 0
    200000 1200000 0 600000
    200000 1200000 200000 400000
    200000 1200000 400000 200000
    200000 1200000 600000 0
    200000 1400000 0 400000
    200000 1400000 200000 200000
    200000 1400000 400000 0
    200000 1600000 0 200000
    200000 1600000 200000 0
    200000 1800000 0 0
    400000 0 0 1600000
    400000 0 200000 1400000
    400000 0 400000 1200000
    400000 0 600000 1000000
    400000 0 800000 800000
    400000 0 1000000 600000
    400000 0 1200000 400000
    400000 0 1400000 200000
    400000 0 1600000 0
    400000 200000 0 1400000
    400000 200000 200000 1200000
    400000 200000 400000 1000000
    400000 200000 600000 800000
    400000 200000 800000 600000
    400000 200000 1000000 400000
    et merci d'avance

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Amandine et bienvenue, bonjour le forum,

    Il me semble que tu te compliques un peu la vie avec ces plages nommées. Deux boucles devraient suffire. Une première de la ligne Deb (ligne de début du tableau) à la ligne de fin du tableau et une seconde, pour chaque ligne, de la valeur MIN à la valeur MAX avec un code du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub Macro1()
    Dim LD As Integer 'déclare la variable LD (ligne de Début)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim MI As Long 'déclare la variable MI (valeur MInimum)
    Dim MA As Long 'déclare la variable MA (valeur MAximim)
    Dim Pas As Integer 'déclare la variable Pas
     
    LD = 1 'définit la cellule de début du tableau (à adapter à ton cas)
    For I = LD To LD + 360 'boucle 1 : sur toutes les lignes du tableau
        MI = Application.WorksheetFunction.MIN(Cells(I, "A").Resize(1, 4)) 'définit la valeur maximum MAX de la ligne
        MA = Application.WorksheetFunction.MAX(Cells(I, "A").Resize(1, 4)) 'définit la valeur maximum MIN de la ligne
        PAS=cells(?, ?).Value 'définit le pas (à adapter)
        For J = MIN To MAX Step Pas 'boucle 2 : de la valeur minimum à la valeur maximum de la ligne de la boucle 1
            'action
        Next J 'prochaine valeur de la boucle 2
    Next I 'prochaine ligne de la boucle 1
    End Sub

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 10
    Par défaut
    merci Thauthème pour ta réponse mais en fait j'ai 360variables donc au total 360 colonnes à construire et je veux que la premiere variable prend une valeur de min à max avec pas et de meme pour les autres c'est dire des boucles for sur les 360 variables, mais vu que c'est difficile d'ecrire 360 boucle for je cherche un autre moyen pour automatiser cela
    merci

  4. #4
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour, il me semble que tout cela manque gravement d'une explication structurée qui expliquerais le point de départ et le point d'arrivée, et surtout ce qui doit se passer entre les deux. C'est peut être clair pour vous, mais ça ne l'est pas pour moi en tout cas.
    Je n'ai pas de prétention d'une intelligence forte mais je n'ai pas trouvé dans votre copie d'écran, de logique de ligne ou de colonne.

    Cordialement

  5. #5
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Bonjour Transitoire, amandine et Thauthème,

    Toutes tes variables auront les mêmes "min" et "max" ?

    Que veux-tu faire dans chacune de ces colonnes ?

    Dans un premier temps tu peux déjà boucler sur tes colonnes, le temps qu'on comprenne mieux la problématique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i = 0 To 360
    Columns(i)...
    Next i
    Ou à moins qu'il soit possible de parcourir la collection des Colonnes en fixant une limite d'indice à 360 ?

  6. #6
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Heu... La capture d'écran nous montre de nombreuses lignes et seulement 4 colonnes. Où sont les 360 colonnes ?!...

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 10
    Par défaut
    Bonjour,
    j'ai pas bien expliquer le problème, mais voila plus d'explications:
    dans l'exemple de la photo j'ai fait un essai sur 4 variables; les trois premières sont construites par une boucle for qui va d'un même min=0 à max=20000000 avec un pas de 200000 et la 4 eme variable est déduite par différence 20000000-(VAR1+VAR2 +VAR3) et j'ai imposés donc mon code que cette variable ne soit pas négative
    maintenant ce que j'ai fait pour les 4 je veux l'appliquer sur 360 variables mais vu que c'est difficile de taper 360 for dans le code je cherche un autre moyen
    par exemple :
    var1=0; var2=0; var3=0 et var4 va prendre la différence si positive=20000000
    var1=0; var2=0; var3=200000 et var4=20000000-200000
    var1=0; var2=0; var3=400000 et var4=20000000-200000
    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub SimulationMacro()
     
     Dim compteur As Double
     Dim asset1, asset2, asset4 As Long
     
     
    compteur = 0
     
    'On efface le contenu du tableau de l'onglet simulations
    If Sheets("Simulation").Range("B6").Value <> "" Then Sheets("Simulation").Range("B6:O10000").ClearContents
     
     
    'Boucle de simulation pour nos produits
     
    Application.Calculation = xlCalculationManual
     
     
     
    ' On simule de 0 à 20000000 pour chacun des 4 produits
     
    For asset1 = Range("asset1min").Value To Range("asset1max").Value Step Range("pas").Value
     
    For asset2 = Range("asset2min").Value To Range("asset2max").Value Step Range("pas").Value
    For asset3 = Range("asset3min").Value To Range("asset3max").Value Step Range("pas").Value
     
    asset4 = Range("Montantdisponible").Value - (asset1 + asset2 + asset3)
     
    ' Si la valeur de asset4 est positive, la macro remplit les cellules
    If asset4 >= 0 Then
    Cells(compteur + 7, 2).Value = compteur + 1
    Cells(compteur + 7, 3).Value = asset1
    Cells(compteur + 7, 4).Value = asset2
    Cells(compteur + 7, 5).Value = asset3
    Cells(compteur + 7, 6).Value = asset4
    compteur = compteur + 1
    ' End If
     
     
     Else: Exit For ' S i la valeur de asset4 est négative , elle sort de la boucle et passe à l'itération suivante
     End If
    Next asset3
    Next asset2
    Next asset1
     
     
    Application.Calculation = xlCalculationAutomatic
     End Sub
    Merci

Discussions similaires

  1. Utilisation plusieurs boucles For imbriquées
    Par stick25 dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/04/2010, 19h00
  2. Comment parcourir plusieurs JLabel[]?
    Par katebe dans le forum Général Java
    Réponses: 6
    Dernier message: 05/02/2008, 22h03
  3. Comment optimiser plusieurs boucles FOR-END imbriquées
    Par totoc1001 dans le forum MATLAB
    Réponses: 26
    Dernier message: 13/05/2007, 18h59
  4. comment quitter deux boucles for?
    Par davmaster62 dans le forum Général Python
    Réponses: 2
    Dernier message: 08/03/2006, 01h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo