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 :

Supprimer des lignes selon une condition


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Chargé d'étude
    Inscrit en
    Mars 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'étude

    Informations forums :
    Inscription : Mars 2014
    Messages : 50
    Points : 49
    Points
    49
    Par défaut Supprimer des lignes selon une condition
    Bonjour,

    Débutant en vba je souhaite automatiser certaines taches sur Excel.

    J'ai un fichier de 8000 lignes, ce que j'aimerai faire c'est supprimer toutes les lignes qui ne contiennent pas la valeur 12 dans la colonne AP.

    J'ai essayé ce code. Mais il me supprime les en-tête de colonne et prend énormément de temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Supprime()
        For Each cellule In Range("AP1:AP8000")
            If cellule.Value <> "12" Then Rows(cellule.Row).Delete
        Next
    End Sub
    Je suis sur qu'il y a un autre moyen pour supprimer les lignes.

    Merci de votre aide.

  2. #2
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,
    As-tu essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Supprime()
    For i = 1 to Range("AP65536").end(xlup).row
          If cellule.Value <> "12" Then Rows(i & ":" & i).Delete shift:=xlUp
    Next
    End Sub
    ?

    Cordialement,

  3. #3
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,
    quand on supprime des lignes dans une boucle, on commence par la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Supprime()
    Dim Dl As Range, i As Long
    With Sheets("Feuil1")  'a remplacer par le nom de feuille
      Set Dl = .Range("AP" & .Rows.Count).End(xlUp)
      For i = Dl.Row To 2 Step -1
          If .Range("AP" & i) <> "12" Then Rows(i).EntireRow.Delete
      Next i
    End With
    End Sub
    mais ça ne résoudra pas le problème de rapidité, peut-être faut'il passer par un tableau !

    Autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Supprime()
    Dim Dl As Range
    With Sheets("Feuil1")  'a remplacer par le nom de feuille
      Set Dl = .Range("AP" & .Rows.Count).End(xlUp)
        .Range("AP2", Dl).AutoFilter Field:=1, Criteria1:="<>12", _
            Operator:=xlAnd
        .Range("AP2", Dl).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        .AutoFilterMode = False
    End With
    End Sub

  4. #4
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Yes ! Exact ! J'ai oublié ce détails sur la boucle !

  5. #5
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Citation Envoyé par Gado2600 Voir le message
    Yes ! Exact ! J'ai oublié ce détails sur la boucle !
    re,
    De toutes façon, je pense que ma dernière proposition gagne énormément en rapidité

    Bonne journée

  6. #6
    Membre du Club
    Homme Profil pro
    Chargé d'étude
    Inscrit en
    Mars 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'étude

    Informations forums :
    Inscription : Mars 2014
    Messages : 50
    Points : 49
    Points
    49
    Par défaut
    Merci à tous les deux pour vos réponses;

    Casefayere, la 1ère macro que tu m'as proposé fonctionne bien et je comprends a peu prés le code. Juste une question pourquoi allons nous jusque 2 dans la boucle For i = Dl.Row To 2

    Le deuxième fonctionne et gagne en rapidité mais à vrai dire je ne comprends pas vraiment le code...

    Citation Envoyé par casefayere Voir le message
    Autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Supprime()
    Dim Dl As Range
    With Sheets("Feuil1")  'a remplacer par le nom de feuille
      Set Dl = .Range("AP" & .Rows.Count).End(xlUp)
        .Range("AP2", Dl).AutoFilter Field:=1, Criteria1:="<>12", _
            Operator:=xlAnd
        .Range("AP2", Dl).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        .AutoFilterMode = False
    End With
    End Sub

    Bonne journée.

  7. #7
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    ...Juste une question pourquoi allons nous jusque 2 dans la boucle For i = Dl.Row To 2
    Parce que j'imagine que la 1ère ligne est réservée aux titres de colonne

    Le deuxième fonctionne et gagne en rapidité mais à vrai dire je ne comprends pas vraiment le code...
    je passe par un filtre qui sélectionne les lignes non désirées, les supprime et j'enlève le filtre. Si tu fais le code en mode "pas à pas", tu pourras voir ce qui se passe au fur et à mesure, sinon je te renvoie le code avec explications

  8. #8
    Membre du Club
    Homme Profil pro
    Chargé d'étude
    Inscrit en
    Mars 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'étude

    Informations forums :
    Inscription : Mars 2014
    Messages : 50
    Points : 49
    Points
    49
    Par défaut
    Merci pour les infos, je vois à peu prés. Il faut que je familiarise avec les expressions.

  9. #9
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Quelques explications, n'hésites pas à utiliser l'aide en sélectionnant le ou les mots clé que tu ne comprends pas et en cliquant sur F1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Supprime()
    Dim Dl As Range 'variable objet qui stockera la cellule recherchée (la dernière dans notre cas)
    With Sheets("Feuil1")  'a remplacer par le nom de feuille, pour With, voir dans l'aide
      Set Dl = .Range("AP" & .Rows.Count).End(xlUp) 'on recherche donc la dernière cellule en col "AP" que l'on stocke en Dl
        .Range("AP2", Dl).AutoFilter Field:=1, Criteria1:="<>12", _
            Operator:=xlAnd 'je lance un filtre qui sélectionne les cellules <> 12
        .Range("AP2", Dl).SpecialCells(xlCellTypeVisible).EntireRow.Delete 'je supprime toutes les lignes visibles
        .AutoFilterMode = False 'et j'enlève le filtre
    End With
    End Sub

  10. #10
    Membre du Club
    Homme Profil pro
    Chargé d'étude
    Inscrit en
    Mars 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'étude

    Informations forums :
    Inscription : Mars 2014
    Messages : 50
    Points : 49
    Points
    49
    Par défaut
    Merci pour les explications je vais potasser les fonctions.

    En tout cas j'y vois plus clair.

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

Discussions similaires

  1. parcourir une liste et supprimer des éléments selon une condition
    Par jean-pat dans le forum Général Python
    Réponses: 17
    Dernier message: 17/03/2017, 22h07
  2. [XL-2007] Comment supprimer des lignes d'une plage dans une colonne sous condition
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 05/06/2015, 11h34
  3. [WD17] Supprimer des lignes d'une table sous condition
    Par alex1005 dans le forum WinDev
    Réponses: 7
    Dernier message: 15/10/2012, 14h27
  4. Supprimer des doublons selon une condition
    Par chloe44 dans le forum SAS Base
    Réponses: 4
    Dernier message: 04/04/2012, 10h28
  5. [XL-2003] VBA supprimer des ligne selon la date d'une cellule
    Par Scrabblouille dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/08/2009, 22h37

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