1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    janvier 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 : 20
    Points : 12
    Points
    12

    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
    Étudiant
    Inscrit en
    octobre 2016
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 22
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2016
    Messages : 1 478
    Points : 2 426
    Points
    2 426

    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
    Membre émérite
    Homme Profil pro
    PAO
    Inscrit en
    octobre 2014
    Messages
    1 774
    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 : 1 774
    Points : 2 957
    Points
    2 957

    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

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

    Si cette réponse vous a aidé, n'hésitez pas à cliquer sur , dans le cas contraire ne faites rien , mais si vous êtes pas content -- Pensez à la Balise [ code][/code ] => Exemple

    Pensez à mettre une fois votre problème solutionné

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    8 722
    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 : 8 722
    Points : 17 341
    Points
    17 341

    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, …
    . . . . . Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !

  5. #5
    Membre émérite
    Homme Profil pro
    PAO
    Inscrit en
    octobre 2014
    Messages
    1 774
    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 : 1 774
    Points : 2 957
    Points
    2 957

    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

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

    Si cette réponse vous a aidé, n'hésitez pas à cliquer sur , dans le cas contraire ne faites rien , mais si vous êtes pas content -- Pensez à la Balise [ code][/code ] => Exemple

    Pensez à mettre une fois votre problème solutionné

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2013
    Messages
    8 722
    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 : 8 722
    Points : 17 341
    Points
    17 341

    Par défaut





    Ah oui désolé, j'avais oublié la spécificité MAC remplie de bugs ! …
    . . . . . Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    janvier 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 : 20
    Points : 12
    Points
    12

    Par défaut

    Hello Riaolle

    Ca marche, merci!


  8. #8
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    janvier 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 : 20
    Points : 12
    Points
    12

    Par défaut

    Hello Ryu

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

  9. #9
    Membre émérite
    Homme Profil pro
    PAO
    Inscrit en
    octobre 2014
    Messages
    1 774
    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 : 1 774
    Points : 2 957
    Points
    2 957

    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

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

    Si cette réponse vous a aidé, n'hésitez pas à cliquer sur , dans le cas contraire ne faites rien , mais si vous êtes pas content -- Pensez à la Balise [ code][/code ] => Exemple

    Pensez à mettre une fois votre problème solutionné

  10. #10
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    janvier 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 : 20
    Points : 12
    Points
    12

    Par défaut

    Ca fonctionne, c'est génial!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2017
    Messages : 74
    Points : 46
    Points
    46

    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

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2016, 20h10
  2. [2008R2] delete une ligne sur deux
    Par Papy214 dans le forum Développement
    Réponses: 2
    Dernier message: 14/03/2014, 12h21
  3. Supprimer vbCrLf d'une ligne sur deux
    Par SierraGolf3 dans le forum VBScript
    Réponses: 2
    Dernier message: 04/01/2014, 17h46
  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, 13h28
  5. Réponses: 9
    Dernier message: 17/02/2011, 18h14

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