Voici un problème qui revient de façon récurrente dans Excel, comment à l’aide d'une procédure VBA, peut on supprimer toutes les lignes d’une liste en fonction d’une valeur contenue dans un champ ?


- 1 – considérons ici la liste (A1 :E27), je souhaite supprimer toutes les lignes pour lesquels l’éditeur est égal à Microsoft
 
- 2 – Voici à quoi pourrait ressembler le code, à vous de l’adapter !
Sub DelEditeur()
Dim i As Integer
With ThisWorkbook.Sheets("Feuil1")
'Précisez le nom de votre feuille
            For i = .Range("C" & .Rows.Count).End(xlUp).Row To 2 Step -1
'je travaille sur la colonne c
'Rows.count permet de retourner le nombre de ligne de la plage range
                        If .Range("C" & i).Value = "Microsoft" Then
                                   .Rows(i).Delete
                        End If
            Next i
End With
End Sub

- 3 – Et voici le résultat après exécution de la procédure DelEditeur()…
 

- 4 – Une amélioration possible : passer par une variable pour demander à l’utilisateur quel éditeur il faut supprimer ?
Sub DelEditeur2()
Dim i As Integer
Dim Editeur As String
Editeur = InputBox("Veuillez entrer l'editeur à supprimer ?", "Welcome", "Microsoft")
'la valeur saisie est transmise à la variable Editeur
With ThisWorkbook.Sheets("Feuil1")
            For i = .Range("C" & .Rows.Count).End(xlUp).Row To 2 Step -1
                        If .Range("C" & i).Value = Editeur Then
Rows(i).Delete
  End If
  Next i
End With
End Sub




34 commentaires:

Jean-Noël Anderruthy a dit…

Bonjour !
Merci pour la macro.
J'ai une question à vous poser (si vous avez le temps de répondre) : est-ce qu'il est possible de lancer une recherche sur une occurrence à l'intérieur de la valeur contenue dans la cellule. Par exemple, j'ai des cellules qui contiennent des adresses URL et je veux supprimer toutes celles qui renvoient au site de Microsoft.
Merci pour votre éventuelle réponse ;-)

Sav intecum a dit…

Bonjour,
Super cette Macro.
Mais j'aurais besoins d'un truc plus large. je voudrais supprimer des lignes qui contiennes des Nombres différant? Exemple ligne A1 à A1000,des nombres qui vont de 3200210 a 3510045 par exemple avec des case vide au milieu que je voudrais supprimer aussi. et que je veux seulement les ligne qui vont de 340092 à 360012.
si vous pouvez m’aidè ce serais génial.

Merci d'avance

rached Soussi a dit…

Je voudrais supprimer des lignes si valeur = 0 Mais, lorsqu'on supprimer une ligne, celle d'en dessous remonte à l'adresse de celle que tu viens de supprimer.et le cellule m'affiche REF# car Les codes proposés ne me permettent pas de résoudre mon problème

Olivier Picot a dit…

Donc si la cellule affiche #REF elle ne contient pas 0 mais une formule de calcul dont le résultat est 0 cela n'est pas du tout la même chose !!!

Jérôme Mercier a dit…

Bonjour

Je voudrais faire une variante de cette macro, celle ci demande une variable pour supprimer les lignes qui la contiennent
Je voudrais faire le contraire, ne garder que les lignes de la variable que l'on va fournir
Est ce possible?
Merci d'avance

Olivier Picot a dit…

Bonjour

avez vous essayer simplement
If .Range("C" & i).Value <> Editeur Then
(<> différent de)

Jérôme Mercier a dit…

Bonsoir

Oui çà fonctionne! c'était tout bête,merci beaucoup
J'ai juste un petit problème, j'ai créé la macro dans le classeur de macro personnel (personal.xlsb)
on dirait que la commande With ThisWorkbook.Sheets("Feuil1") n'est pas adaptée
si je crée la macro dans le fichier concerné c'est bon mais je voudrais que la macro soit accessible pour n'importe quel fichier excel

faut il formuler différent cette ligne?

Olivier Picot a dit…

Bonjour

Si vous êtes dans personal.xlsb alors ThisWorkbook désigne le classeur personnal.
Avant le With tenter de désigner votre classeur de travail qui bien sur sera ouvert préalablement, un truc du style
Workbooks("Monclasseur.xlsx").Activate

Bon courage

Ishaq Achour a dit…

Bonjour,

Déjà merci de partager votre savoir.

Je voudrais supprimer la ligne sauf la colonne A qui doit rester intact. Comment faire ?

Olivier Picot a dit…

Bonjour

Donc il s'agit, si je comprend bien d'effacer les cellules de la ligne i et non plus de supprimer
cette ligne.
On pourrait envisager de remplacer .Rows(i).delete par .Range("B"&i&":E"&i).clear

Je vous laisse faire le test

Merci

Unknown a dit…

Bonjour,

