Rédaction macro VBA "remplacer par"

Bonjour,

Je souhaite rédiger une macro VBA qui remplacerait dans tous les feuillets de mon classeur des expressions "ExpA" par des expressions "ExpB". Ces remplacements doivent se faire dans les formules.

Sur internet, j'ai trouvé ce code :

Public Sub Rempl()
Dim feuil As Worksheet
For Each feuil In ThisWorkbook.Worksheets
    feuil.Cells.Replace What:="ExpA", Replacement:="ExpB"
Next feuil
End Sub

Mais, j'ai plusieurs expressions ExpA1, ExpA2, ExpA3, ExpAx... à remplacer par ExpB1, ExpB2, ExpB3, ExpBx...

Je voudrais tout remplacer en une seule et même macro.

Quelqu'un peut-il m'indiquer comment modifier le code ci-dessus pour que la macro opère plusieurs remplacements à la suite?

Merci

Nicole

Bonjour,

Joins-nous un fichier modélisé sur ta demande. Les expression génériques que tu donnes dans l'exemple n'est pas très parlant.

Bonjour,

essaie en ajoutant le paramètres Lookat dans ton instruction replace

feuil.Cells.Replace What:="ExpA", Replacement:="ExpB",lookat:=xlpart
Raja a écrit :

Bonjour,

Joins-nous un fichier modélisé sur ta demande. Les expression génériques que tu donnes dans l'exemple n'est pas très parlant.

Bonjour Raja,

Je reformule :

Je crois que le code ci-dessous remplace "ExpA" par "ExpB" dans tout mon fichier.

Public Sub Rempl()
Dim feuil As Worksheet
For Each feuil In ThisWorkbook.Worksheets
    feuil.Cells.Replace What:="ExpA", Replacement:="ExpB"
Next feuil
End Sub

Disons par exemple que je veux non seulement remplacer "ExpA" par "ExpB", mais aussi "ExpC" par "ExpD" dans la même macro.

Comment rédiger cela?


h2so4 a écrit :

Bonjour,

essaie en ajoutant le paramètres Lookat dans ton instruction replace

[code][/feuil.Cells.Replace What:="ExpA", Replacement:="ExpB,lookat:=xlpart"

code]

Bonjour H2SO4,

Merci pour ta réponse. Juste une question : ça sert à quoi lookat:=xlpart?

Es-tu sûr du code VBA que tu as posté? Cela ne devient-il pas :

[code][/feuil.Cells.Replace What:="ExpA", Replacement:="ExpB" ,lookat:=xlpart

code][/quote]

Bonjour,

Lookat:=xlpart fait le remplacement dès qu'il trouve, dans une cellule, la chaine de caractère contenue dans le paramètre what:=, même si cette chaine de caractères n'est qu'une partie du contenu de la cellule.

pour la syntaxe, il y a eu un problème au moment du post du message, j'ai normalement corrigé voir message plus haut

h2so4 a écrit :

Lookat:=xlpart fait le remplacement dès qu'il trouve, dans une cellule, la chaine de caractère contenue dans le paramètre what:=, même si cette chaine de caractères n'est qu'une partie du contenu de la cellule.

ah super, c'est exactement mon cas de figure : les expressions à remplacer sont une partie des formules de mon fichier.

Et si je veux que ma macro gère successivement plusieurs "remplacer par" dans la même macro, sais-tu comment le rédiger?

Est-ce que cela est correct :

Public Sub Rempl()
Dim feuil As Worksheet
For Each feuil In ThisWorkbook.Worksheets
    feuil.Cells.Replace What:="ExpA", Replacement:="ExpB",lookat:=xlpart
    feuil.Cells.Replace What:="ExpC", Replacement:="ExpD",lookat:=xlpart
Next feuil
End Sub

?

Correct, comme tu l'aurais remarqué si tu avais essayé.

h2so4 a écrit :

Correct, comme tu l'aurais remarqué si tu avais essayé.

merci, je ne pensais pas que ce serait si simple...

Est-ce que le code ci-dessous prend en compte la casse des expressions entre guillements ou pas?

Après un test il m'a semblé que non, mais vu que globalement, cette macro ne fonctionne pas (les "remplacer par" ne sont pas réalisés dans le fichier et la macro semble tourner sans s'arrêter), je cherche à comprendre pourquoi.

