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 :

Boucle for qui ne s'arrête pas


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    Laborantine et informaticienne de gestion ES
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Laborantine et informaticienne de gestion ES
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Boucle for qui ne s'arrête pas
    Hello tout le monde,

    J'ai un problème avec une boucle For. Cette dernière ne s'arrête pas quand l'indice (i) a atteint le nombre maximal (v_derniere) et continue, ce qui me fait donc une boucle infinie.
    Et je ne comprend pas pourquoi.

    Voici mon 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
     
    Sub supprimer()
     
    Dim i As Integer
    Dim v_derniere As Integer
     
     
     
    'Calcul du nombre d'OF dans la liste
    v_derniere = Cells(65535, 6).End(xlUp).Row
     
     
    For i = 3 To v_derniere
     
        If Cells(i, 6).Value = "" Then
     
         Cells(i, 1).Delete Shift:=xlUp
         Cells(i, 2).Delete Shift:=xlUp
         Cells(i, 3).Delete Shift:=xlUp
         Cells(i, 4).Delete Shift:=xlUp
         Cells(i, 5).Delete Shift:=xlUp
         Cells(i, 6).Delete Shift:=xlUp
         Cells(i, 7).Delete Shift:=xlUp
     
         i = i - 1
         v_derniere = Cells(65535, 6).End(xlUp).Row
     
        End If
     
    Next i
     
    End Sub
    Est-ce que quelqu'un peut m'aider ?

    Merci d'avance
    Charline

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    A la première lecture rapide de ta procédure, il suffit de supprimer la ligne 25 qui ne sert strictement à rien mis à part perturber la boucle. La variable I est incrémentée par la boucle (For To Next)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre à l'essai
    Femme Profil pro
    Laborantine et informaticienne de gestion ES
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Laborantine et informaticienne de gestion ES
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Hello Philippe,

    La ligne 25 sert à dire : je veux recommencer le contrôle (if...) au numéro de ligne où ma ligne a été supprimée.

    Si je ne mets pas cette partie du code, toutes les lignes ne seront pas vérifiées...

    Alors peut-être que ça fonctionnera si j'enlève cette ligne, mais ça ne fera pas ce que je veux.

  4. #4
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Salut,


    En lisant rapidement, dans un premier temps, il faut que tu fasses ta boucle dans l'autre sens :

    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
     
    Sub supprimer()
     
    Dim i As Integer
    Dim v_derniere As Integer
     
     
     
    'Calcul du nombre d'OF dans la liste
    v_derniere = Cells(65535, 6).End(xlUp).Row
     
     
    For i = v_derniere To 3 step -1 
     
        If Cells(i, 6).Value = "" Then
     
         Cells(i, 1).Delete Shift:=xlUp
         Cells(i, 2).Delete Shift:=xlUp
         Cells(i, 3).Delete Shift:=xlUp
         Cells(i, 4).Delete Shift:=xlUp
         Cells(i, 5).Delete Shift:=xlUp
         Cells(i, 6).Delete Shift:=xlUp
         Cells(i, 7).Delete Shift:=xlUp
         v_derniere = Cells(65535, 6).End(xlUp).Row
     
        End If
     
    Next i
     
    End Sub
    Tu n'auras alors plus de souci de boucle infinies, et les lignes voulues seront supprimées.
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  5. #5
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par illight Voir le message
    En lisant rapidement, dans un premier temps, il faut que tu fasses ta boucle dans l'autre sens :
    +1
    Quand on fait des suppressions, toujours aller de bas en haut.

    Pour simplifier ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub supprimer()
     
    Dim i As Long
     
    For i = Cells(Rows.Count, 6).End(xlUp).Row To 3 step -1 
        If Cells(i, 6).Value = "" Then Range(Cells(i, 1),Cells(i, 7)).Delete Shift:=xlUp
    Next i
     
    End Sub
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Laborantine et informaticienne de gestion ES
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Laborantine et informaticienne de gestion ES
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par illight Voir le message
    Salut,


    En lisant rapidement, dans un premier temps, il faut que tu fasses ta boucle dans l'autre sens :

    Tu n'auras alors plus de souci de boucle infinies, et les lignes voulues seront supprimées.
    Citation Envoyé par Menhir Voir le message
    +1
    Quand on fait des suppressions, toujours aller de bas en haut.

    Pour simplifier ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub supprimer()
     
    Dim i As Long
     
    For i = Cells(Rows.Count, 6).End(xlUp).Row To 3 step -1 
        If Cells(i, 6).Value = "" Then Range(Cells(i, 1),Cells(i, 7)).Delete Shift:=xlUp
    Next i
     
    End Sub

    Merci à vous deux ! Ca fonctionne très bien !

    Je ne savais pas qu'il fallait faire dans le sens inverse en cas de suppression ! Vous m'avez appris quelque chose ! Je vais pouvoir changer quelques autres lignes de code

    Merci beaucoup !
    Charline

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut,

    Dans une boucle For,
    For Index = IndexStart To IndexEnd Step IndexStep,
    seul Index est potentiellement variable, les 3 autres parties sont stocké en tant que constantes.
    Elles sont évalués une seule fois lors de l'initialisation de la boucle.
    Donc, quand tu écris dans une boucle (Entre le For et le Next) IndexEnd = xxx, ce n'est pas pris en compte.
    Il faut réinitialiser la boucle pour que le nouveau IndexEnd soit pris en compte.


    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
     
    Sub BoucleTest()
        Dim Index As Long
        Dim IndexStart As Long, IndexEnd As Long, IndexStep As Long
     
        Index = 1
        IndexStart = 1
        IndexEnd = 10
        IndexStep = 1
     
        For Index = IndexStart To IndexEnd Step IndexStep
            Debug.Print Index
            IndexStart = IndexStart + 1
            IndexEnd = IndexEnd - 1
            IndexStep = IndexStep + 1
        Next
    End Sub
    Comme tu le vois, le fait de modifier les 3 variables (IndexStart, IndexEnd et IndexStep) ne change pas le déroulement de la boucle (il y a bien 10 itération) car elles sont toutes les 3 stockés en tant que constante. Seul Index est modifiable.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Laborantine et informaticienne de gestion ES
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Laborantine et informaticienne de gestion ES
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci pour l'explication

  9. #9
    Invité
    Invité(e)
    Par défaut
    De rien

    @+

  10. #10
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Cha_rline Voir le message
    Je ne savais pas qu'il fallait faire dans le sens inverse en cas de suppression !
    Ca n'a rien d'obligatoire mais, comme le prouve la simplification sur ton code, c'est beaucoup plus pratique.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

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

Discussions similaires

  1. une boucle for qui ne fonctionne pas
    Par piffeo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/11/2008, 21h52
  2. BATCH : Boucle FOR qui ne boucle pas ?!
    Par agyar dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 25/10/2008, 11h27
  3. Boucle for qui ne boucle pas !
    Par polothentik dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 18/04/2008, 10h50
  4. boucle for qui ne marche pas
    Par Invité dans le forum Langage
    Réponses: 16
    Dernier message: 12/06/2006, 10h59
  5. [VBA-E]une boucle qui ne s'arrète pas
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/02/2006, 18h05

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