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 each plante


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Août 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 11
    Par défaut Boucle for each plante
    Bonjour,
    Dans une feuille Excel j'ai 2 colonnes colonne A et B (voir ci dessous le code) et à l'aide d'une boucle for each commençant par la fin je veux supprimer les lignes vides de la colonne B tout va bien jusqu'à la ligne 7 mais la ligne 6 n'est jamais supprimée car la macro se termine subitement et si j'exécute une seconde fois le code la ligne est bien supprimée mais j'ai une erreur 1004 (erreur définie par l'application ou par l'objet) c'est quand même étonnant que tout s'arrête à la ligne 6 alors que tout fonctionne pour les autres lignes
    NOM CODE
    Nom1 1
    Nom2 2
    Nom3 3
    Nom4 4
    Nom5 5
    Nom6
    Nom7 7
    Nom8 8
    Nom9
    Nom10 10
    Nom11 11
    Nom12 12
    Nom13 13
    Nom14 14
    Nom15 15
    Nom16
    Nom17
    Nom18
    Nom19 12
    Nom20
    Nom21 11
    Nom22
    Nom23
    Nom24

    voici le code
    Sub suppligne3()
    Dim L As Integer
    Dim c As Integer
    der = Range("A" & Rows.Count).End(xlUp).Row
    L = der
    c = 2
    For Each cell In Range("A2:A25")
    If Cells(L, c) = "" Then
    Cells(L, c).EntireRow.Delete

    End If
    L = L - 1
    Next

    End Sub

    Merci pour la réponse

  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
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une boucle For...Each parcoure une collection du premier élément vers le dernier et donc là vous faites du sur place. Placez cette simple instruction Debug.Print cell(L, c).Address dans la boucle pour vous en rendre compte.
    Utilisez plutôt une boucle For...To...Next avec un Step -1
    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 Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Salut,

    Généralement, modifier (ajouts / suppressions) un conteneur sur lequel on est en train d'itérer n'est pas une bonne idée, pour la simple et bonne raison que des élements sont "oubliés"
    Construit toi une collection d'elements à supprimer, et ensuite tu les supprimes via une seconde boucle. Ce sera autrement plus propre.
    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
    Dim Wb As Excel.Workbook
    Set Wb = ThisWorkbook
     
    Dim Ws As Excel.Worksheet
    Set Ws = Wb.Worksheets("Feuil1")
     
    Dim itemsToDelete As Collection
    Set itemsToDelete = new Collection
     
        '// Collecte les lignes a supprimer
    Dim Cell As Excel.Range
    For Each Cell in Ws.Range("A2:A25").Cells
        If(Cell.Value = VbNullString) Then
            itemsToDelete.Add Cell.EntireRow
        End If
    Next
     
        '// Supprime les lignes
    Dim item As Variant
    For Each item In itemsToDelete
        item.Delete
    Next
    PS: La boucle For ... Each parcours toujours un conteneur du premier item vers le dernier.
    Il n'y a pas de notion de direction, sens ou ordre.

    De plus,:
    - Ton calcul de la dernière ligne, soit ne sert à rien, soit tu as oublié de l'utiliser.
    - Précise toujours la parentalité des objets, ca t'éviteras de sales surprises.

  4. #4
    Membre averti
    Inscrit en
    Août 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 11
    Par défaut
    Merci pour ces réponses
    Bonne journée

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

Discussions similaires

  1. boucle for each
    Par jadey dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/08/2006, 20h50
  2. [VBA-E]PB sur une boucle for each next
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/07/2006, 15h47
  3. aide vba boucle for each paramétrée en range
    Par gotlieb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2006, 08h55
  4. [VBA-E] erreur boucle for each
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/02/2006, 16h38
  5. Boucle For each
    Par roots_man dans le forum ASP
    Réponses: 10
    Dernier message: 18/02/2005, 09h55

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