Supprimer des lignes en fonction d'une partie du contenu de la cellule en VBA

brutor2

XLDnaute Junior
Bonsoir à tous,

J'aurai besoin de votre aide car je n'ai aucune idée comment procéder pour obtenir une solution à mon projet.

J'ai un fichier csv dont les cellules de la première colonne contiennent des valeurs du style :
RF1487-070km/h-R,"RF1487-0110km/h-R",-1.63712,43.36955,,,,
RF1488-070km/h-R,"RF1488-070km/h-R",-1.63712,43.36955,,,,
RF1489-090km/h-R,"RF1489-090km/h-R",-1.63712,43.36955,,,,
etc..

J'aimerais écrire un code VBA qui à partir d'un message box me permettrait de choisir la valeur pouvant être 070km/h, 090km/h, ou 110km/h et d'autres valeurs du même type afin de supprimer les lignes qui contiennent ces valeurs.

Comment dois-je m'y prendre ?

Merci d'avance de votre attention et de votre aide.

Cordialement.
brutor
 

Softmama

XLDnaute Accro
Re : Supprimer des lignes en fonction d'une partie du contenu de la cellule en VBA

bonjour brutor2,

Pour trouver toutes les cellules qui contiennent 070km/h (par exemple) et effacer les lignes concernées, tu peux utiliser ce code (à tester) :

Code:
Dim c as Range, Rech as String
Rech = InputBox("Texte à chercher ?")
Set c= cells.find(what:=Rech, Lookin:=xlValues, Lookat:=xlPart)
if not c is nothing then  'si la recherche a abouti
    Do
        c.entirerow.delete
        set c=cells.findnext(range("A1"))
    loop while not c is nothing
end if
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Supprimer des lignes en fonction d'une partie du contenu de la cellule en VBA

Bonsoir brutor2, Softmama, le fil, le forum

Tu peux aussi utiliser le filtre élaboré (avec ou sans macros)
en utilisant la formule ci-dessous comme critère de filtre
=OU(ESTNUM(CHERCHE("*070km/h*";A2));ESTNUM(CHERCHE("*090km/h*";A2));ESTNUM(CHERCHE("*110km/h*";A2)))
EDITION:voici la transcription en macro VBA ce que je disais plus haut

VB:
Sub XMacro1()
Dim cr$, Plg As Range

cr = "=OR(ISNUMBER(SEARCH(""*070km/h*"",RC[-2])),ISNUMBER(SEARCH(""*090km/h*"",RC[-2])),ISNUMBER(SEARCH(""*110km/h*"",RC[-2])))"

Range("C2").FormulaR1C1 = cr
Range("A1:A10").AdvancedFilter _
    Action:=xlFilterInPlace, _
    CriteriaRange:=Range("C1:C2"), _
    Unique:=False

Set Plg = [_FilterDataBase]

Plg.Offset(1, 0).Resize(Plg.Rows.Count - 1).SpecialCells(12).Delete -4162
ActiveSheet.ShowAllData

End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Supprimer des lignes en fonction d'une partie du contenu de la cellule en VBA

Re


Je te remets un exemple plus complet
( à tester sur un classeur vide)

VB:
Sub XXMacro1()
Dim cr$, Plg As Range, rep
[A1] = "Données"
[A2] = "RF1487-070km/h-R,""RF1487-0110km/h-R"",-1.63712,43.36955,,,,"
[A3] = "RF1488-070km/h-R,""RF1488-070km/h-R"",-1.63712,43.36955,,,,"
[A4] = "RF1489-090km/h-R,""RF1489-090km/h-R"",-1.63712,43.36955,,,,"
[A5].Resize(5).Formula = "=""ABCefg""&Row()"
rep = MsgBox("Suppression des lignes?", vbYesNo, "Filtrage élaboré par VBA")
Application.ScreenUpdating = False
If rep = 6 Then
'formule de critère
cr = "=OR(ISNUMBER(SEARCH(""*070km/h*"",RC[-2])),ISNUMBER(SEARCH(""*090km/h*"",RC[-2])),ISNUMBER(SEARCH(""*110km/h*"",RC[-2])))"
'filtrage
Range("C2").Formula = cr: Range("A1:A10").AdvancedFilter _
    Action:=xlFilterInPlace, _
    CriteriaRange:=Range("C1:C2"), _
    Unique:=False: Set Plg = [_FilterDataBase]
