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 :

Variable dynamique dans une boucle for i to variable [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ingénieur logistique
    Inscrit en
    Mai 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : ingénieur logistique

    Informations forums :
    Inscription : Mai 2016
    Messages : 23
    Par défaut Variable dynamique dans une boucle for i to variable
    Bonjour à tous,

    J'ai déjà cherché pas mal mais ma requête sort un peu de l'ordinaire.

    J'ai une colonne représentant une liste d'agents (Colonne A) :

    Initialement la longueur de la liste peut varier donc je recherche via VBA la dernière ligne non vide et je l'affecte à une variable "fin".

    Puis pour le traitement de chaque liste je passe par la fonction For i = 2 to fin.

    Jusque là tout va bien, cependant dans l'exécution de ma macro, celle-ci ajoute des lignes donc modifie le résultat de la variable "fin" dans la fenêtre variable locale mais pas dans la boucle de la macro.

    Ex :

    Si fin = 30 au début après l'exécution des tâches de la macro, fin sera égale à 35.

    Cependant ma boucle n'ira que jusqu'à la ligne 30 car la boucle for i to variable ne prend pas en compte que la variable de fin puisse changer.

    Je pose déjà le sujet comme cela en espérant avoir été assez claire et je pourrai mettre à disposition le code utilisé ainsi que le fichier si besoin.

    Je vous remercie d'avance car à ce point je n'arrive plus à trouver de solution à mon problème.

    En vous souhaitant une bonne journée.

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 969
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 969
    Par défaut
    Bonjour
    j'arrive pas à comprendre ta demande surtout que tu montre pas ton code !!! (entre balise)
    si tu as une boucle qui vas mettre à jour la dernière ligne non vide tu peux mettre un nouveau variable de type LONG qui se calcul après le boucle
    et tu continue à travailler avec cette nouvelle variable

  3. #3
    Membre averti
    Homme Profil pro
    ingénieur logistique
    Inscrit en
    Mai 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : ingénieur logistique

    Informations forums :
    Inscription : Mai 2016
    Messages : 23
    Par défaut
    Bonjour,

    Voilà le code utilisé :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    Sub Macro1()
     
    Dim i, r, a As Variant
    Dim fin2 As Long
     
    Application.ScreenUpdating = False
     
    'Récupération des taches pour les agents présents
     
    Sheets("Test").Select
     
    fin2 = Range("A" & Rows.Count).End(xlUp).Row
     
    For i = 5 To fin2
     
    Cells(i, 8).FormulaR1C1 = "=COUNTIF('ONT009'!C[13],""*" & Cells(i, 1).Value & "*"")"
        Cells(i, 9).FormulaR1C1 = "=COUNTIF('ONT009'!C[13],""*" & Cells(i, 1).Value & "*"")"
     
         r = Cells(i, 8).Value
         a = Cells(i, 9).Value
     
            If r > 0 And a > 0 Then
                    Rows(i).Select
                    Selection.Copy
                If r > 1 And a > 1 Then
                    Rows("" & (i + 1) & ":" & (i + r + a - 2) & "").Select
                ElseIf r = 1 And a > 1 Then
                    Rows("" & (i + 1) & ":" & (i + r + a - 1) & "").Select
                ElseIf r > 1 And a = 1 Then
                    Rows("" & (i + 1) & ":" & (i + r + a - 1) & "").Select
                ElseIf r = 1 And a = 1 Then
                    Rows("" & (i + 1) & ":" & (i + r + a) & "").Select
                End If
                    Selection.Insert Shift:=xlDown
                    Application.CutCopyMode = False
     
            ElseIf r > 0 Then
                    Rows(i).Select
                    Selection.Copy
                If r > 1 Then
                    Rows("" & (i + 1) & ":" & (i + r - 1) & "").Select
                ElseIf r = 1 Then
                    Rows("" & (i + 1) & ":" & (i + r) & "").Select
                End If
                    Selection.Insert Shift:=xlDown
                    Application.CutCopyMode = False
     
            ElseIf a > 0 Then
                    Rows(i).Select
                    Selection.Copy
                If a > 1 Then
                    Rows("" & (i + 1) & ":" & (i + a - 1) & "").Select
                ElseIf a = 1 Then
                    Rows("" & (i + 1) & ":" & (i + a) & "").Select
                End If
                    Selection.Insert Shift:=xlDown
                    Application.CutCopyMode = False
     
            Else: GoTo Top
            End If
     
    Top:
        If r > 1 And a > 1 Then
        i = i + r + a - 2
        ElseIf r > 1 And a = 0 Then
        i = i + r - 1
        ElseIf r > 1 And a = 1 Then
        i = i + r - 1 + a
        ElseIf r = 0 And a > 1 Then
        i = i + a - 1
        ElseIf r = 0 And a = 1 Then
        i = i + a
        ElseIf r = 1 And a = 0 Then
        i = i + r
        ElseIf r = 1 And a = 1 Then
        i = i + a + r
        ElseIf r = 1 And a > 1 Then
        i = i + r + a - 1
        End If
     
     
     
    fin2 = Range("A" & Rows.Count).End(xlUp).Row
     
        Next i
     
    Application.ScreenUpdating = True
     
    End Sub
    Dans le code je vais compter le nombre de fois à l'agent est présent en tant que responsable et puis en tant qu'agents dans 2 colonnes différentes.

    Après je vais créer autant de ligne que l'agent à de tâches à réaliser.

    D'où le fait que la liste de départ des agents est de 30 et cette liste à la fin peut finir à 40. Or avec la boucle utilisé celle-ci s'arrête à la ligne 30. Et j'ai besoin de la valeur i pour faire passer à l'agent suivant si j'insère plusieurs lignes pour l'agent précédent.

    J'espère être claire c'est assez difficile à expliquer, merci en tout cas pour le temps de vous m'accordez.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 676
    Par défaut
    Bonjour,

    Utilise les balises code (bouton #) quand tu poste du code c'est beaucoup plus lisible.

    Jusque là tout va bien, cependant dans l'exécution de ma macro, celle-ci ajoute des lignes donc modifie le résultat de la variable "fin" dans la fenêtre variable locale mais pas dans la boucle de la macro.
    C'est impossible de modifier la valeur de fin d'une boucle après le début de celle-ci.
    Je rejoins Menhir il vaut mieux boucler "a l'envers" (step -1)

  5. #5
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Dans ce cas, il convient de boucler avec une boucle Do ... Loop.
    A lire...

  6. #6
    Membre averti
    Homme Profil pro
    ingénieur logistique
    Inscrit en
    Mai 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : ingénieur logistique

    Informations forums :
    Inscription : Mai 2016
    Messages : 23
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Bonjour,

    Utilise les balises code (bouton #) quand tu poste du code c'est beaucoup plus lisible.


    C'est impossible de modifier la valeur de fin d'une boucle après le début de celle-ci.
    Je rejoins Menhir il vaut mieux boucler "a l'envers" (step -1)
    Bonjour,

    J'y penserai merci pour le conseil.

    Je vais tester votre solution et voir ce que cela peut donner.

    Je vous remercie et vous tiens au courant.

  7. #7
    Membre averti
    Homme Profil pro
    ingénieur logistique
    Inscrit en
    Mai 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : ingénieur logistique

    Informations forums :
    Inscription : Mai 2016
    Messages : 23
    Par défaut
    Bonjour,

    Je tenais à vous remercier, grâce à vos conseils j'ai réussi à faire ce que je recherchai via Step -1.

    Bonne journée à vous.

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par thibeau67 Voir le message
    Initialement la longueur de la liste peut varier donc je recherche via VBA la dernière ligne non vide et je l'affecte à une variable "fin".

    Puis pour le traitement de chaque liste je passe par la fonction For i = 2 to fin.
    Il serait plus simple de montrer le code.

    Jusque là tout va bien, cependant dans l'exécution de ma macro, celle-ci ajoute des lignes donc modifie le résultat de la variable "fin" dans la fenêtre variable locale mais pas dans la boucle de la macro.
    Si ta macro consiste à insérer des lignes, il est FORTEMENT conseillé de faire la scrutation de ligne en allant de la fin au début (en remontant).
    En terme VBA, c'est faire un For To avec un Step -1.
    Ca simplifie beaucoup l'algorithme.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Déclaration d'une variable "dynamique" dans une boucle
    Par docjo dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/11/2013, 23h08
  2. Réponses: 6
    Dernier message: 10/01/2013, 11h07
  3. [Batch] Evaluation d'une variable modifiée dans une boucle FOR
    Par dedz dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/10/2009, 17h55
  4. Nom de variables indexés dans une boucle FOR-END
    Par matthieu.gaudet dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/05/2008, 18h11
  5. [Syntaxe] Variable locale dans une boucle for
    Par Kaeguri dans le forum C++
    Réponses: 3
    Dernier message: 04/05/2007, 09h09

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