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 :

For/next + If + EntireRow.Delete ne supprime qu'une ligne sur deux [XL-MAC 2011]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2017
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 79
    Points : 54
    Points
    54
    Par défaut For/next + If + EntireRow.Delete ne supprime qu'une ligne sur deux
    Bonjour

    Dans une colonne A je numéro mes lignes de 1 à 10
    Dans une colonne B je met la valeur 1 sur les 10 lignes

    Dans un module j'intègre la macro ci-dessous qui a pour but de supprimer toutes les lignes qui auraient la valeur 1 en colonne B. Donc ici, toutes les 10 lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub EntireRow.delete()
     
                             For i = 1 To Cells(1, 1).End(xlDown).Row
                                    If Cells(i, 2) = 1 Then
                                    Cells(i, 1).EntireRow.Delete
     
                                    End If
                            Next
        End Sub
    Et bien seules les lignes 1, 3, 5, 7 et 9 ont été supprimées.
    Il reste les lignes 2, 4, 6, 8 et 10.

    Pourquoi?
    Comment puis-je supprimer toutes les lignes?

    Merci par avance.

  2. #2
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,

    Quand on supprime des lignes dans une boucle, on fait la boucle en sens inverse !
    Pourquoi ? Prenons l'exemple suivant :
    ligne 1 : 2
    ligne 2 : 1
    ligne 3 : 1
    ligne 4 : 2
    ligne 5 : 5
    ligne 6 : 1
    On veut supprimer les lignes où apparaît 1. On fait une boucle sur le numero de ligne
    • Iteration 1 : ligne n°1. Pas de 1, on passe à l'itération suivante.
    • Iteration 2 : ligne n°2. Il y a un 1 : on supprime la ligne. Le tableau est maintenant :
      ligne 1 : 2
      ligne 2 : 1
      ligne 3 : 2
      ligne 4 : 5
      ligne 5 : 1
      On passe à l'itération suivante.
    • Iteration 3 : ligne n°3. Pas de 1.

    Et là, patatatra On a loupé une ligne avec un 1 ! En effet, en supprimant une ligne on a tout décalé et le 1 se trouve en ligne 2, ligne que l'on a déjà visité dans la boucle.
    Je te laisse faire ce petit exemple avec une boucle en sens inverse : on part de la dernière ligne et on va jusqu'à la première. Tu verras qu'à ce moment là, on n'a pas ce problème.

    Et, maintenant, tu te demandes : comment fait-on une boucle en sens inverse? Avec le mot clef Step :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 5 To 1 Step -1
        MsgBox i
    Next i
    J'espère que ça marchera mieux comme ça

  3. #3
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonsoir buigui et riaolle,

    une petite démo rapide et bâclé, mais qui montre qu'il n y a nul besoin de boucle et surtout si la plage est vraiment vraiment très grande !
    Ici on va s'amuser à supprimer les "A" (tableau ci-dessous à mettre en colonne A à partir de A1)

    A
    B
    B
    A
    A
    B
    A
    G
    S
    H
    A
    F
    A
    H
    A
    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
    Sub Demo()
        DL = Cells(Rows.Count, 1).End(xlUp).Row
        With Range("B1:B" & DL)
            .FormulaLocal = "=SI($A1 = ""A"";1;0)"
            .Value = .Value
        End With
        With Cells(1).CurrentRegion
            .Sort Cells(2), xlAscending, Header:=xlNo
            V = Application.Match(1, .Columns(2), 0)
            If Not IsError(V) Then
                Rows(V & ":" & .Rows.Count).EntireRow.Delete
            End If
            .Columns(2).Clear
        End With
    End Sub
    Spécial dédicace à Marc et Jacques
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Salut Ryu !



    Et pour une seule colonne on peut l'effectuer directement par une formule de calculs via Evaluate puis Filter, …
    Compter environ trois lignes de code …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    En effet Marc
    Mais ce satané "Filter" ne marche pas sur Excel Mac 2011 (pas testé sur 2016 mais je suppose que c'est pareil puisque M$ à laissé des bugs de la version 2011)
    en tout cas solution élégante et efficace
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Ah oui désolé, j'avais oublié la spécificité MAC remplie de bugs ! …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2017
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Hello Riaolle

    Ca marche, merci!


  8. #8
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2017
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Hello Ryu

    Quel serait l'intêret de remplacer la boucle par ton script stp?

  9. #9
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Hi,
    Dans la démo, je suis en train de montrer que l'on peut supprimer toutes les lignes en une seule fois, et non 1 à 1 comme dans la boucle.
    Imagine que tu as 15000 lignes et que ta boucle doit en supprimer 1500 1 à 1.
    Pour le code c'est légèrement lourd et ça prends plus de temps que de supprimer en une seule fois.
    Imagine maintenant que tu as plus de 100000 lignes et xxxx lignes à supprimer … alors ?
    Le faire en boucle ou choisir la suppression en 1 seule fois ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  10. #10
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2017
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Ca fonctionne, c'est génial!

  11. #11
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    J'essaye de vous suivre... mais je suis un peu loin derrière...
    en clair pour mon fichier d'environ 5000 lignes comment supprimer les lignes qui ont un "X" dans une colonne particulière (la 39) en une seule fois...
    Ma macro en boucle marche très bien mais en 2mn, si je peux améliorer c'est bien si ça reste lisible pour moi..

    Vos discussions sont passionnantes, ou plutôt seront... c'est ma première macro... pensez-y..
    Merci
    Il ne savait pas que c'était impossible, donc il l' a fait...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2016, 19h10
  2. [2008R2] delete une ligne sur deux
    Par Papy214 dans le forum Développement
    Réponses: 2
    Dernier message: 14/03/2014, 11h21
  3. Supprimer vbCrLf d'une ligne sur deux
    Par SierraGolf3 dans le forum VBScript
    Réponses: 2
    Dernier message: 04/01/2014, 16h46
  4. Supprimer une ligne sur deux feuilles du même classeur
    Par apdf1 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 12/03/2011, 12h28
  5. Réponses: 9
    Dernier message: 17/02/2011, 17h14

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