Ce sont des documents standard ils ne doivent pas bouger de plus le lien fonctionne...
J'ai commencé à compartimenter mon code. Pour définir le tableau je peux tenter une boucle for comme en langage C.
Ce sont des documents standard ils ne doivent pas bouger de plus le lien fonctionne...
J'ai commencé à compartimenter mon code. Pour définir le tableau je peux tenter une boucle for comme en langage C.
Dis...
Tu es sûr de tonIl n'y aurait pas un ' de trop juste avant le !? (Je ne sais pas vérifier car c'est peut-être un nom d'onglet avec espace, vu que tu remplaces une partie de la formule (xlPart))
Code : Sélectionner tout - Visualiser dans une fenêtre à part ToReplace(2) = "Outillage'!$M$10:$U$500;3;"
Cela étant, si tu veux compartimenter ton code, l'idée est d'utiliser une table Excel et de boucler sur les lignes de cette table. Tu sors ainsi tes notions métiers du code (le hard coding (= mettre en dur des valeurs dans le code), c'est le mal).
Procède de même pour tester si tes classeurs font partie de la liste des classeurs verrouillés ou pas (cela étant, tu peux utiliser Unprotect sur un classeur non verrouillé, ça ne plante pas le code).
Cela étant, tu ne dis pas si ton test est concluant en pas à pas sur le replace. En posant un point d'arrêt sur cette ligne de code, tu peux vérifier que les valeurs à remplacer sont bien celles qui sont présentes dans le classeur. Comme tu ne dis pas si tu fais ce test ni comment tu le fais, ça devient très délicat de continuer à t'aider (genre: on a un peu beaucoup l'impression de perdre son temps)...
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
En fait c'est la syntaxe Excel pour les signets xDIl n'y aurait pas un ' de trop juste avant le !? (Je ne sais pas vérifier car c'est peut-être un nom d'onglet avec espace, vu que tu remplaces une partie de la formule (xlPart))
C'est ce à quoi je pensais. Merci du conseilCela étant, si tu veux compartimenter ton code, l'idée est d'utiliser une table Excel et de boucler sur les lignes de cette table. Tu sors ainsi tes notions métiers du code (le hard coding (= mettre en dur des valeurs dans le code), c'est le mal).
Procède de même pour tester si tes classeurs font partie de la liste des classeurs verrouillés ou pas (cela étant, tu peux utiliser Unprotect sur un classeur non verrouillé, ça ne plante pas le code).
En fait si j'ai répondu un peu plus haut: le test est concluant. Le code fonctionne bien en pas à pas et on voit que les valeurs transmises à la fonction replace sont toutes correctes.Cela étant, tu ne dis pas si ton test est concluant en pas à pas sur le replace. En posant un point d'arrêt sur cette ligne de code, tu peux vérifier que les valeurs à remplacer sont bien celles qui sont présentes dans le classeur. Comme tu ne dis pas si tu fais ce test ni comment tu le fais, ça devient très délicat de continuer à t'aider (genre: on a un peu beaucoup l'impression de perdre son temps)...
Pour l'instant j'ai compartimenté le code et j'ai constaté que même réduit au strict minimum le fonctionnement du code est le même : un remplacement quand il veut bien sinon il ne fait rien...
Mon code complet avec compartimentation :
Le code de la fonction replace :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 Option Explicit Dim folder As Variant 'Folder containing all the Workbooks Dim Continue As Integer Dim filename As String 'filename contains folder name and file extension concatenated into one string Dim OpenF As Boolean Dim destinationWorkbook As Workbook 'destinationWorkbook will change at each iteration of while Dim x As Integer, y As Integer Dim ToReplace(1 To 12) As String 'bad parts of links Dim By(1 To 12) As String 'to replace by the parts contained in this string Public Sub Update_HYPERLINKS_InAllWorkbooksInFolder() Application.DisplayAlerts = False 'Disables popup warnings Dim OpenAnother As Integer OpenAnother = 7 '7 is the integer value of vbNo (No button of MsgBox) OpenF = False 'Do OpenF = OpenFilesInFolder While OpenF = True And Len(filename) <> 0 Set destinationWorkbook = Workbooks.Open(folder & filename) ReplaceString destinationWorkbook.Close True filename = Dir() ' Get next matching file Wend 'OpenAnother = MsgBox("Do you want to update another folder?" & Chr(10) & Chr(10) & "Yes to Open a new folder - No to Quit the application", _ 'vbQuestion + vbYesNo, "Updating another folder") 'Loop While OpenAnother = 6 '6 is the integer value of vbYes (Yes button of MsgBox): here the code will be repeated if OpenAnother = 6 (yes) End Sub Function OpenFilesInFolder() As Boolean folder = SelectingFolderToUpdate 'puts into folder the path of the selected folder via the dialog box filename = Dir(folder & "*.xls", vbNormal) If folder = "\\ablgcvs0246\photo\" Then Continue = MsgBox("This is the photo folder. Please make sure there is a copy up to date in 'Archive' before editing" _ & Chr(10) & Chr(10) & "OK to Continue - Cancel to Exit (Cancel if you are not sure 'Archive' is up to date)", _ vbExclamation + vbOKCancel, "Checking the files are safe before going ahead") If Continue = 1 Then OpenFilesInFolder = True Else OpenFilesInFolder = False End If ElseIf VarType(folder) = vbString Then OpenFilesInFolder = True Else OpenFilesInFolder = False End If End Function Function SelectingFolderToUpdate() As Variant Dim Answer As Variant Answer = 2 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Selecting the folder containing the files to update" 'Defines dialog box title Do 'This loop allows to change the selected folder by clicking cancel button .Show 'Displays dialog box If .SelectedItems.Count > 0 Then 'Displays selected folder (SelectedItem) Answer = MsgBox("Path of selected folder :" & Chr(10) & Chr(10) & .SelectedItems(1) & "\" _ & Chr(10) & Chr(10) & "OK to Save - Cancel to Select another one", _ vbOKCancel + vbInformation, "Selecting Folder to Update") SelectingFolderToUpdate = .SelectedItems(1) & "\" 'Returns path of selected folder Else SelectingFolderToUpdate = Answer 'returns answer1 which allows to handle cancel case Exit Do End If Loop While Answer = 2 End With End Function Sub ReplaceString() UnprotectFiles Cells.Replace What:="M$10", Replacement:="M$2" ', '_ 'LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, MatchByte:=False, _ 'SearchFormat:=True, ReplaceFormat:=False Selecting_RCD_or_TOP_ASSY_or_WorkSheet1 'Function which tests existence of RCD tab and selects it if it does 'or selects TOP ASSY or the first tab otherwise ProtectFiles End Sub Sub UnprotectFiles() '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 End Sub Sub Selecting_RCD_or_TOP_ASSY_or_WorkSheet1() Dim i As Integer, j As Integer Dim RCD_Selected As Boolean, TOP_ASSY_Selected As Boolean i = 1 j = 1 RCD_Selected = False 'will be false while RCD tab will not be selected or true if RCD tab is selected TOP_ASSY_Selected = False 'same as above for TOP_ASSY tab Do If Worksheets(i).Name = "RCD - QM-F1" Then Worksheets("RCD - QM-F1").Select RCD_Selected = True 'indicates that RCD is now selected Else i = i + 1 End If Loop While RCD_Selected <> True And i <= 2 If RCD_Selected <> True Then Do If Worksheets(j).Name = "TOP ASSY" Then Worksheets("TOP ASSY").Select TOP_ASSY_Selected = True 'indicates that TOP_ASSY is now selected ElseIf Worksheets(j).Index < Worksheets.Count Then 'j is incremented only if the worksheet index is < to the total j = j + 1 Else Exit Do End If Loop While TOP_ASSY_Selected <> True And Worksheets(j).Index <= Worksheets.Count End If If RCD_Selected <> True And TOP_ASSY_Selected <> True Then 'if there is no RCD or TOP_ASSY tab, the first tab will be selected Worksheets(1).Select End If End Sub Sub ProtectFiles() '4 files are protected. This conditional block lock them back to protect them against any modification 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.Protect End If End Sub
Comme tu peux le voir j'ai essayé de retirer différents arguments pour essayer de voir ce qui n'allait pas. Je ne suis pour l'instant pas plus avancé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Sub ReplaceString() UnprotectFiles Cells.Replace What:="M$10", Replacement:="M$2" ', '_ 'LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, MatchByte:=False, _ 'SearchFormat:=True, ReplaceFormat:=False Selecting_RCD_or_TOP_ASSY_or_WorkSheet1 'Function which tests existence of RCD tab and selects it if it does 'or selects TOP ASSY or the first tab otherwise ProtectFiles End Sub
Sinon j'ai remarqué que même manuellement ctrl+h ne trouve pas toujours : il faut alors choisir le format standard (cela s'est produit une fois je ne suis pas sûr de pouvoir en faire une règle et cela ne m'aide pas pour l'instant).
Merci de tes conseils Pierre. J'essaye des choses comme le pas à pas et changer les arguments mais pour l'instant je suis complètement bloqué![]()
Non, jamais avec une seule apostrophe.
Si le nom de l'onglet ne contient pas d'espaces, il ne faut pas d'apostrophes. Si le nom contient des espaces, alors, le nom complet doit être encadré d'apostrophes.
Ton code montre que tu cherches à remplacer "Outillage'!$M...", ce qui est correct si dans la formule, avant "Outillage", il y a quelque chose avec un espace pour le début de nom de l'onglet. Mais si tu n'as que Outillage, tu ne dois pas mettre d'apostrophes.
Avec $M$10, tu as aussi ce comportement erratique?
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Voici l'argument complet :
'M:\Service QUALITE\Gestion de l''outillage (calibrated tools)\Calibrated tools\[Liste des outillages calibrés (QM-F61) rev 2.xlsm]Outillage'!$T$10:$U$500
Il est placé dans une fonction RECHERCHEV
Ce n'est pas moi qui ai codé la fonction mais je vois qu'elle fonctionne car elle affiche le nom de l'outil si lien et plage de données sont bonnes. Ici ce n'est plus le cas après mise à jour vers le fichier rev 2 (faite avec mon code).
Mais maintenant vu la difficulté pour moi de dompter .replace je me dis qu'il serait bien plus simple de repartir à zéro en évitant si possible cette méthode aléatoire (comportement aussi erratique avec toutes les chaînes possibles).
Que me conseillerais-tu pour remplacer un morceau de chaîne placé n'importe où dans le classeur au sein d'une formule qui bien sûr n'est jamais la même ?
Je me disais bien qu'il manquait quelque chose.
En fait, personnellement, je n'aime pas du tout la recherche dans d'autres classeurs au travers de formules, que ce soit RECHERCHEV ou autres.
Je préfère de loin importer les données dans le classeur aussi souvent que nécessaire. Cela peut se faire à la main, bien sûr, mais si les données sont bien organisées (table de données ou à tout le moins plage de données sans fioritures telles que cellules fusionnées ou autres), par liaison des données, MSQuery ou VBA. C'est un jeu d'enfant et c'est bien plus stable, surtout depuis la version 2007. Le plus aisément paramétrable est la technique passant par VBA, selon moi.
C'est à mon avis beaucoup plus stable que des formules avec des noms à rallonge comme dans le cas que tu cites. Qui plus est, tu rends ton fichier indépendant de la source sauf pour la mise à jour, et si tu paramètres les accès à la source dans une feuille de paramètres, tu es sur du velours lorsque le nom du classeur sera modifié (REV 2 => REV 3, par exemple).
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
J'ai continué à déboguer toute la journée sans résultat. En plus du pas à pas j'ai mis des Debug.Print avant et après le .Replace et j'ai vérifié la boîte de dialogue de ctrl+h car elle conserve l'historique. Avant et après la méthode, les chaînes sont bien celles que je souhaite mettre dans replace et la boîte de dialogue de ctrl+h les contient bien...sauf que le remplacement ne se fait pas. En fait il s'est fait une fois, je suis allé manger puis plus jamais jusqu'à maintenant...
J'ai aussi tenté 9 combinaisons possibles de paramètres de .Replace et j'ai vu que cela n'avait aucun effet sauf peut-être MatchByte. Des pistes ?
Je suis un peu désespéré
Je viens de refaire un essai qui a mis une toute autre chaîne (celle du chemin de ThisWorkbook) alors que le Debug.Print montre que ça se passe bien et il a changé les ; en , dans la formule également c'est vraiment de la folie. Un ami en info a testé mon code et n'a trouvé aucune erreur sinon...
Bonjour,
juste utiliser la méthode Range.Find pour chercher dans les formules !
Une fois une cellule trouvée, utiliser la fonction texte VBA Replace et non pas la méthode (cf aide VBA interne) …
___________________________________________________________________________________________________________Je suis Paris, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
Merci pour ton conseil. J'ai regardé un peu la fonction find mais l'exemple de la documentation MS ne marche pas et cela m'a semblé un peu compliqué.
Ce qui me gêne c'est de devoir utiliser FindNext en même temps pour pouvoir avancer la recherche
Ton tout premier message parle de remplacements de sous-chaines dans des formules.
Et c'est sur cette base que je t'ai répondu (message n° 2).
Je ne vois nulle part ce que tu as fait de cette réponse.
Salut,
Je n'ai pas pu faire de synthèse rapidement car j'ai eu un emploi du temps assez chargé mais je n'ai pas oublié car il me tenait à coeur que cette discussion puisse servir à d'autres. Voici mes fonctions :
Fonction de remplacement des chaînes dans tous les classeurs d'un dossier avec boucle sur chaque feuille :
Documentation méthode Range.Replace (msdn)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Function ReplaceStrings() Application.ReplaceFormat.Clear 'makes sure there will be no format parameter in the replace method 'the x for loop is for repeating .Replace in all the worksheets 'the y for loop is for replacing all the strings in the table x = 1 y = 1 For x = 1 To Worksheets.Count For y = 1 To k Worksheets(x).Cells.Replace What:=ToReplace(y), Replacement:=By(y), LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False Next y Next x Application.ReplaceFormat.Clear End Function
Fonction qui récupère les chaînes à remplacement et de substitution dans une plage définie (ici "A11:B60") :
Attention, si vous faîtes du hardcoding il faudra faire attention à remplacer les ; par des , si vous cherchez une chaîne dans une formule (dont les arguments sont séparés par une virgule dans le système international/anglo-saxon). Ne pas faire cette adaptation conduit à un fonctionnement imprévisible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Function DefineToReplaceBy() Dim Table As Variant: Table = ThisWorkbook.Worksheets(1).Range("A11:B60").Value 'table containing the strings Dim LastReplacement As Integer: LastReplacement = ThisWorkbook.Worksheets(1).Range("A11:B60").SpecialCells(xlCellTypeLastCell).Row - 11 'maximum number of replacements ThisWorkbook.Worksheets(1).Range("A11:B60").NumberFormat = "@" 'first while loop counts till the last string is reached k = 1 While VarType(Table(k, 1)) <> vbEmpty And VarType(Table(k, 1)) <> vbNull And k < ThisWorkbook.Worksheets(1).Range("A11:B60").SpecialCells(xlCellTypeLastCell).Row k = k + 1 Wend LastReplacement = k - 1 'the loops will stop at the last string 'second while loop sets each ToReplace(k) to Table(k,1) from k = 1 to k = LastReplacement (from first string to last string to replace) k = 1 While VarType(Table(k, 1)) <> vbEmpty And VarType(Table(k, 1)) <> vbNull And k <= LastReplacement ToReplace(k) = Table(k, 1) k = k + 1 Wend 'third and last while loop do the same for By(k) k = 1 While VarType(Table(k, 2)) <> vbNull And k <= LastReplacement If VarType(Table(k, 2)) = vbEmpty Then Table(k, 2) = "" 'any empty cell will be converted into an empty string By(k) = Table(k, 2) k = k + 1 Wend End Function
Perso, je reste persuadé qu'il est préférable d'importer les données puis de travailler en local.
Mais perso, je reste aussi persuadé qu'il y a une coquille dans le texte cherché, car je ne vois a priori pas pourquoi la méthode .replace ne fonctionnerait pas (surtout si elle a fonctionné avant).
La chaine M:\Service QUALITE\Gestion de l''outillage (calibrated tools)\Calibrated tools\[Liste des outillages calibrés (QM-F61) rev 2.xlsm]Outillage'!$T$10:$U$500 peut receler plusieurs soucis et on a déjà fait plus simple comme chemin d'accès...
Vérifie bien que la chaîne que tu utilises correspond bien à ton texte à remplacer... Une idée serait de saisir ce chemin dans une cellule et d'appeler la cellule dans ton code. D'abord, tu éviterais le hard coding, puis tu pourrais t'assurer que la chaine utilisée dans la cellule correpond à ce qui est cherché.
Comme test, tu pourrais reprendre l'idée de Marc et utiliser ta chaine dans un replace pour voir si ça matche ou pas...
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Pour l'importation de données il faudra refondre toute la gestion des fichiers. D'une part je n'aurai pas le temps et d'autre part le service INFO ne va pas aimer un tel remaniement xD
Sinon tu as raison et j'y pensais déjà avant pour rendre le code ergonomique : remplacer la définition old school des variables par la définition par une plage.
Je vais tenter ce test.
Sinon je me suis rendu compte qu'une manipulation à la noix fonctionnait : dézinguer le lien par une modif au hasard qui de toute façon ne s'applique pas (le chemin de ma macro s'applique) puis je remplace morceau par morceau. Une boîte de dialogue "mettre à jour les valeurs" apparaît dans le fichier. Je pense que c'est elle qui est en cause. J'ai DisplayAlerts = False dans mon code donc c'est bizarre que cela m'empêche de faire le remplacement...une idée ?
J'ai adapté ce code qui ne trouve rien dans mes feuilles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Sub MultipleSearch() Application.FindFormat.Clear ' Get name to search Dim ToReplace As String: ToReplace = "$T$10:$U$500;2;" ' Get search range Dim rgSearch As Range Dim x As Integer x = 1 For x = 1 To Worksheets.Count Set rgSearch = ActiveWorkbook.Worksheets(x).Range("A1:Z300") Dim cell As Range Set cell = rgSearch.Find(ToReplace, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False) ' If not found then exit If cell Is Nothing Then Debug.Print "Not found" Else ' Store first cell address Dim firstCellAddress As String firstCellAddress = cell.Address Do Debug.Print "Found: " & cell.Address Set cell = rgSearch.FindNext(cell) cell.Value = Replace(cell.Value, "$T$10:$U$500;2;", "$M$2:$U$500;3;") Loop While firstCellAddress <> cell.Address End If Next x End Sub
Bonjour.
Remplace
PAR
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ToReplace(4) = "$T$10:$U$500;2" By(4) = "$M$2:$U$500;3"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ToReplace(4) = "$T$10:$U$500,2" By(4) = "$M$2:$U$500,3"
et en essayant selection.Value = Replace(expression:=cell.Value, Find:="$T$10:$U$500;2;", replace:="$M$2:$U$500;3;", compare:=vbTextCompare) sur une cellule censée devoir être remplacée?
Si ça ne fonctionne toujours pas, c'est que la valeur cherchée n'est pas présente...
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Il ne prend même pas cet instruction et avec la doc je ne vois pas pourquoi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Sub test() Workbooks("FS000116 FWDMOUNT.xls").Worksheets(16).Range("K8").Activate 'erreur 1004 et erreur 438 sans la méthode Workbooks("FS000116 FWDMOUNT.xls").Worksheets(16).Range("K8").Select Selection.Value = Replace(expression:=cell.Value, Find:="$T$10:$U$500;2;", Replace:="$M$2:$U$500;3;", compare:=vbTextCompare) End Sub
Jacques,
La méthode Replace d'un objet Range fonctionne sur les formules sans problèmes (elle ne fonctionne d'ailleurs que sur les formules, le LookIn étant implicitement xlFindLookIn.XlFormulas). Il n'est donc a priori pas nécessaire de passer par une boucle pour modifier une partie de formule qui est identique sur une plage de cellules.
Il faudrait que l'auteur de la discussion teste la fonction Replace, sinon, on va se perdre en conjectures sur 250 messages. Je rappelle que le demandeur lui-même a précisé que son code fonctionnait jusqu'à vendredi dernier. Il serait intéressant qu'il investigue pour voir ce qui a changé vendredi. Et je reste persuadé que pour ma part, c'est quelque chose dans le chemin recherché qui a bougé.
Mais comme on n'a de réponse de sa part ni sur le test avec la fonction, ni sur ces éventuelles investigations, nous y allons tous de notre petite idée sans que cela puisse déboucher sur une solution, sauf hasard...
Ici, nous en sommes à 29 messages, sans avoir eu à aucun moment la certitude que le texte cherché était bien présent. Or, sans avoir entendu parler de bug tant sur la méthode que sur la fonction, si l'une et l'autre ne remplacent pas, ben c'est qu'elles n'ont pas trouvé à remplacer, me semble-t-il...
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Le texte est bien présent : je le copie de la chaîne à rechercher (Ctrl+C) directement dans mon code (que j'ai adapté pour récupérer les infos depuis une plage).
De plus je fais les tests suivants : F8 et Debug.Print. Les deux indiquent que toutes les variables sont correctement transmises à Replace.
J'ai également testé 9 combinaisons possibles d'arguments de Replace pour voir l'effet de ces variables et il est nul.
Désolé de rester bloquer si longtemps mais mon problème ne me semble pas trivial sinon je n'aurais même pas eu besoin de poster ma question.
J'ai commencé à me documenter sur .Find et à faire des tests et pour l'instant en combinant .Find et la fonction replace je n'ai pas plus de succès
Partager