IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction Replace fonctionne seulement en dehors des formules [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    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.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Dis...

    Tu es sûr de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ToReplace(2) = "Outillage'!$M$10:$U$500;3;"
    Il 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))

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

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Il 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))
    En fait c'est la syntaxe Excel pour les signets xD

    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).
    C'est ce à quoi je pensais. Merci du conseil

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

    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 :
    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
    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
     
    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
    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é...

    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é

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Nagel Tha Voir le message
    En fait c'est la syntaxe Excel pour les signets xD[...]
    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...
    ---------------

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    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 ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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...
    ---------------

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    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...

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    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, …

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    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

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    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.

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    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 :
    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
    Documentation méthode Range.Replace (msdn)

    Fonction qui récupère les chaînes à remplacement et de substitution dans une plage définie (ici "A11:B60") :
    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
    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.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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...
    ---------------

  13. #13
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    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...
    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 ?

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    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

  15. #15
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    Remplace

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

  16. #16
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Citation Envoyé par Docmarti Voir le message
    Bonjour.

    Remplace

    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"
    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"
    Merci pour l'astuce je vais essayer

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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...
    ---------------

  18. #18
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    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
    Il ne prend même pas cet instruction et avec la doc je ne vois pas pourquoi

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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...
    ---------------

  20. #20
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    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...
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Fonction .replace qui ne fonctionne pas.
    Par Rominou777 dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 09/02/2012, 19h22
  2. Réponses: 4
    Dernier message: 20/10/2010, 19h56
  3. Réponses: 20
    Dernier message: 06/05/2010, 12h32
  4. Stopper le fonctionnement des formules
    Par lipadec dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 13/06/2009, 18h58
  5. fonction replace avec des guillemets
    Par mapmip dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/01/2009, 08h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo