Macro excel supprimer des lignes

Fermé
maloi1278 - 30 janv. 2008 à 14:58
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 1 févr. 2008 à 17:27
Bonjour,

J'ai un très gros fichier excel.

Dans ma colonne A, je vais avoir diverses données.
ex: A1= AAAA
A2= AAAA
A34= BBBBB
A35=CCCCC
A36= FFFFF

Je veux supprimer toutes les lignes dont les cellules contiennent certaines données comme CCCCC et FFFFF.

J'avais commencé une macro en faisant une boucle mais c'est super long vu que j'ai beaucoup de lignes à supprimer en fonction de mes critères.

ex: si ma cellule = CCCCC alors
je descend d'une ligne
sinon
je supprime la ligne

Et tout ça tant que je suis pas à la fn du fichier.

Et donc je suis obligé de marquer les valeurs de ma cellule une par une ! Et je trouve ça un peu trop fastidieux, il doit y avoir un meilleur moyen !

Je voulais donc savoir comment faire que ma macro aille comparer, sur une autre feuille (feuille2), la liste de mes données à supprimer.

En clair, je ferai sur une autre feuille:

A1=CCCCC
A2=FFFFF ....
Et ma macro comparerait chaque ligne de ma feuille 2 avec chaque ligne de ma feuille 1. Si elles sont égales, la ligne en feuille 1 est supprimée.

Voilà ce que je pensais faire. J'ai peur que ce soit long aussi.

A votre avis, est ce une meilleure idée que la 1ère?
J'espère avoir été clair !

Merci beaucoup !
A voir également:

10 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 711
30 janv. 2008 à 17:38
bonjour

Avec une macro de ce genre, cela m'étonnerait que cela soit très long.
Sub supprime()
Dim lig As Double
For lig = Cells(65536, 1).End(xlUp).Row To 1 Step -1
    Select Case Cells(lig, 1).Value
        Case "CCCCC", "FFFFF"
            Rows(lig).Delete
    End Select
Next lig
End Sub

Tu peux rajouter d'autres valeurs, séparées par des virgules.
0
Bonjour,

Je viens de tester ta macro et effectivement, c'est beaucoup plus simple que ce que je fesais....

Par contre, je vais avoir beaucoup d'autres valeurs à rajouter (quand je dis beaucoup je parle d'une cinquantaine, voire plus).

Je les ai sur un fichier excel. Est ce possible de "lier" ce fichier de manière à ce qu'il commpare les valeurs directement sans avoir à les taper manuellement?

Merci beaucoup pour vos réponses !
0
Bonjour,

Autre chose, je suis sous excel 2007. J'ai voulu changer le nombre de lignes dans le code suivant mais il me met un message d'erreur.

For lig = Cells(65536, 1).End(xlUp).Row To 1 Step -1

Pourquoi??

Merci !
0
Bonjour,

Je débute en vb et j'ai un peu de mal.
Je comprend à peu près ton code, mais comment je rappelle mon autre classeur?

Je récapitule:

Classeur1-feuille1 : ma liste de données avec la colonne B qui contient mes éléments de contrôle
Classeur2-Feuille1 : ma liste sur uniquement la colonne A de mes valeurs à comprarer dans Classeur1

Je voudrais que la macro compare la valeur en A1 de mon Classeur2 avec les valeurs de la colonne B de mon classeur1.

Si elles sont identiques je descends d'une ligne pour continuer la comparaison, sinon je supprime la ligne et je continue à comparer en dessous. Et ca, jusqu'à ce que je n'ai plus de valeur dans la colonne A de mon Classeur2!

Est ce possible??

Merci beaucoup pour votre aide !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je suis désolé, je suis vraiment très nul!!

C'est bien ce que j'ai fait mais à priori cela ne me compare pas dans mon classeur2.

Je ne comprend pas bien comment fonctionne la méthode find. Le début, ça va ça parcours bien mon classeur1 en partant de la fin.

