L’un des lecteurs (Jean-Noël) de ce modeste blog (qu’il en soit remercié) me demande une précision au sujet de l’article « Supprimer des lignes en fonction d’une valeur contenue dans un champ ». En effet, il souhaiterai  pouvoir effacer les lignes non pas en fonction d’une correspondance exacte de la valeur du champ mais simplement si la valeur se trouve dans l’expression globale de ce champ. J’ai donc modifié quelque peu mon code…

- 1 –  Considérons ici la liste (A1 :E24), je souhaite supprimer toutes les lignes pour lesquels l’éditeur contient le mot Microsoft.


- 2 – Voici à quoi pourrait ressembler le code, à vous de l’adapter ! J’ai également récupérer le nombre de lignes effacées
Sub DelEditeur3()
Dim i As Integer
Dim lig As Integer
Dim Editeur As String
lig = 0
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 InStr(.Range("C" & i).Value, Editeur) <> 0 Then
'la fonction InStr(chaîne1, chaîne2) permet de vérifier la présence de chaîne2 dans
‘chaîne1'et retourne l'occurrence de la première position de la comparaison donc pas 0
‘si chaîne2 est présente dans chaîne1
Rows(i).Delete
lig = lig + 1
'Comptons les lignes effacées
End If
Next i
  MsgBox "J'ai effacer " & lig & " ligne(s) contenant l'expression : "  _
& Editeur, vbOKOnly + vbInformation, "INFORMATION"
'Affichons le nombre de lignes effacées
End With
End Sub

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




5 commentaires:

Anonyme a dit…

Bonjour,

Votre code m'intéresse mais mon problème est un peu différent. La valeur qui m'intéresse peut se cacher dans plusieurs colonnes différentes et, d'autre part, je ne souhaite pas supprimer les lignes mais au contraire les afficher et cacher les autres.

Merci d'avance pour votre aide.

Anonyme a dit…

Bonjour mon terme est aussi présent dans 3 colonnes en A, B et C... Aurais tu un code miracle, le tiens n'a que fonctionné pour ma colonne C...

Olivier VBA a dit…

Bonjour

Une solution peu élégante mais efficace serait de refaire une boucle pour la colonne A et une autre pour la colonne B en les plaçant avant ou après la première boucle.

Il suffit alors de remplacer "C" par "A" puis par "B"

For i = .Range("C" & .Rows.Count).End(xlUp).Row To 2 Step -1
If InStr(.Range("C" & i).Value, Editeur) <> 0 Then

Rows(i).Delete
lig = lig + 1

End If
Next i

Bon courage

Unknown a dit…

(Re)bonjour à tous, une petite erreur de connexion et mon commentaire a disparu... Donc je rédige une seconde fois ce dernier (désolé si duplicata)

Sur base le la procédure ci-dessus, j'ai adapté le code de façon que :

1) La fonction puisse être testée avant exécution, ce qui permet l'estimation par exemple du nombre d'enregistrements à supprimer...
2) Assurer la compatibilité avec les différentes versions d'Excel
3) Le plus important à mon avis : De passer le nom de la feuille et d'exécuter la fonction en mode résultat ou caché.
Ce qui autorise la réutilisation de la même fonction.

Remarque toutefois, ce code n'est pas sélectif, je veux dire par là que toutes les lignes contenant la chaine de caractères spécifiée, seront supprimées.

En espérant que ces codes seront utiles, bien à vous.

'-- Declaration variable de test
Public gDebug As Boolean
'
'-- Test suppression de lignes en fonction d'une valeur specifique
'
Function Test(wChoice as Boolean)
'-- Declaration des variables de travail
Dim wSearch as string, wRetVal as Long
'-- Passage en mode debuging (pas de suppression physique)
gDebug = True
'-- Invitation a saisir la valeur a rechercher
wSearch = InputBox("Please, enter de delete value?", "Exemple: Microsoft", "Microsoft")
'-- Si chaine de recherche non vide
If wSearch <> "" Then
'-- Type execution (Affichage du resultat ou non)
If wShow Then
'-- Exemple avec affichage du nombre de lignes supprimees
wRetVal = gDelSearch(wSearch, "Feuil1")
If wRetVal > 0 Then
MsgBox "Number deleted " & wRetVal _
& " line(s) contains: " & wSearch, _
& vbOKOnly + vbInformation, "INFORMATION"
End If
Else
'-- Exemple execution sans affichage du resultat
Call gDelSearch(wSearch, "Feuil1")
End If
End If
'
End Function
'
'Fonction: Suppression des lignes contenant une valeur specifique
' dans un classeur donne
'
Function gDelSearch(wSearch As String, wSheet As String) As long
'-- Declaration des variables de travail
Dim wCtrLig As Long, wCtrCol As Long
Dim wDerLig As Long, wDerCol As Long
Dim wNbrLig As Long, wFound As Boolean
'-- Initialisation du compteur de lignes supprimees
wNbrLig = 0
'-- Boucle analyse sur la feuille spécifiee
With ThisWorkbook.Sheets(wSheet)
'-- Recuperation derniere ligne active
wDerLig = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
'-- Recuperation derniere colonne active
wDerCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
'-- De la derniere ligne vers la premiere
For wCtrLig = wDerLig to 1 Step -1
'-- Initialisation du switch (Vrai ou Faux)
wFound = False
'-- De la premiere colonne vers la derniere
For wCtrCol = 1 To wDerCol
'-- Test si la cellule contient la valeur specifiee
If InStr(.Range("C" & wCtrCol).Value, wSearch) <> 0 Then
'-- Positionne le switch a Vrai
wFound = True
End If
Next wTotCol
'-- Si au minimum un element est trouve
If wFound Then
'-- Incrementation du compteur de lignes supprimees
wNbrLig = wNbrLig + 1
'-- Suppression de la ligne en cours
If Not gDebug Then Rows(wCtrLig).Delete
End If
Next wCtrLig
End With
'-- Retourne le nombre de lignes supprimees
gDelSearch = wNbrLig
'
End Function

Olivier VBA a dit…

Merci Jean-Luc pour vote super travail qui sera sans aucun doute fort utile aux lecteurs de ce blog

Enregistrer un commentaire

top