Rechercher/remplacer avec autofilter
Résolu
Nat4287
Messages postés
6
Statut
Membre
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
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 ?
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 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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-
-
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 -
-
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, ...). -
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 !
-