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 :

Filtre et delete


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut Filtre et delete
    Bonjour,

    Je m'explique, j'ai dans différentes colonnes des cellules avec certaines valeurs. Et je souhaiterais supprimer la ligne correspondant à la cellule qui contient la valeur. J'utilise cette macro mais en vain, ça me supprime quelques valeurs et je dois la refaire pour supprimer encore d'autres ainsi de suite. Pour info des cellules vides existent dans les colonnes.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    Sub supprime_CB()
    With Range(Range("DQ2"), Range("DQ65536"))
          .AutoFilter Field:=1, Criteria1:="DRR00"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
          .AutoFilter Field:=1, Criteria1:="DAV10"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
     
     
    With Range(Range("DR2"), Range("DR65536"))
          .AutoFilter Field:=1, Criteria1:="DRR00"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
          .AutoFilter Field:=1, Criteria1:="DAV10"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    With Range(Range("DS2"), Range("DS65536"))
          .AutoFilter Field:=1, Criteria1:="DRR00"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
          .AutoFilter Field:=1, Criteria1:="DAV10"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    With Range(Range("DT2"), Range("DT65536"))
          .AutoFilter Field:=1, Criteria1:="DRR00"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
          .AutoFilter Field:=1, Criteria1:="DAV10"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    With Range(Range("DU2"), Range("DU65536"))
          .AutoFilter Field:=1, Criteria1:="DRR00"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
          .AutoFilter Field:=1, Criteria1:="DAV10"
          .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    End Sub

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 72
    Par défaut
    Je comprend pas tout à fait ce que tu veux.

    Si tu cherche une valeur dans une cellule dans une plage donnée on peut procéder ainsi:

    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
    Sub DeleteRows()
        Dim valeur As String
        valeur = "la valeur a cherché"
     
        Dim i As Long, j As Long
        i = 1
        While i <= Range("A1").End(xlDown).Row  'on parcourt les ligne de ta plage
            For j = 1 To 9 'on parcourt les colonnes de ta plage
                'Range("A1").End(xlDown) parcourt tes cellules vers le bas en partant de A1 et s'arrête
                'à la dernière cellule non vide, donc place toi dans une colonne sans vides (A1 ou B1 ou etc.)
                Cells(i, j).Select
                If Cells(i, j) = valeur Then
                    Rows(i).Delete 'on supprime la ligne
                    GoTo PasDeSaut   ' ne pas oublier cette ligne car en supprimant une ligne on a décalé les suivantes vers le haut
                                     ' sans ça tu ne parcourera pas une ligne
                                     ' on sort du parcours des colonnes pour recommencer à la première, continuer n'aurait aucun sens
                                     ' car ce n'est plus la même ligne vu qu'on l'a supprimer, et on va la réanalyser ensuite
                End If
            Next j
            i = i + 1 ' ligne suivante, on atteind cette ligne uniquement si la valeur n'a pas été trouvé dans la ligne
    PasDeSaut:
        Wend
    End Sub
    DeathZarakai

    P.S.: Le For Each j'ai essayé sa n'analyse pas certaines cellules suite à un delete
    P.S. 2: S'il y a mieux ou plus rapide je suis intéressé des retours
    P.S. 3: Si tu as des questions hésite pas j'y répondrais mais ta requête est pas super précise, je rappelle qu'il est préférable de tester une macro sur une copie pour éviter les pertes de données.

  3. #3
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Justement j'utilisais le End(xlDown) mais vu que j'ai des cellules vides au milieu de mes colonnes ça ne sert à rien, il faudrait plutôt parcourir toute la colonne.

    Pour être plus précis: J'ai des colonnes supposant A, B, et C qui contiennent différentes valeurs. Parmi ces valeurs : il y a quelques unes, par exemple "x", dont je voudrais supprimer toute la ligne.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 72
    Par défaut
    Dans le cas de cellules vide dans toutes les colonnes, tu peux ajouter un crampon d'arrêt à la fin du tableau (ex: tu écris "fin") tu utilises la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A60000").End(xlUp).Row - 1
    Cette formulation donnera la ligne où fin est noté (à compter qu'elle est dans la colonne A on est d'accord) d'où le "-1" pour bien avoir le numéro de la dernière ligne.

    DeathZarakai.

  5. #5
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Peut-tu être plus clair? Sinon est ce que j'ai bien précisé cette fois le but de ma macro?

    Tu veux dire je remplace dans le while i?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 72
    Par défaut
    De ce que j'en ai compris tu parcours l'entièreté du tableau et supprimer les lignes où une certaine expression est présente.

    Plus explicite bien sur, la formule que je t'ai donné parcours les lignes vers le haut et du coup s'arrêtera sur la première cellule non vide.
    D'où la proposition de rajouter une "cellule fin".

    Nom : DVcom.png
Affichages : 380
Taille : 12,3 Ko

    Ainsi la formule remontera et s'arrêtera sur le "fin" ligne 17 dans mon exemple. C'est une astuce que j'utilise lorsque mon tableau contient des vides.

    Une autre solution serait de nommé une case la ligne après la dernière ligne : ex: "FinTab"

    Et tu pourras ainsi faire un While i < Range("FinTab").Row

    Si je n'ai toujours pas compris ta requête ou me suis mal expliqué je m'en excuse une nouvelle fois.

    DeathZarakai.

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

Discussions similaires

  1. [AC-2007] Filtre sous formulaire et delete
    Par fabien0733 dans le forum VBA Access
    Réponses: 4
    Dernier message: 26/09/2013, 23h09
  2. recherche filtre flou gaussien
    Par gimlithedwarf dans le forum Langage
    Réponses: 4
    Dernier message: 01/08/2002, 22h32
  3. TADOTable et filtre
    Par GaL dans le forum C++Builder
    Réponses: 16
    Dernier message: 02/07/2002, 16h52
  4. Filtre passe Bande
    Par Mau dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 28/06/2002, 17h03
  5. Probleme de filtre dans bdd
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2002, 10h43

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