Microsoft 365 Effacer dans colonne "G" les cellules qui ne contiennent pas un mot

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous :)

Je bute sur un souci de codification (évidemment lol :))
Je voudrais comme indiqué dans le titre du fil "Effacer dans colonne "G" les cellules qui ne contiennent pas un mot" dans l'exemple le mot "Date".

J'ai tenté, testé et recherché... j'ai trouvé un code sur un site que j'ai tenté d'adapter sans y arriver :

VB:
Sub NETTOYAGE()
Dim plage As Range
Dim i As Long
Dim vval As String
'Plage de recherche ici G2 à Derniere cellule utilisée de colonne G
Set plage = Range("g2" & ":g" & Range("g65000").End(xlUp).Row) 'Range("g:g")

'Pour chaque cellule de la plage de recherche
For i = plage.Rows.Count To 1 Step -1
    'je met dans une variable les 3 premiers caractères de la cellule
    'vval = Left(plage.Cells(i, 7).Value, 4)
    'Si vval = total alors j'efface la ligne entiere
    ' on utilise StrComp avec vbTextCompare pour ne pas tenir compte de la case (minuscules/majuscules)
    If StrComp(vval, "Date", vbTextCompare) <> 0 Then
        plage.Cells(i, 7).ClearContents
    End If
Next i
End Sub

Dans mon exemple (fichier joint), je voudrais qu'il m'efface tous les "ff" et garde les "Date"
Lol : ça n'efface rien du tout (nada, queue d'ail...)

Vous voudriez bien me corriger ?

Un grand merci par avance.
Fichier joint et je continue mes recherches...
lionel :)
 

Pièces jointes

  • Date CelCol test.xlsm
    23.1 KB · Affichages: 11
Dernière édition:
Solution
Bonjour Lionel,
Comme d'hab, pas tout compris.
Essai : si en G on trouve autre chose que "Date", on efface. Voir PJ.
Code:
Sub NETTOYAGE()
Dim plage As Range, i As Long
Application.ScreenUpdating = False
Set plage = Range("g2" & ":g" & Range("g65000").End(xlUp).Row) 'Range("g:g")
For i = plage.Rows.Count To 1 Step -1
    If Left(Cells(i, "G"), 4) <> "Date" Then Cells(i, "G") = ""
Next i
End Sub

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Que l'on mette :
Range("g65000").End(xlUp).Row ou Cells(Cells.Rows.Count, "G").End(xlUp).Row c'est la même chose.
Dans le fichier de Lionel on trouve dans les deux cas 45, qui est dernière ligne.
Mais quand on fait "Set plage" et qu'on commence à 2 alors le "plage.Rows.Count" vaut 44, et non 45.
D'où la simplification du post #10 qui évite le "set" et le "+1".
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Une autre façon de faire
(pas de boucle , mais une feuille complémentaire)
VB:
Sub Test_OK()
With Sheets("Feuil2")
    .Range("A2").Formula2 = "=NOT(EXACT(Feuil1!G2,""Date""))"
    Sheets("Feuil1").Range("G1:G45").AdvancedFilter Action:=2, CriteriaRange:=Range("A1:A2"), CopyToRange:=.Range("G1"), Unique:=0
End With
End Sub
NB: Evite de maltraiter la feuille 1
(On se sait jamais ;))

Donc pour tester, ajouter une feuille (et de de préférence donner lui le petit nom de : Feuil2)
ou faites les adaptations selon vos choix.
 

dysorthographie

XLDnaute Accro
hors mis que je ne vois pas l'intérêt de partir de la fin de la plage, ton code était presque bon!
VB:
Sub NETTOYAGEé()
Dim i As Integer
With Sheets("Feuil1").Range(Range("g2"), Cells(Cells.Rows.Count, "G").End(xlUp))
   For i = .Rows.Count To 1 Step -1
   Debug.Print .Cells(i, 1)
    If StrComp(.Cells(i, 1), "Date", vbTextCompare) <> 0 Then
        .Cells(i, 1).ClearContents
    End If
Next i
End With
End Sub
je t'invites à ne pas faire orgies de variable que ce qui est utile pour que ton code reste lisible!

si tu prend la plage
VB:
Set plage = Range("g2" & ":g" & Range("g65000").End(xlUp).Row) 'Range("g:g")

alors il n'y a qu'une colonne dans ta plage donc
Code:
plage.Cells(i, 1).ClearContents
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour le fil

Une autre façon de faire
(pas de boucle , mais une feuille complémentaire)
VB:
Sub Test_OK()
With Sheets("Feuil2")
    .Range("A2").Formula2 = "=NOT(EXACT(Feuil1!G2,""Date""))"
    Sheets("Feuil1").Range("G1:G45").AdvancedFilter Action:=2, CriteriaRange:=Range("A1:A2"), CopyToRange:=.Range("G1"), Unique:=0
End With
End Sub
NB: Evite de maltraiter la feuille 1
(On se sait jamais ;))

Donc pour tester, ajouter une feuille (et de de préférence donner lui le petit nom de : Feuil2)
ou faites les adaptations selon vos choix.
Bjr JM, merci d'être là toi aussi :)
ça fonctionne également nickel et je t'en remercie :)
J'ai pas compris le filtrage (puisque ça ne filtre pas lol)
Je joins le fichier test avec ton code intégré...
(j'ai nommé Feuil1 > test2
:)
 

Pièces jointes

  • Date CelCol test.xlsm
    37.6 KB · Affichages: 0

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Juste pour vous saluer tous :),
Code:
Sub Nettoyage()
Dim t, i
   t = Range("g2:g" & Cells(Rows.Count, "g").End(xlUp).Row)
   For i = 1 To UBound(t): t(i, 1) = IIf(LCase(t(i, 1)) = LCase("Date"), "Date", Null): Next
   Range("g2").Resize(UBound(t)) = t
End Sub
Bjr et merci Mapomme,
Nickel, voilà encore une autre version qui fonctionne.
Et re-fichier test joint avec ta version
:)
 

Pièces jointes

  • Date CelCol test.xlsm
    39 KB · Affichages: 3

dysorthographie

XLDnaute Accro
aller une autre version pour le poste #25
VB:
Sub NETTOYAGE2()
Dim i As Integer
With Sheets("Feuil1").Range(Range("g2"), Cells(Cells.Rows.Count, "G").End(xlUp))
   For i = .Rows.Count To 1 Step -1
   Debug.Print .Cells(i, 1)
    If Not CBool(InStr(.Cells(i, 1), "Date")) Then
        .Cells(i, 1).ClearContents
    End If
Next i
End With
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 109
Messages
2 085 384
Membres
102 878
dernier inscrit
asmaa