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

  2. #2
    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
    Bonjour
    Si j'ai bien compris, tu veux remplacer des sous-chaînes dans des formules ?
    - Une formule est une chaîne de caractères
    - la formule éventuelle d'une cellule est sa propriété Formula
    - tu peux définir la plage des cellules contenant une formule par la méthode Range.SpecialCells (rubrique Range.SpecialCells, méthode de ton aide interne vba) avec l'argument xlCellTypeFormulas
    te reste à appliquer ta fonction replace à la propriété Formula des cellules de cette plage.
    Je te laisse faire sur ces indications qui me paraissent claires et suffisantes.

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

  4. #4
    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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  5. #5
    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
    En fait, il y a eu tellement de tests que l'on ne sait plus ce qui a été essayé ni dans quelle version, et je me suis moi-même un peu emmêlé les pinceaux entre le CTRL+F (en français) et le range.replace (en anglais).

    Ce que je viens de constater dans le fichier, c'est que les cellules qui contiennent les formules sont fusionnées (l'étaient-elles avant vendredi dernier?).

    Le Find/Replace doit donc tenir compte de cette fusion de cellule (dans Excel comme dans VBA).
    "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...
    ---------------

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

    On peut éviter Find avec la méthode Replace adaptée aux formules en anglais …

    J'ai évoqué Find après avoir constaté l'échec du remplacement en français sans avoir eu
    le temps de tester un peu plus même si cela aurait dû faire tilt dans ma p'tite caboche !

  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
    Citation Envoyé par Pierre Fauconnier Voir le message
    En fait, il y a eu tellement de tests que l'on ne sait plus ce qui a été essayé ni dans quelle version, et je me suis moi-même un peu emmêlé les pinceaux entre le CTRL+F (en français) et le range.replace (en anglais).

    Ce que je viens de constater dans le fichier, c'est que les cellules qui contiennent les formules sont fusionnées (l'étaient-elles avant vendredi dernier?).

    Le Find/Replace doit donc tenir compte de cette fusion de cellule (dans Excel comme dans VBA).
    Oui. Ça c'est une constante : ce n'est pas moi qui ai édité ces fiches. Beaucoup de cases sont fusionnées mais pas toutes

    Cependant la recherche se fait par ligne donc elle n'est pas sensible à la fusion à priori non ?

  8. #8
    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
    Salut.

    Que veux-tu dire par "dans les feuilles visées"...?

    Comment démarres-tu ta macro? Le titre de ta question "en dehors des formules" me fait penser que tu essaies de réaliser cela par l'appel de ta fonction dans une formule Excel. Si c'est le cas, ça ne peut fonctionner. Une fonction personnelle appelée dans une feuille de calcul ne peut RIEN modifier dans Excel et peut seulement renvoyer une valeur exploitable dans la formule.
    "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...
    ---------------

  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
    Salut,

    Que veux-tu dire par "dans les feuilles visées"...?
    Pour moi les feuilles visées sont les feuilles de calcul (worksheets) des classeurs (workbooks) ouverts successivement par la méthode .Open. Dans mon code j'appelle ces classeurs "destinationWorkbook" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set destinationWorkbook = Workbooks.Open(folder & filename)
    Comment démarres-tu ta macro?
    F5/F8 voire le bouton play sous l'IDE VBA intégré à Excel.

    "en dehors des formules"
    Pour moi une formule est : "=FONCTION(PARAM1,PARAM2,...,PARAMX)" par exemple ainsi "bonjour" et "3" ne sont pas des formules selon moi.

    Si j'ai bien compris, tu veux remplacer des sous-chaînes dans des formules ?
    C'est cela que je souhaite via VBA. Mon problème étant que dans les fichiers que je veux modifier, certaines sous-chaînes restent inchangées...

    Mon sub "main" complet :
    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
     
    Option Explicit
    Public Sub Update_HYPERLINKS_InAllWorkbooksInFolder()
     
        Application.DisplayAlerts = False 'Disables popup warnings
        Application.ScreenUpdating = False 'No new windows will appear
     
        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 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
        Dim destinationWorkbook As Workbook 'destinationWorkbook will change at each iteration of while
     
        Dim x As Integer, y As Integer
     
        Dim OpenAnother As Integer
        OpenAnother = 7 '7 is the integer value of vbNo (No button of MsgBox)
     
        ToReplace(1) = "Exit For"
        ToReplace(2) = "Exit For"
        ToReplace(3) = "Exit For"
        ToReplace(4) = "Exit For"
        ToReplace(5) = "Exit For"
        ToReplace(6) = "Exit For"
        ToReplace(7) = "Exit For"
        ToReplace(8) = "Exit For"
        ToReplace(9) = "Exit For"
        ToReplace(10) = "Exit For"
        ToReplace(11) = "Exit For"
        By(1) = "Exit For"
        By(2) = "Exit For"
        By(3) = "Exit For"
        By(4) = "Exit For"
        By(5) = "Exit For"
        By(6) = "Exit For"
        By(7) = "Exit For"
        By(8) = "Exit For"
        By(9) = "Exit For"
        By(10) = "Exit For"
        By(11) = "Exit For"
        'Folder containing all the Workbooks:
        Do
     
        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 = 2 Then
                Application.ScreenUpdating = True
                Exit Sub 'exits the sub if the cancel button of MsgBox is clicked
            End If
        End If
     
        If VarType(folder) <> vbString Then
            Application.ScreenUpdating = True
            Exit Sub 'exits the sub if the cancel button of FileDialog is clicked
        End If
     
        'strings to replace in the paths of formulas
        ToReplace(1) = folder 'the local folder path is always to be deleted
     
        ToReplace(2) = "Outillage'!$M$10:$U$500;3;"
        ToReplace(3) = "Outillage'!$T$10:$U$500;3;"
        ToReplace(4) = "Outillage'!$M$10:$U$500;2;"
        ToReplace(5) = "Outillage'!$M$10:$U$500;3;"
        ToReplace(6) = "Outillage'!$M$2:$U$500;2;"
        ToReplace(7) = "Outillage'!$D$10:$T$90;17;"
     
        'ToReplace(2) = "C:\"
        'ToReplace(3) = "\photo" 'photo is the destination folder from where FS are taken
        'ToReplace(4) = "\\ABLGCVS0246\"                 'for edition so these two paths could be to delete
     
        'ToReplace(11) = "\\ablgcsfp0112\Commun\"
        'ToReplace(12) = "\\ABLGCSFP0112\Commun\"
     
        'they will be replaced by those ones:
        By(1) = "M:\"
     
        By(2) = "Outillage'!$M$2:$U$500;3;"
        By(3) = "Outillage'!$M$2:$U$500;3;"
        By(4) = "Outillage'!$M$2:$U$500;3;"
        By(5) = "Outillage'!$M$2:$U$500;3;"
        By(6) = "Outillage'!$M$2:$U$500;3;"
        By(7) = "Outillage'!$B$1:$I$65536;8;"
     
        'By(2) = "M:\"
        'By(3) = ""
        'By(4) = "M:\"
     
        'By(11) = "M:\"
        'By(12) = "M:\"
     
        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 10
                    If ToReplace(y) = "Exit For" Or By(y) = "Exit For" Then Exit For
                    Worksheets(x).Cells.Replace What:=ToReplace(y), Replacement:=By(y), _
                        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, MatchByte:=False, _
                        SearchFormat:=False, ReplaceFormat:=False
                Next y
     
             Next x
     
            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
     
            '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
     
            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)
     
        Application.ScreenUpdating = True
     
    End Sub

  10. #10
    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
    Des Exit FOR et des Exit SUB, c'est loin d'être le top.

    Perso, je découperais le code en fonctions distinctes histoire de m'y retrouver: une fonction qui boucle sur les classeurs d'un dossier, une fonction qui ouvre chaque classeur présent, une fonction qui boucle sur les feuilles du classeur, une fonction qui remplace.

    Dans la fonction qui remplace, j'utiliserais une plage Excel plutôt qu'un tableau codé en dur (bonjour les modifs le cas échéant), et je ne créerai qu'une plage pour les From et les BY en les mettant côte à côte.

    En pratiquant ainsi, tu te donnes la possibilité de tester chaque fonction séparément du reste du code et tu circonscris beaucoup mieux tes erreurs. Et nous pourrons beaucoup mieux t'aider à trouver le problème car il sera isolé dans une petite procédure/fonction.

    Avec le code que tu donnes, tu dois à chaque fois lancer toute ta procédure, et si nous voulons t'aider, nous devrons recréer le même environnement que toi pour y arriver...
    "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...
    ---------------

  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
    C'est la meilleure solution que j'aie trouvée. Je vais faire des tests pour voir d'où vient le problème. J'essaierai de compartimenter plus le code. Mon problème c'est que ce code a marché jusque là et qu'avant de partir vendredi il fonctionnait :/

  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
    @Marc: Ca aurait dû tilter dans ma tête aussi...

    Cela étant, nous ne sommes pas plus avancés puisque malgré ces remplacements, ça ne fonctionne pas alors qu'il semblait que ça fonctionnait avant sans les remplacements (avec les ; et les cellules fusionnées).

    En tout cas, cela me conforte dans l'idée qu'il serait de loin préférable de ramener les données dans le fichier local puis de travailler avec la table locale. De plus, en remplaçant les RECHERCHEV par des INDEX/EQUIV, on ne devrait pas modifier l'index de colonne comme on le fait ici. Je parie que sur le temps que tous ces essais, infructueux qui plus est, ont été effectués, les modifications pour importer les données et travailler en local seraient effectuées.

    Je le dis et je le redis: travailler avec des formules qui lient des classeurs entre eux, c'est aller au casse-pipe à coup sûr.
    "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
    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
    Sur quelles lignes ne fonctionne-t-il plus?
    Entre-t-il en mode debug?
    As-tu testé le mode pas à pas? Cliquer dans la procédure principale puis F8 pour exécuter ligne par ligne. Cela permet souvent de découvrir l'erreur.

    Tu dis que cela fonctionnait jusqu'à vendredi. Cela voudrait donc dire que quelque chose a changé depuis vendredi... (nouvelle machine, lettres de disque modifiées, connexion réseau problématique, ...).

    Dans un code de 200 lignes (une horreur), une erreur se glisse vite là où on ne l'attend pas, et plus la proc est longue plus il est malaisé de s'y retrouver
    "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...
    ---------------

  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
    Sur quelles lignes ne fonctionne-t-il plus?
    Il s'exécute de bout en bout sans erreur et ne plante que ce soit en exécution normale ou pas à pas.

    Tu dis que cela fonctionnait jusqu'à vendredi. Cela voudrait donc dire que quelque chose a changé depuis vendredi... (nouvelle machine, lettres de disque modifiées, connexion réseau problématique, ...).
    Rien n'a changé justement

    Le code choisit le dossier puis ouvre chaque fichier. Toutes les variables du tableau passent bien dans le replace mais sans effet...

    Sinon j'essaye de définir le tableau à partir d'une plage mais cela semble assez compliqué.

  15. #15
    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
    Au passage, je ne comprends pas bien pourquoi il faut répéter ces remplacements. Les plages sources vers lesquelles les RECHERCHEV pointent migrent toutes seules de U2:U500 vers T10:T500 qu'il faut se casser le c*** à les modifier régulièrement pour les faire repointer vers U?

    Il n'y aurait pas un (sérieux) problème de conception à la base?
    "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...
    ---------------

  16. #16
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonsoir,

    Comme j'aime bien explorer, même si ce n'est pas conventionnel (Senseï Marc qu'en penses tu ?) et que je n'ai pas l'habitude de faire du remplacer dans des formules
    (car lorsque la conception est bien pensée, nul besoin de faire des changements), je suis parti vers un autre horizon pour de l'exploration.

    Ceci dit Nagel Tha, ton code, que j'ai survolé à l'air bien compliqué pour faire ces remplacements dans des formules.
    Surtout que les noms des classeurs sont déjà connus; il suffirait de vérifier l'existence de ceux-ci dans le chemin spécifier afin de faire les modifications …
    PS : quasi 100 lignes de codes => je n'ai pas regardé dans le détails

    Pour le fun et l'exploration j'ai fait un petit test avec une variable tableau (A1 =1 pour le début, ce n'est pas l'indication des lignes de 1 à 10 mais bien des chiffres) :

    1 A K =RECHERCHEV(A1;$A$1:$B$10;2;0)
    2 B L =RECHERCHEV(A2;$A$1:$B$10;2;0)
    3 C M =RECHERCHEV(A3;$A$1:$B$10;2;0)
    4 D N =RECHERCHEV(A4;$A$1:$B$10;2;0)
    5 E O =RECHERCHEV(A5;$A$1:$B$10;2;0)
    6 F P =RECHERCHEV(A6;$A$1:$B$10;2;0)
    7 G Q =RECHERCHEV(A7;$A$1:$B$10;2;0)
    8 H R =RECHERCHEV(A8;$A$1:$B$10;2;0)
    9 I S =RECHERCHEV(A9;$A$1:$B$10;2;0)
    10 J T =RECHERCHEV(A10;$A$1:$B$10;2;0)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()Dim VA, i&, j&
    VA = Feuil1.UsedRange.FormulaLocal
    For i = LBound(VA) To UBound(VA)
        For j = LBound(VA, 2) To UBound(VA, 2)
            If InStr(VA(i, j), "=") = 1 Then
                VA(i, j) = Replace(VA(i, j), "$A$1:$B$10;2;0", "$A$1:$C$10;3;0")
            End If
        Next
    Next
    Feuil1.UsedRange.FormulaLocal = VA
    End Sub
    PS : J'ai tenté avec un For Each … mais je n'ai pas réussi
    Tout ce qui est texte ou chiffre le reste, les formules se modifient bien

    Une façon possible pour du remplacer (c'est juste à titre d'exemple (bâclé) pour montrer le principe - je ne dis pas que c'est la meilleure soution) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test2()Dim Formule$, Trouve, Remplace, T, i As Byte ' , k as Byte
        Formule = "PourModifierMaFormule!Outillage'!$D$10:$T$90;17;"
        Trouve = Array("folder", "Outillage'!$M$10:$U$500;3;", "Outillage'!$T$10:$U$500;3;", "Outillage'!$M$10:$U$500;2;", "Outillage'!$M$10:$U$500;3;", "Outillage'!$M$2:$U$500;2;", "Outillage'!$D$10:$T$90;17;")
        Remplace = Array("M:\", "Outillage'!$M$2:$U$500;3;", "Outillage'!$M$2:$U$500;3;", "Outillage'!$M$2:$U$500;3;", "Outillage'!$M$2:$U$500;3;", "Outillage'!$M$2:$U$500;3;", "Outillage'!$B$1:$I$65536;8;")
        i = 0 ' on supprime si on utilise For k
        For Each T In Trouve ' OU =>  For k = 0 to Ubound(Trouve)
            If InStr(Formule, T) > 0 Then ' If InStr(Formule, Trouve(k)) Then
                Formule = Replace(Formule, Trouve(i), Remplace(i)) ' Formule = Replace(Formule, Trouve(k), Remplace(k))
            End If
            i = i + 1 ' on supprime si on utilise For k
        Next
        Debug.Print Formule
     End Sub
    PS : j'ai fait ma 1ère contrib, n'hésitez pas à la voir et me faire un retour ICI
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  17. #17
    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
    Arigato gozaïmasu Ryu. Je vais explorer ta proposition dans la journée

    Je vous remercie tous pour votre patience et pour vos suggestions.

    C'est vrai que mon code est assez compliqué car d'un côté j'essaye de penser à tout et de l'autre côté je ne connaissais pas VBA avant de tomber sur ce problème. De plus dans le domaine de la programmation je suis assez léger car ma spécialité est le Génie Physique et non l'informatique donc je n'ai que quelques bases (langage C, CVI et LabView ainsi que html, css et javascript en autodidacte comme le VBA). Il s'agit donc de mon plus gros code. Aussi je vous remercie encore de votre patience.

    J'espère notifier d'ici peu mon problème comme résolu. Je ne manquerai pas de vous faire part de la solution le cas échéant

  18. #18
    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
    Citation Envoyé par RyuAutodidacte Voir le message
    Comme j'aime bien explorer, même si ce n'est pas conventionnel (Senseï Marc qu'en penses tu ?) et que je n'ai pas l'habitude de faire du remplacer dans des formules
    Salut Ryu !

    Senseï est un peu trop à mon niveau, juste un explorateur aimant montrer des chemins de traverse à d'autres explorateurs !

    Quand j'ai eu besoin de remplacer au sein de formules (cas non prévu ou le concepteur n'ayant pas maitrisé son sujet)
    je l'ai toujours effectué directement au sein de la feuille de calculs sans code via Rechercher / Remplacer car c'est ponctuel;
    je n'ai jamais eu un tel cas de 300 classeurs à corriger !

    Si la célérité est recherchée alors souvent mieux vaut éviter une boucle et privilégier les fonctionnalités d'Excel, même en VBA …

  19. #19
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    S'assurer que ToReplace(y)et By(y) correspondent a la propriete Formula et non FormulaLocal. Donc pas de ; comme separateur dans la formule.

    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
    Sub MultipleSearch()
        Application.FindFormat.Clear
        Dim SearchInRange As Range
     
        For x = 1 To Worksheets.Count
     
    Set SearchInRange = destinationWorkbook.Worksheets(x).Range("A1:Z300")
     
    'Pour modifier seulement les cellules contenant une formule
    Set SearchInRange = SearchInRange.SpecialCells(xlCellTypeFormulas)
     
    Dim test1 As String
    Dim cell As Range
    For y = 1 To 8
    test1 = ""
     
    Set cell = SearchInRange.Find(ToReplace(y), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)
     
    If cell Is Nothing Then
     MsgBox y & " Non trouve avec FIND" & vbLf & ToReplace(y)
    End If
     
    SearchInRange.Replace what:=ToReplace(y), replacement:=By(y), LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
     
     
    Next y
    Next x
    End Sub

  20. #20
    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
    Si ton code fonctionnait avant, n'y change rien. Il sera toujours temps de le modifier plus tard.

    Tu dis que tes variables passent bien dans le replace... => Ca veut dire que tu as travaillé en mode débug ( F8)?

    Si oui et que tu passes bien sur chaque replace, c'est qu'il ne trouve pas la chaîne du replace...

    Je vois que tu as mis MatchCase à True... Ta feuille s'appelle bien Outillage, elle n'a pas été renommée? Tu n'as pas inséré ou supprimé des colonnes ou des lignes de sorte que $M$2 ne soit plus trouvé?
    "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...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 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