'suppression des lignes filtrées
Plg.Offset(1, 0).Resize(Plg.Rows.Count - 1).SpecialCells(12).Delete -4162
'Affichage normal
ActiveSheet.ShowAllData
Else
End
End If
Application.ScreenUpdating = True
End Sub
 

brutor2

XLDnaute Junior
Re : Supprimer des lignes en fonction d'une partie du contenu de la cellule en VBA

Bonjour Softmama, Staple1600,
Bonjour le forum

C'est sympa d'avoir répondu si rapidement et toujours aussi efficacement.
C'est toujours très enrichissant de voir deux manières différentes d'aborder une problématique.
Et c'est pour cela que je tiens à vous remercier tous deux pour votre partage

@Softmana
Merci le résultat est effectivement conforme à ce que je cherchais car mon fichier peut contenir jusqu'à 16000 lignes.
  1. Sans trop abuser, que faudrait-il ajouter pour que lorsque je fais "annuler" la macro ne tourne pas en boucle après avoir supprimé toutes les lignes contenant une valeur ?
  2. Comment s'y prendre pour pouvoir mettre plusieurs valeurs dans la boite de message, de façon que la macro supprime les lignes de plusieurs valeurs choisies en même temps?
@Staple1600
Merci la formule que tu m'as proposée est très intéressante et pourra me servir dans l'élaboration de filtre élaboré sur des tableaux moins importants. Elle permet de faire un tri avec le résultat Vrai ou faux.
Par contre la transposition en macro ne donne pas le résultat attendu ou bien peut-être je n'ai pas su l'adapter ?

Avec toute ma reconnaissance pour votre aide.
Cordialement.
Brutor2
 

Softmama

XLDnaute Accro
Re : Supprimer des lignes en fonction d'une partie du contenu de la cellule en VBA

Bonjour Softmama, Staple1600,

@Softmana
  1. Sans trop abuser, que faudrait-il ajouter pour que lorsque je fais "annuler" la macro ne tourne pas en boucle après avoir supprimé toutes les lignes contenant une valeur ?
  2. Comment s'y prendre pour pouvoir mettre plusieurs valeurs dans la boite de message, de façon que la macro supprime les lignes de plusieurs valeurs choisies en même temps?
  1. Inutile de faire Annuler, il suffit de laisser la box vide.
  2. Je t'ai mis une solution ci dessous : tu renseignes plusieurs fois la même box, lorsque tu la laisses vide, la macro recherche toutes les valeurs des boxs que t'avais renseignées avant pour virer les lignes.

VB:
Sub test()
Dim c As Range, Rech As String
1 Rech1 = InputBox("Texte à chercher ?")
If Rech = "" Then
    Rech = Rech1: GoTo 1
ElseIf Rech1 <> "" Then
    Rech = Rech & "|" & Rech1: GoTo 1
End If
For t = 0 To UBound(Split(Rech, "|"))
    Set c = Cells.Find(what:=Split(Rech, "|")(t), LookIn:=xlValues, Lookat:=xlPart)
    If Not c Is Nothing Then  'si la recherche a abouti
        Do
            c.EntireRow.Delete
            Set c = Cells.FindNext()
        Loop While Not c Is Nothing 'Boucle tant que la recherche continue d'aboutir
    End If
Next t
End Sub
 

Pièces jointes

  • brutor2.xls
    24.5 KB · Affichages: 105

brutor2

XLDnaute Junior
Re : Supprimer des lignes en fonction d'une partie du contenu de la cellule en VBA

Bonjour Softmama,
Bonjour le forum

C'est très efficace et cela va me faire gagner un temps énorme pour séparer mes données qui contiennent parfois plus de 10000 éléments.
Sincèrement tout seul je n'y serais pas arrivé.
Je ne manquerai pas de me plonger dans l'aide VBA pour essayer de saisir toutes les subtilités de ton code.

Merci à toi et à tous ceux qui participent à ce forum pour aider les novices comme moi.

Cordialement
Brutor2
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 195
Messages
2 086 083
Membres
103 115
dernier inscrit
fiachris26