Public Sub Rempl()
Dim feuil As Worksheet
For Each feuil In ThisWorkbook.Worksheets
    feuil.Cells.Replace What:="ExpA", Replacement:="ExpB",lookat:=xlpart
    feuil.Cells.Replace What:="ExpC", Replacement:="ExpD",lookat:=xlpart
Next feuil
End Sub

C'est un gros fichier excel dans lequel il y a plein de formules du type RECHERCHEV($A2;Data!$A:$L;2;FAUX) à remplacer par =RECHERCHEV($A2;Data!$A1:$L1500;2;FAUX).

En gros, pour essayer de gagner en vitesse de calcul, j'ai besoin de remplacer toutes les plages mal définies (seulement avec des colonnes) par une plage impliquant les mêmes colonnes mais de la ligne 1 à la ligne 1500 seulement.

Cette discussion (https://forum.excel-pratique.com/excel/accelerer-fichier-excel-t88927-10.html) était partie sur une idée, et le présent thread s'est réorienté vers la réitération bête et méchante de "remplacer par" dans tout le fichier.

La macro ci-dessous est sensée permettre de remplacer de manière sérialisée et successivement dans tous les feuillets du fichier toutes les occurences de plages mal définies dans les RECHERCHEV(). Par exemple, pour traiter les formules impliquant les plages de "a:a" à "a:g", voici la macro :

Public Sub Rempl()
Dim feuil As Worksheet
For Each feuil In ThisWorkbook.Worksheets
    feuil.Cells.Replace What:="a:a;", Replacement:="a1:a1500;", lookat:=xlPart
    feuil.Cells.Replace What:="a:b;", Replacement:="a1:b1500;", lookat:=xlPart
    feuil.Cells.Replace What:="a:c;", Replacement:="a1:c1500;", lookat:=xlPart
    feuil.Cells.Replace What:="a:d;", Replacement:="a1:d1500;", lookat:=xlPart
    feuil.Cells.Replace What:="a:e;", Replacement:="a1:e1500;", lookat:=xlPart
    feuil.Cells.Replace What:="a:f;", Replacement:="a1:f1500;", lookat:=xlPart
    feuil.Cells.Replace What:="a:g;", Replacement:="a1:g1500;", lookat:=xlPart
Next feuil
End Sub

Actuellement, cette macro ne semble pas fonctionner.

Elle a tourné quelques heures pour finir par planter excel (j'avais mis une soixantaine d'itérations à la place des 7 présentes dans le code ci-dessus).

A présent, en testant avec seulement " feuil.Cells.Replace What:="a:b;", Replacement:="a1:b1500;", lookat:=xlPart", ça ne fonctionne pas non plus.

De plus, ce serait bien que la casse des expressions à remplacer ne soit pas prise en compte, c'est à dire que le code ci-dessus remplace "a:b;", mais aussi "A:b;", "a:B;", "A:B;"

Etant donné que certains feuillets utilisent jusqu'à la colonne QX, si je dois me taper toutes les combiaisons de plages possibles (car bien entendu, ces plages mal rédigées sont un peu partout dans le fichier et je ne sais pas précisément quelles sont ces plages), ça fait + de 11.000 "remplacer par" :

a:a

a:aa

a:ab

a:ac

a:ad

a:ae

a:af

a:ag

a:ah

a:ai

a:aj

a:ak

a:al

a:am

a:an

a:ao

a:ap

a:aq

a:ar

a:as

a:at

a:au

a:av

a:aw

a:ax

a:ay

a:az

a:b

etc...

sans compter si la casse entre en ligne de compte et sans compter le double aussi si je veut traiter les a:$a, a:$aa, a:$ab, etc...

Donc même si cela fonctionnait, les itérations de "remplacer par" ne seraient pas vraiment satisfaisantes non plus...

Donc ce qui résoudrait vraiment le problème serait un remplacement tous azimuts des expressions de type :

[1 ou 2 caractères texte] suivi de ":" ou ":$" et suivi de [1 ou 2 caractères texte]

par :

[1 ou 2 caractères texte] suivi de "1" suivi de ":" ou ":$" et suivi de [1 ou 2 caractères texte] suivi de "1500"

Attention de ne pas remplacer les expressions impliquant un chiffre : seulement [1 ou 2 caractères texte], pas [1 ou 2 nombres]

Merci de votre aide!

nicopat a écrit :

Attention de ne pas remplacer les expressions impliquant un chiffre : seulement [1 ou 2 caractères texte], pas [1 ou 2 nombres]

Rechercher des sujets similaires à "redaction macro vba remplacer"