Par contre, j'ai vraiment du mal avec cette instruction:

Set del = prm.Find(What:=Cells(lig, 1).Value, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)


xlFormulas: cela correspond à quoi exactement? Cela devrait être mon classeur2, non?

Merci !
0
Je suis désolé, je suis vraiment très nul!!

C'est bien ce que j'ai fait mais à priori cela ne me compare pas dans mon classeur2.

Je ne comprend pas bien comment fonctionne la méthode find. Le début, ça va ça parcours bien mon classeur1 en partant de la fin.

Par contre, j'ai vraiment du mal avec cette instruction:

Set del = prm.Find(What:=Cells(lig, 1).Value, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)


xlFormulas: cela correspond à quoi exactement? Cela devrait être mon classeur2, non?

Merci !
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 711
1 févr. 2008 à 17:27
bonjour

Par contre, j'ai vraiment du mal avec cette instruction:

    Set del = prm.Find(What:=Cells(lig, 1).Value, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

Cette instruction recherche (Find) dans ton Classeur1-feuille1 : ma liste de données avec la colonne B qui contient mes éléments de contrôle (prm) la présence du contenu de ta colonne A (Cells(lig, 1).Value) en cours d'analyse.

Elle recherche pour chaque ligne de ton classeur à épurer.

Le début, ça va ça parcours bien mon classeur1 en partant de la fin.

Et ensuite, qu'est-ce qui ne fonctionne pas ?
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 711
31 janv. 2008 à 18:24
bonjour

Si tu veux utiliser des paramètres externes il faut changer de procédure et ceci devrait fonctionner
Sub supprime()
Dim lig As Double
Dim del As Object
Dim prm As Range
Set prm = Workbooks("ton-classeur.xls").Sheets("tafeuille").Range(" A1:A5 " )
' il faut modifier la ligne ci-dessus pour définir tes paramètres de suppression :nom classeur, feuille et range
For lig = Cells(65536, 1).End(xlUp).Row To 1 Step -1
    Set del = Nothing
    Set del = prm.Find(What:=Cells(lig, 1).Value, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
    If Not del Is Nothing Then Rows(lig).Delete
Next lig
End Sub

J'ai voulu changer le nombre de lignes dans le code suivant mais il me met un message d'erreur.

Effectivement il y a le double de lignes en 2007 mais si tu as mis une valeur correcte tu ne devrais pas avoir d'erreur.
Quelle erreur ?
-1
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 711
1 févr. 2008 à 15:15
bonjour

Classeur1-feuille1 : ma liste de données avec la colonne B qui contient mes éléments de contrôle
Classeur2-Feuille1 : ma liste sur uniquement la colonne A de mes valeurs à comprarer dans Classeur1


C'est exactement ce que fait la macro mais il faut paramétrer cette ligne
Set prm = Workbooks("ton-classeur.xls").Sheets("tafeuille").Range(" A1:A5 " )

tu remplaces
ton-classeur.xls => par le nom de Classeur1-feuille1
tafeuille => par le nom de feuille1 du Classeur1

" A1:A5 " => par le range concerné "B:B"

Set prm = Workbooks("Classeur1.xls").Sheets("feuille1").Range("B:B")

Cela ne doit pas être très loin...

Petite précision : lorsque l'on supprime des lignes, vaut mieux commencer par le bas et remonter car après suppression, il y a toujours moins de lignes à traiter.
-1
phil_232 Messages postés 286 Date d'inscription jeudi 6 décembre 2007 Statut Membre Dernière intervention 12 juin 2008 33
1 févr. 2008 à 16:58
"65536" Access permet 65535 lignes

bon, encore une fois : Excel n'est pas une base de données. MAIS ! depuis ADO on peut attaquer une feuille Excel avec des fonctionalités d'une base de données (ATTENTION ! ce n'est pas multi-user). c'est juste une idée : créer une connexion ADO vers cette feuille et puis faire un

DELETE FROM MyExcelWorkSheet WHERE ...
-1