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 ligne si cellule suivante est identique [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de camzo
    Homme Profil pro
    ingénieur en documentation
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur en documentation
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Par défaut supprimer ligne si cellule suivante est identique
    Bonjour à toutes et à tous,

    J'ai besoin de supprimer automatiquement les lignes qui contiennent une même valeur dans la colonne A en sachant que seule dernière ligne contenant un doublon doit être conservée. VOici un exemple pour expliciter mon propos:

    REFERENCE REFERENCE 2 INDICE ORIGINE
    REF1 REF_ABC INDICE_1 PARIS
    REF1 REF_ERT INDICE_2 PARIS
    REF1 REF_DBE INDICE_3 PARIS
    REF2 REF_FTC INDICE_1 PARIS
    REF2 REF_DRTC INDICE_2 PARIS
    REF3 REF_XXX INDICE_1 PARIS
    REF3 REF_YYY INDICE_2 PARIS


    Ce que je cherche à faire, c'est supprimer les lignes 1,2,4 et 6 pour ne conserver que les lignes 3, 5 et 7:

    REFERENCE REFERENCE 2 INDICE ORIGINE
    REF1 REF_DBE INDICE_3 PARIS
    REF2 REF_DRTC INDICE_2 PARIS
    REF3 REF_YYY INDICE_2 PARIS

    J'ai commencé mes recherches de débutant. Voici où en j'en suis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim FirstRow As Long
    FirstRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlNext).Row
    Dim x As Long
    For x = FirstRow - 1 To 9 Step -1
      If Cells(x, 2) = Cells(x - 1, 2) Then
         Rows(x).EntireRow.Delete
      End If
    Next x
    Je pense que les connaisseurs vont hurler car ma ligne pour la FirstRow semble correct (je pars du haut du tableau et je descends horizontallement) mais la suite ne colle pas car cela vient d'un code qui remonte une liste au lieu de la descendre. Mais, je ne sais comment n'y prendre, surtout que je vois pas comment dire à Excel de procéder à l'identification des doublons sur la colonne A et de ne garder que le dernier MAIS ensuite de supprimer les lignes correspondantes.

    Quelqu'un a-t-il une idée ?

  2. #2
    Expert éminent
    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
    Par défaut
    Bonjour !

    J'ai bien une idée réalisable déjà manuellement donc sans code et s'il y a beaucoup de lignes à traiter
    bien plus rapide qu'une procédure utilisant une boucle dont on peut se passer et ce rien qu'avec le BA-BA d'Excel !
    (Sinon logiquement avec Excel une boucle de suppression de lignes doit partir évidemment du bas de la liste et remonter …)

    • Utiliser une colonne temporaire dans laquelle une simple formule de calculs effectue la comparaison
      retournant VRAI pour les lignes à supprimer, FAUX pour celles à conserver …

    • Filtrer cette colonne sur VRAI puis supprimer les lignes, annuler le filtre et effacer le contenu de la colonne temporaire.

    Évidemment en activant l'Enregistreur de macros puis en opérant manuellement, une base de code est livrée sur un plateau !

    ___________________________________________________________________________________________________________
    Je suis Paris, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une autre approche possible manuellement (et donc réalisable en VBA)

    1) insérer une nouvelle colonne
    2) utiliser la formule =LIGNE() pour obtenir le numéro de la ligne
    3) remplacer les formules par les valeurs pour figer les numéros
    4) tri décroissant sur cette colonne temporaire
    5) utiliser l'outil de nettoyage de doublons (Données>>Supprimer les doublons) basé uniquement sur la colonne A

  4. #4
    Membre confirmé Avatar de camzo
    Homme Profil pro
    ingénieur en documentation
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur en documentation
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Par défaut
    Merci pour ces retours!

    Pour info, je réalise déjà à ce jour cette étape avec une fonction Excel (un bon vieux =IF(A1=A2;"to delete";""to keep" puis je sélectionne les "to delete" et je supprime les lignes) mais cela s'opère sur environ 70 000 lignes, faisant ramer mon PC professionnel au possible ! J'y passe environ 5 min, ce qui est vraiment chronophage car cette étape n'est que la 12è d'une longue série! Bref, je m'oriente vers une macro contenant toutes ces étapes pour qu'elle soient opérées automatiquement à la suite, me laissant du temps pour une autre tâche (le top surtout lorsque je dois déléguer cela à un/une collègue si meeting ou congés).

    Voici du coup ce que j'ai fait suite à vos conseils
    :
    - ajouter une colonne temporaire en deuxième position

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("B1").Value = "PREV LAST"
    - inclure mon IF du dessus pour obtenir DELETE ou KEEP

    Pour l'instant, je n'ai trouvé la solution que pour une ligne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If [A2] = [A3] Then
    [B2] = "DELETE"
    Else: [B2] = "KEEP"
    End If
    - sélectionner les DELETE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Range("A:D").AutoFilter _
     field:=2, _
     Criteria1:="DELETE", _
    - supprimer les DELETE (lignes visibles hormis la ligne d'entête)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "D").End(xlUp).Row
    Range("A2:D" & lastRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    - désactiver le filtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Document").AutoFilterMode = False
    - supprimer la colonne temporaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Columns(2).EntireColumn.Delete
    Bref, ça fonctionne bien, hormis l'étape du je veux voir DELETE si cellule de droite + cellule de droite en dessous...
    Je ne vois vraiment pas comment je dois m'y prendre côté code... Une piste serait la bienvenue !!!

    Cordialement,
    Camille

  5. #5
    Membre confirmé Avatar de camzo
    Homme Profil pro
    ingénieur en documentation
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur en documentation
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Par défaut
    J'ai trouvé !!!!!! yahouuuuuuuuuuuu !!!

    A place du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If [A2] = [A3] Then
    [B2] = "DELETE"
    Else: [B2] = "KEEP"
    End If
    J'ai mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim LastRow As Long
     
    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
     
    With Sheets("Document").Range("A:D")
    For c = LastRow To 2 Step -1
        If ActiveSheet.Range("A" & c).Value <> ActiveSheet.Range("A" & c + 1) Then
            ActiveSheet.Range("B" & c) = "KEEP"
            Else
            ActiveSheet.Range("B" & c) = "DELETE"
        End If
    Next c
    End With
    Je suis méga content !!!

    Merci encore une fois pour la piste et bonne journée.

    Camzo

  6. #6
    Membre Expert
    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
    Par défaut
    Bonjour,

    Si il fallait vraiment le faire en VBA, une simple formule suffisait à utiliser par l'intermédiaire de Range.Formula.
    la formule serait appliqué en colonne B avec la simple formule SI
    Exemple : =SI(A3<>A4;"KEEP";"DELETE")
    cette formule peut être aménagé à sa convenance on peut préciser sur quelle feuille par exemple en insérant une variable du nom de la feuille, Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Feuille = "TOTO"
    'Feuille = ActiveSheet.Name
    'Feuille = Sheets(1).Name
    Feuille = "Document" ' Etc …
    AutreFeuille = "Nom de l'autre feuille"
    Application.ScreenUpdating = False
    With Sheets(Feuille)
        DL = Sheets(Feuille).Cells(Rows.Count, 1).End(xlUp).Row
        .Range("B2:B" & DL).Formula = "=IF(A2<>A3,""KEEP"",""DELETE"")" 'on pourrait définir l'origine d'une autre feuille aussi
        '.Range("B2:B" & DL).Formula = "=IF(" & AutreFeuille & "!A2<>" & AutreFeuille & "!A3,""KEEP"",""DELETE"")"
        .Range("B2:B" & DL).Value = .Range("B2:B" & DL).Value
    End With
    Application.ScreenUpdating = True
    Point besoin de boucle; il suffit après de fixer la valeur de la plage comme dans le code ci-dessus
    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 :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  7. #7
    Expert éminent
    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
    Par défaut
    Citation Envoyé par camzo Voir le message
    mais cela s'opère sur environ 70 000 lignes, faisant ramer mon PC professionnel au possible !
    Évidemment c'est forcément lent via une boucle et la méthode Delete ‼ A proscrire …

    Déjà manuellement avec le B-A-BA d'Excel cela prend moins d'une minute !
    Il suffit d'utiliser une colonne temporaire pour y inscrire une formule avec un résultat VRAI pour les lignes à supprimer
    puis sur la plage d'effectuer un tri croissant sur cette colonne, alors toutes les lignes à VRAI se retrouvent à la fin de la liste
    et enfin les effacer (méthode Clear) - et non pas supprimer - en un bloc : c'est quasi instantané !
    Et l'Enregistreur de macro apportant sur un plateau une base de code …

    Donc pour conclure un bon code de suppression n'utilise pas de boucle ni la méthode Delete

  8. #8
    Membre Expert
    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
    Par défaut
    un Exemple concret à adapter selon ce que l'on veut :
    https://www.developpez.net/forums/d1...e/#post9205474
    PS : Comme conseillé par Marc (que je salut au passage ) tu peux remplacer EntireRow.Delete par EntireRow.Clear ou
    même paramétrer juste la plage à effacer avec clear au lieu des lignes entières
    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 :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

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

Discussions similaires

  1. Macro supprimer ligne si cellule d est vide
    Par vinvin02 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/01/2016, 12h41
  2. [XL-2003] Supprimer ligne si cellule vide ou
    Par guigui69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/05/2011, 09h32
  3. [XL-2000] Supprimer ligne si cellule d'une colonne = 0, sur une plage de cellules
    Par audesara dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/05/2011, 16h16
  4. supprimer ligne tableau si A est vide
    Par flyhb dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/03/2008, 23h30
  5. Extraire lignes dont le debut est identique
    Par Raoul555 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 19/05/2007, 11h01

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