Fonction Replace fonctionne seulement en dehors des formules
Bonjour à tous,
J'ai découvert le VBA il y a peu et j'ai codé une macro afin de réparer les liens d'un répertoire de 300 classeurs (Workbooks) Excel à peu près. Pour cela j'ai utilisé la Cells.Replace What:=ToReplace(y), Replacement:=By(y)...dans une boucle en y (pour parcourir un tableau contenant les sous-chaînes à remplacer elle-même dans une boucle en x qui parcourt les feuilles de calcul (Worksheets). Mon code a fonctionné pour nombre de liens. Cependant j'ai également une plage de données à modifier dans des formules mais rien à faire replace n'y touche pas alors que via ctrl+h cela fonctionne.
Merci de m'avoir lu. Je compte sur vos idées pour m'expliquer ce qui ne va pas xD
Mon code fait 200 lignes grosso modo donc je ne poste que la partie qui utilise le replace pour ne pas vous perdre...:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
filename = Dir(folder & "*fs*" & "*.xls", vbNormal)
'strings to replace in the paths of formulas
ToReplace(1) = folder 'the local folder path is always to be deleted
ToReplace(2) = "\photo" 'photo is the destination folder from where FS are taken
ToReplace(3) = "\\ABLGCVS0246\" 'for edition so these two paths could be to delete
ToReplace(4) = "$T$10:$U$500;2" 'ce remplacement est celui qui ne fonctionne pas
ToReplace(5) = "'M:\Service QUALITE\Gestion de l''outillage (calibrated tools)\Calibrated tools\[Liste des outillages calibrés (QM-F61).xls]"
ToReplace(6) = "\Fiches suiveuses actives"
ToReplace(7) = "rev 2.xls]"
'they will be replaced by those ones:
By(1) = "M:\"
By(2) = ""
By(3) = "M:\"
By(4) = "$M$2:$U$500;3"
By(5) = "'M:\Service QUALITE\Gestion de l''outillage (calibrated tools)\Calibrated tools\[Liste des outillages calibrés (QM-F61) rev 2.xlsm]'"
By(6) = ""
By(7) = "rev 2.xlsm]"
While Len(filename) <> 0
Set destinationWorkbook = Workbooks.Open(folder & filename)
x = 1
For x = 1 To Worksheets.Count
'4 files are protected. This conditional block unlock them
If destinationWorkbook.name = "fs000106 310a2020-5, -10, -11.xls" _
Or destinationWorkbook.name = "fs000109 310a2041.xls" _
Or destinationWorkbook.name = "fs000223 335-106-4xx-0.xls" _
Or destinationWorkbook.name = "fs000270 AFT EMS 5A-B.xlsm" Then
destinationWorkbook.Unprotect
End If
y = 1
For y = 1 To 7
Worksheets(x).Cells.Replace What:=ToReplace(y), _
Replacement:=By(y), _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
Next y
Next x |
Argument facultatif MatchByte (Cells.Replace)
Bonjour,
Merci beaucoup pour ta réponse unparia. Cette méthode pourra m'être utile.
Je me suis rendu compte de l'absence de l'argument facultatif MatchByte dans mon code. En effet, le rechercher/remplacer via ctrl+h ne le propose pas ! Or certains caractères susceptibles d'être codés sur 2 octets au lieu de 1 peuvent poser problème ce qui a été le cas pour moi semble-t-il. Avec cet argument mon code a fonctionné. Je n'ai pas d'ordinateur chez moi donc je ne peux pas faire d'autres tests. Quand je m'en serai assuré je noterai la discussion résolue et posterai la ligne de code incriminée car je pense que plus d'un novice tel que moi pourra commettre l'erreur.
Modification infructueuse :/
Rebonjour,
Sur des feuilles tests, ma modification permet à mon code de faire la modification, mais dans les feuilles visées non...
Code avant modification :
Code:
1 2 3 4 5 6
|
For y = 1 To 10
Worksheets(x).Cells.Replace What:=ToReplace(y), _
Replacement:=By(y), _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
Next y |
Code après modification (ajout de MatchByte:=False et de xlCellTypeFormulas) :
Code:
1 2 3 4 5 6
|
For y = 1 To 10
If ToReplace(y) = "Exit For" Or By(y) = "Exit For" Then Exit For 'permet de définir plus de chaînes à remplacer sans modifier les itérations de la boucle for
Cells.SpecialCells(xlCellTypeFormulas).Replace What:=ToReplace(y), Replacement:=By(y), LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=True, MatchByte:=False, SearchFormat:=False, ReplaceFormat:=False
Next y |
Auriez-vous des idées ?