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 avec condition [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 226
    Par défaut Supprimer Ligne avec condition
    Bonjour les amis,

    J'ai un programme à éditer mais je m'embrouille les pinceaux.

    Je dois supprimer des doublons jusque la vous allez me dire facile , mais la ou je cale c'est que je dois faire une suppression lorsqu'un cas précis se présente.

    Ci-joint le fichier pour mieux vous éclairer.

    La règle que je dois éditer :

    Si doublon en colonne Q et col J la valeur de la cellule commence par "DZ" (cellule en rouge) et que la ligne en dessous i-1 il y à la valeur "FRMRS" (cellule en orange) alors on supprime la ligne qui commence par "DZ" et ainsi de suite.


    Voila j’espère être clair. L'objectif est de supprimer les lignes qui contiennent les cellules en rouge dans la colonne J. Je préfère tester la macro sur un petit programme mais le fichier de travail fait 3000 lignes donc je vous épargne lancement de macro trop longue ,mais le programme doit quand être capable de traiter de grandes quantités de lignes

    Merci d'avance,

    Bonne fin de w-k.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Par défaut
    bonsoir,

    Si j'ai bien compris ton problème, voilà un code qui semble répondre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Sub clearVbis()
        Dim numLigne As Long, nbLignes As Long
     
     
        nbLignes = Cells(Range("A:A").Count, 10).End(xlUp).Row
     
        For numLigne = 2 To nbLignes - 2
           If Left(Cells(numLigne, 10), 2) = "DZ" And Cells(numLigne + 1, 10) = Cells(numLigne, 10) And _
              Cells(numLigne + 2, 10) = "FRMRS" And Cells(numLigne, 17) = Cells(numLigne + 1, 17) Then
                                    Rows(numLigne + 1).EntireRow.Delete
           End If
        Next numLigne
     
        End Sub
    bien cordialement

    geogeo

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

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir geogeo70, nonesofar, le forum

    geogeo70, sans regarder plus loin, quand tu proposes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .......
    For numLigne = 2 To nbLignes - 2
    .....
    si on supprime des lignes, on commence la boucle par la fin donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .......
    For  numLigne = nbLignes To 2 Step -1
    .....
    en consequence, le reste est à revoir
    perso, je verrais le code comme ç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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub clearV4()
    Dim rebalayer As Boolean, Dcel As Long, x As Long, y As Long, Tb, Dbl As Object, Result()
    Dim a As Long
    Set Dbl = CreateObject("Scripting.Dictionary")
    With Sheets("test") 'choisir la bonne feuille
      Dcel = .Range("Q" & .Rows.Count).End(xlUp).Row
      Tb = .Range("A2", "AA" & Dcel)
      For x = 1 To UBound(Tb)
        Dbl(Tb(x, 17)) = ""
      Next x
    End With
    ReDim Result(1 To Dbl.Count, 1 To UBound(Tb, 2))
    y = 0
    For x = 1 To UBound(Tb, 1) - 1
      If Tb(x, 17) = Tb(x + 1, 17) And Tb(x, 10) Like "DZ*" Then
      Else
        y = y + 1
        For a = 1 To UBound(Tb, 2)
          Result(y, a) = Tb(x, a)
        Next a
      End If
    Next x
    'ci=dessous, attention de bien choisir la feuille de destination
    Sheets("test").Range("A2", "AA" & Dcel).Clear
    Sheets("test").Range("A2").Resize(UBound(Result, 1), UBound(Result, 2)) = Result
    End Sub
    bonne nuit à tou(te)$
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  4. #4
    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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Qu'il s'agisse d'exporter ou de supprimer des lignes d'une liste de données suivant critères, le filtre avancé peut être une excellente solution
    Pour en savoir plus, lecture du tutoriel Les filtres avancés ou élaborés dans Excel

    Donc, en utilisant le critère nommé
    Sans VBA, la formule sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET(NB.SI($Q$2:$Q$3000;Q2)>1;GAUCHE(J2;2)="DZ";J3="FRMRS")
    Avec VBA et la méthode AdvancedFilter avec la même formule mais traduite. Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =AND(COUNTIF($Q$2:$Q$37,Q2)>1,LEFT(J2,2)="DZ",J3="FRMRS")
    Un exemple Excel VBA – Supprimer des lignes suivant critères avec la méthode AdvancedFilter
    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

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 226
    Par défaut Merci
    Merci aux membres pour votre retour.

    Je vais analyser vos propositions . En fait je fais déjà un filtre personnalisé avant la suppression des lignes. Pour avoir les doublons triés en colonne Q et en J. Afin d'avoir DZ au dessus de FRMRS, du coup ça doit se rapprocher de l'idée de Philippe Tulliez.

    Merci à vous et bonne journée.

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 226
    Par défaut Aprés test
    Bonjour,

    J'ai testé les propositions qui fonctionnent toutes, mais je n'obtiens pas le résultat espéré.

    Pour casefayere c'est efficace mais ça supprime tout les doublons alors que je souhaite en garder certains car je traite les autres cas dans une macro à part.

    Pour geogeo70 il se trouve que le dernière cellule en rouge dans mon fichier d'exemple ne s'efface pas. Je sais pas pourquoi.

    Mais j'ai profité de la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(Cells(numLigne, 10), 2) = "DZ"
    pour faire un code qui me convient que voici.

    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
    23
    24
    Sub clearV2()
        Dim rebalayer As Boolean, numLigne As Long, nbLignes As Long, i As Long
     
        rebalayer = True
     
        While rebalayer
            nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
            rebalayer = False
            For numLigne = 2 To nbLignes
                For i = 2 To nbLignes
                    If numLigne <> i Then
                        If Cells(numLigne, 17) = Cells(i, 17) And Left(Cells(i, 10), 2) = "DZ" Then
                            If Cells(numLigne, 10) = "FRMRS" Then
                                    Rows(i).EntireRow.Delete
                                    rebalayer = True
                                    GoTo rebalayer
                            End If
                        End If
                    End If
                Next i
            Next numLigne
    rebalayer:
        Wend
        End Sub

  7. #7
    Membre chevronné
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Par défaut
    Bonsoir,

    Casafayere a raison, j'ai oublié de mettre à jour le n° de ligne quand on en enlève une donc l'idée de commencer par la fin est intéressante!
    donc plutôt utiliser while...wend
    cordialement

    geogeo

    une proposition avec while ... wend :

    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
        Sub clearVbis()
        Dim numLigne As Long, nbLignes As Long
     
     
        nbLignes = Cells(Range("A:A").Count, 10).End(xlUp).Row
        numLigne = 2
        While numLigne < nbLignes - 1 'dernier doublon possible si reste 2 lignes
           If Left(Cells(numLigne, 10), 2) = "DZ" And Cells(numLigne + 1, 10) = Cells(numLigne, 10) And _
              Cells(numLigne + 2, 10) = "FRMRS" And Cells(numLigne, 17) = Cells(numLigne + 1, 17) Then
                                    Rows(numLigne + 1).EntireRow.Delete
                                    nbLignes = nbLignes - 1
           End If
           numLigne = numLigne + 1
        Wend
     
        End Sub
    bonsoir

    geogeo

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

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    Comme précisé par Dominique depuis le début de cette discussion, pour supprimer des lignes d'une liste de données il faut obligatoirement commencer par la dernière ligne et remonter vers la première. Pour supprimer des colonnes c'est la même chose, on part de la dernière colonne vers la première.
    merci Philippe (un petit coucou au passage), j'avais l'impression que c'était resté lettre morte
    Pour casefayere c'est efficace mais ça supprime tout les doublons alors que je souhaite en garder certains car je traite les autres cas dans une macro à part.
    Pourtant j'ai respecté les conditions proposées avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Tb(x, 17) = Tb(x + 1, 17) And Tb(x, 10) Like "DZ*" Then
    , suite à cette demande
    Si doublon en colonne Q et col J la valeur de la cellule commence par "DZ" (cellule en rouge) et que la ligne en dessous i-1 il y à la valeur "FRMRS" (cellule en orange) alors on supprime la ligne qui commence par "DZ" et ainsi de suite.
    je ne comprends pas

    edit : j'ai oublié de préciser que la solution de Philippe avec les filtres avancés devrait répondre au problème
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

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

Discussions similaires

  1. [AC-2007] sélection de ligne avec condition et les supprimer
    Par Sangoku62000 dans le forum Access
    Réponses: 2
    Dernier message: 30/01/2012, 12h46
  2. [XL-2007] Supprimer lignes avec 2 conditions
    Par Bernard67 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 16/05/2011, 15h43
  3. [XL-2003] Supprimer lignes avec 1 condition
    Par Vadorblanc dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 31/10/2010, 22h13
  4. Supprimer lignes avec doublons avec 2 conditions
    Par dan-12 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 17/03/2008, 09h44
  5. Affichage ligne avec condition dans /etc/passwd
    Par mzt.insat dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 17/04/2006, 21h25

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