Rechercher/remplacer avec autofilter

Résolu/Fermé
Nat4287 Messages postés 6 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 16 août 2019 - 14 août 2019 à 14:25
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 16 août 2019 à 16:44
Bonjour,

Je suis débutante en VBA et j'avoue que je ne maîtrise pas tout. Je cherche et je ne trouve pas ce que je veux; je m'adresse donc à vous avec beaucoup d'espoir.

Je vais essayer de m'exprimer clairement.
Les données de mon tableau excel proviennent d'une autre base de données, ce qui implique que j'ai des données variables. Dans la colonne D, j'ai une suite de codes, que je dois remplacer.
Exemple
D3: "MA, MA, MA"
D4: "MA, MA, MA, MA"
D5: "MA"

Il faudrait que pour toutes ces valeurs il n'y ait qu'un seul "MA" dans la cellule ! Evidemment, j'ai d'autres séries de codes dans le même genre. D'où la macro...

Au départ, j'avais fait un Autofilter, qui fonctionnait bien.
Sub Macro1 ()
Range("D3").AutoFilter Field:=4, Criteria1:="=*MA, MA*", Operator:=xlAnd
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Selection.Replace What:="", Replacement:="MA"
End Sub

Ca fonctionnait jusqu'au moment où je suis tombée sur des valeurs qui n'existaient pas. Mon autofilter déconne un peu, puisqu'il ne trouve pas la valeur.

Comment peut-on contourner la problématique de codes qui parfois sont présents ou pas ?
Variable ? Conditions ? Mais le hic, est que j'arrive dans une matière que je ne maîtrise pas du tout !

Avez-vous une solution pour moi ?

1 réponse

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
14 août 2019 à 14:55
bonjour, je ferais ainsi:
Private Sub ma()
Dim col As Range, trouve As Range
Set col = Intersect(ActiveSheet.Columns(4), ActiveSheet.UsedRange)
Set trouve = col.Find("MA, MA", , , xlPart)
Do Until trouve Is Nothing
    trouve.Value = "MA"
    Set trouve = col.FindNext(trouve)
Loop
End Sub
0
Nat4287 Messages postés 6 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 16 août 2019
14 août 2019 à 15:35
Génial, ça fonctionne ! La magie a opéré. Merci beaucoup yg_be !
Et maintenant comme j'ai plusieurs autres codes différents comme "AL, AL, etc" à remplacer, dois-je refaire une déclaration DIM en changeant les valeurs ? Ou il y a un script plus simple ?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Nat4287 Messages postés 6 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 16 août 2019
14 août 2019 à 15:58
une façon de faire:
Private Sub nat4287()
Dim col As Range
Set col = Intersect(ActiveSheet.Columns(4), ActiveSheet.UsedRange)
Call changeons(col, "MA")
Call changeons(col, "AL")
Call changeons(col, "etc")
End Sub
Private Sub changeons(zone As Range, texte As String)
Dim trouve As Range
Set trouve = zone.Find(texte + ", " + texte, , , xlPart)
Do Until trouve Is Nothing
    trouve.Value = texte
    Set trouve = zone.FindNext(trouve)
Loop
End Sub

on pourrait aussi lire une liste des valeurs quelque part dans Excel
0
Nat4287 Messages postés 6 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 16 août 2019
14 août 2019 à 16:41
Merci beaucoup.
Dois-je comprendre qu'il y a 2 macros ci-dessus ? VBA me les sépare comme 2 macros distinctes...
La 1° macro fait tourner l'autre ?

En tout cas, ça me donne le résultat escompté. Je vais tester avec l'ensemble de mes données.
Mille mercis pour ton aide !
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Nat4287 Messages postés 6 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 16 août 2019
14 août 2019 à 17:14
ce sont deux procédures distinctes, en effet. la première, si tu supprimes le "private", peut être associée à une macro. la seconde est appelée par la première, comme tu l'écris.
il serait possible de chercher le premier mot de chaque cellule, puis de chercher si il se répète, séparé par des virgules, et remplacer le contenu par le premier mot. cela éviterait d'avoir une liste (MA, AL, ...).
0
Nat4287 Messages postés 6 Date d'inscription mercredi 14 août 2019 Statut Membre Dernière intervention 16 août 2019
16 août 2019 à 11:37
C'est vrai que la proposition est alléchante mais ça commence à devenir chaud pour moi.
Mon souci maintenant est que j'ai intégré les différentes procédures (j'ai besoin des 2 procédures que tu m'as faites) dans ma grosse macro et ça cale.
Ca cale sur le "DIM call AS Range


Dim col As Range
Set col = Intersect(ActiveSheet.Columns(4), ActiveSheet.UsedRange)
Call changeons(col, "AL")
Call changeons(col, "AR")
Call changeons(col, "AU")

Plus haut dans ma macro, j'ai inséré ceci
Dim col As Range, trouve As Range
Set col = Intersect(ActiveSheet.Columns(4), ActiveSheet.UsedRange)
Set trouve = col.Find("2300")
Do Until trouve Is Nothing
trouve.Value = "Sucettes"
Set trouve = col.FindNext(trouve)
Set col = Intersect(ActiveSheet.Columns(4), ActiveSheet.UsedRange)
Set trouve = col.Find("2301")
Do Until trouve Is Nothing
trouve.Value = "Pomme d'amour"
Set trouve = col.FindNext(trouve)
Loop

Séparément, elles fonctionnent mais pas ensemble, semble-t-il !
0