Pouvez-vous en dire plus sur l'expression " For i = .Range("C" & .Rows.Count).End(xlUp).Row To 2 Step -1 ", c'est à dire la signification littérale exacte de cette expression ?
La fin : "To 2 Step -1" permet-elle de remonter d'un cran vers le haut après suppression d'une ligne ? Je dis ceci car lors de la suppression d'une ligne, celle du dessous remonte et devient celle du dessus (ex : après suppression d'une ligne 20, la 21 devient la 20, au risque donc d’omettre la suppression de cette nouvelle ligne 20).

Merci à vous pour ce bout de code en tout cas.

Cdlt

Olivier Picot a dit…

Bonjour

Une boucle pour se lit :

Pour VAR variant d'un MIN à un MAX (avec un pas de y) faire
Action(s)
Fin de Pour

Donc ici nous avons une boucle de type :

Pour VAR variant d'un MAX à un MIN (avec un pas de - y) faire
Action(s)
Fin de Pour

i est la variable (compteur)
MAX est le nombre de ligne de la liste donnée par la méthode Count de l'objet
Range.rows (rows, la collection des lignes de la sélection Range). Pour cela nous nous sommes déplacé sur la dernière ligne de la liste (End(xlUp) "CTRL bas).
Le Pas est -1 puisque nous allons faire la boucle du bas vers le haut en remontant.
MIN est la ligne 2; là on arrête la boucle Pour

Le fait de remonter n'est pas un problème puisqu'on ne parcours en réalité la liste qu'une seule fois.

J'espère avoir été clair

Jean - Claude Mourlan a dit…

Bonjour, si dans ma cellule il y a microsoft mais pas que. S'il y a d'autres mots, comment puis-je quand même supprimer la ligne si la cellule contient microsoft ? Je suis une tarte, désolé :-)

Merci pour votre partage très utile

Olivier Picot a dit…

Bonjour Jean-Claude

Il a été répondu à cette question sur le 2éme article consacré à ce sujet,
https://olivier-bureautique.blogspot.fr/2009/06/excel-2007-vba-supprimer-des-lignes-en.html

Bon courage

Anonyme a dit…

Bonjour,

Je suis une novice dans le domaine.
En utilisant cette macro j'ai le message d'erreur suivant : "Dépassement de capacité".
Je ne sais ce qu'il faut faire pour augmenter la capacité. Je travaille sur une base de donnée qui peut atteindre 400000 lignes d'écritures.
Il y a t-il une solution?

Olivier Picot a dit…

Bonjour

la macro repose ici sur la variable i de type Integer (2 octets) donc -32 765 à + 32 767 Max.
Il faut donc déclarer la variable i en long (4 octets)
dim i as Long
si cela est insuffisant alors on passe en nombre réel (type Single)

Bon courage

Anonyme a dit…

Bonjour,

J'ai un soucis quand j'applique votre code, le débogueur me dit: dépassement de capacité.
Donc je suppose que le nombre de ligne que j'utilise est trop grand. Après avoir cherché un peu, je suis censé convertir la "valeur trop grande" retournée avec un CLONG... mais je suis un peu perdu...

Bien cordialement,
Loïc

Olivier Picot a dit…

Avez vous essayer de modifier le type de variable comme indiqué dans mon post précédent ??

Anonyme a dit…

Bonjour Monsieur Picot,

Je cherche à faire une macro qui supprime la ligne si la cellule contient le signe moins "-".
Cependant, mon problème vient du fait que les cellules en questions contiennent des chiffres suivis ou précédé du signe "-".
Exemple : 310.705-

Comment puis-je procéder pour exécuter correctement mon code?

Merci d'avance et bonne journée,
Alexandre


Anonyme a dit…

Bonjour !
Merci beaucoup je débute et ça dépanne vraiment bien,
Possible de rajouter une condition ? J'ai beau rajouté un :
For i = .Range("Z" & .Rows.Count).End(xlUp).Row To 2 Step -1
If .Range("Z" & i).Value = "OK" AND Range("BE" & i).Value = "OK" Then
.Rows(i).Delete

Mais ça ne fonctionne pas vraiment...
De plus dans votre exemple pour supprimer les lignes avec Microsoft, pas de possibilité de faire une recherche de valeur "contenant le texte" ?
If .Range("C" & i).Value = "*Microsoft*" ne fonctinone pas non plus..

Merci d'avance !

Olivier Picot a dit…

bonjour Alexandre

En réponse au post du 5/08 encore une fois regardez cet article "http://olivier-bureautique.blogspot.fr/2009/06/excel-2007-vba-supprimer-des-lignes-en.html" il devrait vous inspirer la réponse...

Merci

Olivier Picot a dit…

Pour le mail du 11/08 la réponse est la même "http://olivier-bureautique.blogspot.fr/2009/06/excel-2007-vba-supprimer-des-lignes-en.html"

Merci

Anonyme a dit…

bonjour,serait il possible de supprimer aussi ces lignes au niveau d'un autre classeur fermé? merci d'avance

Olivier Picot a dit…

Bonjour

si un classeur est fermé, ce n'est pas un classeur mais un fichier (autre objet),
il faudra donc d'abord l'ouvrir pour pouvoir le nettoyer ; bien sur cela est facilement faisable,
demandez l'ouverture du classeur puis vous positionner dessus.

