Rechercher/remplacer avec autofilter

Messages postés
6
Date d'inscription
mercredi 14 août 2019
Statut
Membre
Dernière intervention
16 août 2019
- - Dernière réponse : yg_be
Messages postés
8287
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
- 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 ?
Afficher la suite 

1 réponse

Messages postés
8287
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412
0
Merci
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
yg_be
Messages postés
8287
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 > Nat4287
Messages postés
6
Date d'inscription
mercredi 14 août 2019
Statut
Membre
Dernière intervention
16 août 2019
-
merci d'utiliser les balises de code quand tu postes du code.
dans une procédure, tu ne peux faire qu'une fois un dim d'une variable, le second
dim col
est donc une erreur.
il est inutile de refaire plusieurs fois
set col
puisque col ne change pas.
Nat4287
Messages postés
6
Date d'inscription
mercredi 14 août 2019
Statut
Membre
Dernière intervention
16 août 2019
-
Oups. Message reçu pour les balises. Merci !

Ca ne fonctionne toujours pas. Désolée d'insister, j'ai vraiment l'impression d'abuser là !
Ma procédure tourne (bizarrement avec 2 x "Loop"; comprends pas, mais bon ! ) mais on laisse.
Peut-être je m'exprime mal et je vais donc reprendre.

J'ai 2 sortes de codes à transformer:
- exemple 1: 2300 (Sucettes) et 2301(Pommes d'amour).
Ces codes ne sont pas toujours présents dans mon extraction. Il sont uniques dans la cellule.
- exemple 2: "AL, AL, AL" ou "AL, AL, AL, AL, AL" et ainsi de suite avec d'autres codes du même genre.
La plupart de ces codes multiples sont présents, mais certains pas toujours.
C'est pour cela que j'ai utilisé les 2 procédures différentes que tu m'as fournies.

Ma macro comporte un tas d'autres procédures. Ces remplacements ne sont donc les seuls que je dois faire. Mais il serait fastidieux de devoir tout reproduire ici et d'un point de vue déontologie, je ne peux pas.

J'ai testé la procédure ci-dessous en insérant manuellement 2 codes 2300 et 2301 (simulation). Il ne change qu'un seul des 2 ! Premier hic.
Ensuite, il ne tient pas du tout compte des lignes "Call changeons... "

Est-ce que c'est plus clair pour toi ?

Voici ma procédure:

[/contents/446-fichier-sub Sub] nat4287()
    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)
'Dim Col As Range
'Set Col = Intersect(ActiveSheet.Columns(4), ActiveSheet.UsedRange)
Call changeons(Col, "AL")
Call changeons(Col, "AR")
Call changeons(Col, "AU")

Loop    
    Loop

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


Merci pour ton temps passé avec une grande débutante !
yg_be
Messages postés
8287
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 > Nat4287
Messages postés
6
Date d'inscription
mercredi 14 août 2019
Statut
Membre
Dernière intervention
16 août 2019
-
plutôt ainsi:
Sub nat4287()
    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)
    Loop
    Set trouve = Col.Find("2301")
    Do Until trouve Is Nothing
        trouve.Value = "Pomme d'amour"
        Set trouve = Col.FindNext(trouve)
    Loop
    Call changeons(Col, "AL")
    Call changeons(Col, "AR")
    Call changeons(Col, "AU")
End Sub

ou bien
Option Explicit

Private Sub nat4287()
    Dim Col As Range, trouve As Range
    Set Col = Intersect(ActiveSheet.Columns(4), ActiveSheet.UsedRange)
    Call changeons2(Col, "2300", "Sucettes")
    Call changeons2(Col, "2301", "Pomme d'amour")
    Call changeons(Col, "AL")
    Call changeons(Col, "AR")
    Call changeons(Col, "AU")
End Sub
Private Sub changeons2(zone As Range, chercher As String, remplacer As String)
Dim trouve As Range
Set trouve = zone.Find(chercher)
Do Until trouve Is Nothing
    trouve.Value = remplacer
    Set trouve = zone.FindNext(trouve)
Loop
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
Nat4287
Messages postés
6
Date d'inscription
mercredi 14 août 2019
Statut
Membre
Dernière intervention
16 août 2019
-
Yg_be, je ne sais pas comment te remercier !
Les 2 procédures fonctionnent. C'est magique ! Je n'ai que l'embarras du choix maintenant ;-)
Mille mercis en tout cas et bon week-end !
yg_be
Messages postés
8287
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 > Nat4287
Messages postés
6
Date d'inscription
mercredi 14 août 2019
Statut
Membre
Dernière intervention
16 août 2019
-
avec plaisir! peux-tu marquer comme résolu, via la roue dentée à droite du titre?
Commenter la réponse de yg_be