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   -
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

  1. 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
    0
    1. Nat4287 Messages postés 6 Statut Membre
       
      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
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Nat4287 Messages postés 6 Statut Membre
       
      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
    3. Nat4287 Messages postés 6 Statut Membre
       
      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
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Nat4287 Messages postés 6 Statut Membre
       
      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
    5. Nat4287 Messages postés 6 Statut Membre
       
      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