Merci

Anonyme a dit…

Bonjour,
Pourriez vous me donner un exemple de code svp

merci

Olivier Picot a dit…

Quelque chose comme cela ?

Sub DelEditeur2()
Dim i As Integer
Dim Editeur As String

'il suffit d'ouvrir le fichier
Workbooks.Open Filename:="C:\dossier\sous dossier\...\monfichier.xlsx"
'on se positionne
Range("A1").Select

Editeur = InputBox("Veuillez entrer l'editeur à supprimer ?", "Welcome", "Microsoft")
'la valeur saisie est transmise à la variable Editeur
With ThisWorkbook.Sheets("Feuil1")
For i = .Range("C" & .Rows.Count).End(xlUp).Row To 2 Step -1
If .Range("C" & i).Value = Editeur Then
Rows(i).Delete
End If
Next i
End With
'on referme éventuellement le fichier
ActiveWorkbook.Close
End Sub

Anonyme a dit…

Bonjour à tous
Dans votre code initial vous travaillez sur la colonne C
Je voudrais savoir quel serait le code à employer pour travailler sur la dernière colonne non vide ?
J'ai essayé :
Dim cellule5
cellule5 = Cells(2, Cells.Columns.Count).End(xlToLeft).Column
With ThisWorkbook.Sheets("ANNEES")
'Précisez le nom de votre feuille
For k = .Range(cellule5 & .Rows.Count).End(xlUp).Row To 2 Step -1
'je voudrais travailler sur la dernière colonne non vide
'Rows.count permet de retourner le nombre de ligne de la plage range
If .Range(cellule5 & k).Value = "A SUPPRIMER" Then
Rows(k).Delete
End If
Next k
End With
mais j'ai un message d'erreur :"erreur définie par l'application ou par l'objet"
Pourriez vous m'aider ?
Je précise que j'ai excel 2013
Bonne journée

Olivier Picot a dit…

Bonjour

Le problème vient de ta cellule 5 qui contient un nombre et pas un texte !
Ainsi ta colonne "D" contient 4 pas "D"

Il faut donc convertir le nombre en texte pour ma part j'utilise une fonction du genre :
Public Function Lettre_Colonne(colonne As Long) As String
Lettre_Colonne = Split(Sheets(1).Cells(1, colonne).Address, "$")(1)
End Function
que je place sur une feuille de module à pat, après ton code peut être du type :

Sub test()

Dim k As Long
Dim cellule5 As Long
Dim maCol As String

cellule5 = Cells(2, Cells.Columns.Count).End(xlToLeft).Column
maCol = Lettre_Colonne(cellule5)

With ThisWorkbook.Sheets("Feuil1") 'Précisez le nom de votre feuille
For k = .Range(maCol & .Rows.Count).End(xlUp).Row To 2 Step -1
'je voudrais travailler sur la dernière colonne non vide
'Rows.count permet de retourner le nombre de ligne de la plage range
If .Range(maCol & k).Value = "a" Then
Rows(k).Delete
End If

Transformer la référence Colonne A=1 est un grand classique en VBA,
Bon courage

Olivier

Jimnastik Jimnastik a dit…

Bonjour encore merci pour toutes ces précisions.

Pourriez-vous nous indiquer comment supprimer une ligne dont la valeur de la cellule serait contenue dans un autre classeur ou onglet (via sorte de rechercheV intégrée à la macro) ?

Jérémy

Olivier Picot a dit…

Bonjour,

La fonction recherchev() existe en vba : vlookup()
peut être tu peux mettre le résultat de ton vlookup dans une variable.
pour l'instant ta demande manque de précision, mais un vlookup peut très bien faire référence à une table d'un autre classeur.

Merci
Olivier

Anonyme a dit…

Bonjour

Comment demander a ce que la formule s'execute sde la ligne 10 à 30 et de la ligne 40 à 50 par exemple ?
et non pas sur toute la colonne ?

Merci d'avance

Unknown a dit…

Merci pour ce bout de code qui viens à point nommé apportez une nette amélioration dans mes applications VBA Excel.
Petite question: Comment adapter ce code pour que au lieu de supprimer la référence correspondante à la valeur saisie renvoi plutôt
le résultat du nombre d’occurrence pour cette référence dans la plage.
Merci.

Anonyme a dit…

Bonsoir,

Avant tout, merci pour les informations que tu apportes.
Je me demandai comment faire pour que cette macro s'applique sur plusieurs feuilles, en même temps.
Merci.

Cedric Ekra a dit…

Bonjour,
ma question serait de savoir comment mettre plusieurs valeurs dans la condition.
C'est-à-dire au lieu de microsoft seulement, si on voulait aussi ajouter opera, mozilla.... bref inscrire autant de variables que voulues comment se présenterait la condition: For i = .Range("C" & .Rows.Count).End(xlUp).Row To 2 Step -1
If .Range("C" & i).Value = Editeur Then
Rows(i).Delete

merci d'avance

Enregistrer un commentaire

top