WORD Demande correction code VBA de macro qui buggue

Résolu
Bonjour, WORD 2019 WINDOWS 10, travaillant sur des documents volumineux à analyser, je construis des macro de mots clés pour les faire ressortir en gras et rouge dans les textes. De la macro opération par opération enregistrée fastidieuse vous m’avez déjà aidé à construire un code où je groupe tous mes mots clés les uns après les autres, saisies plus faciles donc. Cette macro fonctionne jusqu'à présent.
Je viens pour mes besoins professionnels d’envergure de la reconstruire avec 268 mots clés :
lesMots = Array("abandon", "accept", "accès", etc. etc…..

Et elle coince à :
Sub Remplacer(ByVal LeTexte As String) qui se surligne en bleu



Voir mon code et copie d’écran ci contre
J’ai réessayé en mettant moins de mots : même chose, ça bug au même endroit.
Merci de me corriger ce code si possible. cordialement .

Sub ProjDjAIV()
'
' ProjDjAIV Macro
  Dim lesMots() As Variant
  Dim mot As Variant
   
  lesMots = Array("abandon", "accept", "accès", "accr", "achev", "acteur", "administra", "adopt", "AIV", "agence", "ajuste", "amélior", "analys", "analyse", "ann", "annex", "annuel", "appliq", "apprenti", "apprentissage", "approb", "approuv", "appui", "arabe", "assur", "assurance", "atelier", "attein", "audit", "augment", "béneficiaire", "besoin", "brut", "cadr", "calcul", "centr", "chiffre", "class", "classe", "collabor", "collecte", "comment", "communauté", "communi", "compéten", "conclu", "confirm", "connaissance", , "conseil", "construction", "consult", "continu", "contract", "contrainte", "contrôle", "conv", "convenu","corrige", "cour", "curricul", "cycle", "décaiss", "défi", "défini", "définition", "délais", "demand", "détail", "développ", "diffic", "diminu", "disciplin", "discipline", "discuss", "diverge", "diversification", "document", "donnée", "durée", "dys", "échantillon", "école", "éducatif", "éducation", "efficace", "efficient", "élabor", "élarg", "élève", "emplacement", "encadr", "ENS", "enseign", "environnement", "équit", "établissement", "étudiant", "éval", "exact", "exam", "exécut", "exist", "expérience", "expert", "faible", "faisab", "femme", "fiab", "fille", "final", "flux", "focus", "fondamental", "form", "formul", "formule", "français", "fréquence", "général", "genre", "géographi", "gestion", "group", "handicap", "identifiant", "ILD", "impliq", "inclu", "incri", "indépendant", "indic", "infirm", "inform", "infrastructure", "initi", "inopiné", "intégration", "inval", "justif", "lacune", "langue", "lien", "list", "livr", "local", "logistique", "loi", "maint", "maintenance", "mathématique", "matrice", "max", "mécanisme", "MENFOP", "mesur", "méthod", "mini", "mis", "mise", "mission", "modalité", "module", "moyen", "nive", "norm", "note", "nouvel", "novateur", "objectif" , "observ", "obt", "œuvre", "officie", "offre", "opportunité", "OTI", "outil", "paiement", "parité", "part", "partenaire", "partenariat", "parti", "particip", "pédagog", "person", "pertin", "phys", "pièce", "pilot", "plan", "politique", "ponctuel", "porteur", "pourcentage", "prati", "pratique", "précis", "préliminaire", "prenant", "préscolaire", "preuve", "primaire", "priorité", "priv", "profession", "programm", "proje", "promo", "protocole", "prouv", "publi", "qualité", "question", "rapport", "réalis", "recommand", "recueil", "redoubl", "référence", "réfug", "région", "registre", "renforcement", "renseign", "respect", "responsab", "résult", "rétention", "revendi", "révis", "scénario", "scol", "scolaris", "sélection", "session", "seuil", "sex", "significati", "site", "source", "statistique", "statut", "structur", "suiv", "supervis", "supplément", "surveil", "systém", "tableau", "taux", "techno", "terme", "terrain", "test", "TICE", "tranche", "universel", "variable", "ventil", "vérifi", "visite", "vulnérable ")

  
  For Each mot In lesMots
    Remplacer mot
  Next mot
End Sub

Sub Remplacer(ByVal LeTexte As String)
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Font.Color = wdColorRed
    With Selection.Find
        .Text = LeTexte
        .Replacement.Text = LeTexte
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

9 réponses

Résumé de la discussion

Problème rencontré lors de l'utilisation d'une macro Word 2019 sur Windows 10, destinée à mettre en gras et en rouge des mots-clés issus d'un tableau de 268 mots. Plusieurs réponses font remonter une collision de noms avec la procédure Remplacer et des questions d'architecture Office 32/64 bits, recommandant de renommer les sous et d'harmoniser les appels. D'autres conseils indiquent qu'un fichier volumineux peut nécessiter de réduire le tableau ou de vérifier l'environnement pour éviter des conflits de nommage, comme une duplication de l'étiquette Remplacer. Pour progresser, vérifier le nommage des sous-programmes, éviter les conflits et tester avec des jeux de mots plus petits pour isoler l'origine du dysfonctionnement.

Bobot (l’IA à votre service)
  1. Contributeur Ambassadeur
    bonjour,
    le message indique qu'il y a autre chose ayant le nom "Remplacer", et que ce n'est pas autorisé.
    renomme peut-être les deux occurrences de "Remplacer", en lignes 11 et 15.
    0
    1. Merci, je ne saisis pas trop pcq je suis très faible en VBA, là ou c'était surligné en bleu j'ai changé "Remplacer" par "Rempl" ligne 15> là la macro se lance (ce qu'elle ne faisait pas avant) mais buggue au premier "remplacer" ligne 11 (image PJ). Le pb se trouve à ce niveau vraisemblablement mais je ne sais pas quoi faire


      merci si tu trouves la solution
      0
    2. Contributeur Ambassadeur
      @FVR812j'avais suggéré de changer les deux occurrences de "Remplacer".
      0
    3. Contributeur Ambassadeur
      @FVR812dans la ligne surlignée en jaune, il faut également utiliser
      Rempl
      au lieu de
      Remplacer
      .
      0
  2. Bonjour,

    Cette macro fonctionne jusqu'à présent.
    Avec combien d'element dans le tableau?

    Pourquoi la ligne de tableau est rose?
    0
    1. Re,

      Avec votre code de depart et en laissant seulement 238 elements dans le tableau, pas de probleme. Vous avez un office 64bits je suppose, perso 32 bits.

      Si vous remplacez "Remplacer" cote procedure, faites le aussi pour l'appel de procedure
      0
      1. Vous avez surement raison, mais dites moi ce que je dois faire SVP, le VBA m'est quasi inconnu. cote procedure ? appel de procedure ? Si vous me faisiez ça sur le code ça me redrait service, tout au moins me dire ce que je dois mettre à la place de Remplacer; Merci.
        0
        1. Je rajoute : Pourtant voici ci dessous ma macro "modèle" avec des mots clés différents, mais beaucoup moins, elle comporte 2 fois "remplacer" et elle fonctionne tout à fait, je viens de la tester à l'instant. Vous ne pensez pas que c'est un pb de nombre de mots ? Si c'est le cas, dois je faire plusieurs macro avec chacune une partie des mots clé ? Existe t il alors un moyen des les enchaîner pour ne faire qu'un seul code ?
          Merci de m'aider pcq là je nage, je ne comprends pas pourquoi là ca fonctionne ici et pas avec celle qui me pose pb. Vous dites que le nb de mots n'est pas un pb ....

          Sub Textesofficiels()

          Dim lesMots() As Variant
          Dim mot As Variant

          lesMots = Array("convention", "déclaration", "pacte", "traité", "droit", "international", "charte", "conférence", "protocole", "facultatif", "manifeste", "article", "préambule", "introduction", "loi", "décret", "arrêté", "circulaire", "plate-forme", "plateforme", "sommet", "acte", "objectif", "résolution", "communication", "entrée", "vigueur", "sign", "ratif", "additif", "secrétaire", "général", "application", "exécution", "programme", "document", "orientation", "partenariat", "accomodation", "agenda", "rapport", "commission", "commissaire", "mesure", "plan", "action", "dispos", "UN", "ONU", "FAO", "UNESCO", "UNICEF", "WHO", "WORLDBANK", "BM", "OMS", "UNAID", "ONUSIDA", "BIT", "OIT", "UNWOMEN", "ONUFEMME", "PNUD", "UNDP", "HCT", "OCR", "FNUAP", "PNUE", "HI", " UE ")

          For Each mot In lesMots
          Remplacer mot
          Next mot
          End Sub

          Sub Remplacer(ByVal LeTexte As String)
          Selection.Find.ClearFormatting
          Selection.Find.Replacement.ClearFormatting
          Selection.Find.Replacement.Font.Color = wdColorRed
          With Selection.Find
          .Text = LeTexte
          .Replacement.Text = LeTexte
          .Forward = True
          .Wrap = wdFindContinue
          .Format = True
          .MatchCase = False
          .MatchWholeWord = False
          .MatchWildcards = False
          .MatchSoundsLike = False
          .MatchAllWordForms = False
          End With
          Selection.Find.Execute Replace:=wdReplaceAll
          End Sub
          0
          1. Contributeur Ambassadeur
            se pourrait-il que tu ne nous montres qu'une partie de ton code, et que tu aies plusieurs fois
            Sub Remplacer(ByVal LeTexte As String)
            dans le même module?

            moins tu connais, plus tu dois nous montrer!
            0
          2. @yg_beMerci, non pas du tout voila ci-dessous mon code complet avec mes 268 mots, de même que je montre ci dessus celui qui me sert de modèle et qui fonctionne lui (Sub Textesofficiels). Ce sont exactement les mêmes et je ne m'explique pas pourquoi Sub ProjetDj() buggue.

            Par contre oui, comme j'ai toutes mes macro dans le même module, il y a forcément d'autres Sub Remplacer(ByVal LeTexte As String) dont celui ci ci-dessus (Sub Textesofficiels)
            Ca aurait une incidence ?

            Sub ProjetDj()

            Dim lesMots() As Variant
            Dim mot As Variant

            lesMots = Array("abandon", "accept", "accès", "accr", "achev", "acteur", "administra", "adopt", "AIV", "agence", "ajuste", "amélior", "analys", "analyse", "ann", "annex", "annuel", "appliq", "apprenti", "apprentissage", "approb", "approuv", "appui", "arabe", "assur", "assurance", "atelier", "attein", "audit", "augment", "béneficiaire", "besoin", "brut", "cadr", "calcul", "centr", "chiffre", "class", "classe", "collabor", "collecte", "comment", "communauté", "communi", "compéten", "conclu", "confirm", "connaissance", , "conseil", "construction", "consult", "continu", "contract", "contrainte", "contrôle", "conv", "convenu","corrige", "cour", "curricul", "cycle", "décaiss", "défi", "défini", "définition", "délais", "demand", "détail", "développ", "diffic", "diminu", "disciplin", "discipline", "discuss", "diverge", "diversification", "document", "donnée", "durée", "dys", "échantillon", "école", "éducatif", "éducation", "efficace", "efficient", "élabor", "élarg", "élève", "emplacement", "encadr", "ENS", "enseign", "environnement", "équit", "établissement", "étudiant", "éval", "exact", "exam", "exécut", "exist", "expérience", "expert", "faible", "faisab", "femme", "fiab", "fille", "final", "flux", "focus", "fondamental", "form", "formul", "formule", "français", "fréquence", "général", "genre", "géographi", "gestion", "group", "handicap", "identifiant", "ILD", "impliq", "inclu", "incri", "indépendant", "indic", "infirm", "inform", "infrastructure", "initi", "inopiné", "intégration", "inval", "justif", "lacune", "langue", "lien", "list", "livr", "local", "logistique", "loi", "maint", "maintenance", "mathématique", "matrice", "max", "mécanisme", "MENFOP", "mesur", "méthod", "mini", "mis", "mise", "mission", "modalité", "module", "moyen", "nive", "norm", "note", "nouvel", "novateur", "objectif" , "observ", "obt", "œuvre", "officie", "offre", "opportunité", "OTI", "outil", "paiement", "parité", "part", "partenaire", "partenariat", "parti", "particip", "pédagog", "person", "pertin", "phys", "pièce", "pilot", "plan", "politique", "ponctuel", "porteur", "pourcentage", "prati", "pratique", "précis", "préliminaire", "prenant", "préscolaire", "preuve", "primaire", "priorité", "priv", "profession", "programm", "proje", "promo", "protocole", "prouv", "publi", "qualité", "question", "rapport", "réalis", "recommand", "recueil", "redoubl", "référence", "réfug", "région", "registre", "renforcement", "renseign", "respect", "responsab", "résult", "rétention", "revendi", "révis", "scénario", "scol", "scolaris", "sélection", "session", "seuil", "sex", "significati", "site", "source", "statistique", "statut", "structur", "suiv", "supervis", "supplément", "surveil", "systém", "tableau", "taux", "techno", "terme", "terrain", "test", "TICE", "tranche", "universel", "variable", "ventil", "vérifi", "visite", "vulnérable")

            For Each mot In lesMots
            Remplacer mot
            Next mot
            End Sub

            Sub Remplacer(ByVal LeTexte As String)
            Selection.Find.ClearFormatting
            Selection.Find.Replacement.ClearFormatting
            Selection.Find.Replacement.Font.Color = wdColorRed
            With Selection.Find
            .Text = LeTexte
            .Replacement.Text = LeTexte
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            End With
            Selection.Find.Execute Replace:=wdReplaceAll
            End Sub
            0
          3. @FVR812pour faire suite, j'ai collé mon code dans un nouveau module en lui donnant un autre nom, il se passe exactement la mêmee chose
            0
          4. Contributeur Ambassadeur
            @FVR812as-tu appliqué ma suggestion en #7?
            0
          5. Contributeur Ambassadeur
            @FVR812comment s'appele le module?
            je pense que le moment est venu de partager ton fichier.
            0
        2. Re,

          code post <8>, vous avez 69 elements
          perso, le max que j'ai pu mettre c'est 238 car le VBA averti que la longueur maxi de la ligne est atteinte

          Si votre Office est un 64bits, je ne sais pas si vous pourrez depasser ce nombre

          Pour verifier, faites des renvois a la ligne comme ceci avec votre variable de votre premiere demande
          0
          1. Je n'ai pas eu ce surlignage jaune ni votre message "trop de caractères", par contre chaque fois que j'allais à la ligne j'avais "erreur de compilation : capture



            0
        3. Re,
          Regardez attentivement ce qu'il y a à la fin de chaque ligne dans l'image que j'ai mise
          0
          1. Bonjour, J'ai mis un tiret du 8 à la fin de chaque ligne comme vous (c'est ce que vous me demandiez de regarder attentivement ?), le résultat est le même : il n'accepte pas le mot "remplacer"
            0
          2. @FVR812Bonjour,

            Comme demande par yg_be, pouvez vous mettre votre fichier a dispo
            Ce qui me tracasse, c'est la couleur rose de votre ligne array, comme si elle n''est pas valide

            Vous n'avez toujours pas repondu sur votre version Office: 32bits ou 64bits

            Pour transmettre un fichier,
            Veillez a ce qu'il n'y ait PAS DE DONNEES CONFIDENTIELLES
            il faut passer par un site de pièce jointe tel que cjoint.com

            Allez sur ce site : https://www.cjoint.com/
            Clic sur parcourir,
            Cherche ton fichier,
            clic sur ouvrir,
            Clic sur "Créer le lien cjoint",
            Copier le lien,
            Revenir ici le coller dans une réponse...

            ou
            www.transfernow.net 'fichier jusqu'a 4G
            0
          3. @f894009Re, CJOINT / https://www.cjoint.com/c/KIsiV1aCwKw
            Je suis en Office 64 bits
            pas de confidentialité c'est un rapport officiel de la BM que j'utilise pour faire des essais sur un texte long
            Cordialement.
            0
          4. Contributeur Ambassadeur
            @FVR812le code VBA n'est pas dans ce fichier, il est probablement dans le fichier normal.dotm
            0
          5. @FVR812Solution ! .. enfin presque.
            Merci à vous deux pour toute votre aide et votre patience.
            En fait en prenant toutes vos remarques en compte, j'ai bricolé ainsi : j'ai divisé en 4 en gros mes 268 mots, (70 mots en gros), j'ai fait 4 macros Sub ProjDj1, 2, 3, et 4 (visibles dans la liste des macro) sur le modèle sub Textesofficiels dont je savais qu'il fonctionnait, j'ai collé chacun de ces 1/4 dans chaque lesMots=Array, mais chacune en insérant chaque fois un module différent (pcq sur un même module effectivement le problème "Remplacer" réapparait) et ... ça marche, les 4 macros se déroulent bien les unes après les autres. Je l'ai fait sur plusieurs word différents et sur ce fichier contrôle :

            https://www.cjoint.com/c/KIsqzt8ijTw

            C'était donc à la base un problème de nombre de mots, enfin en partie au moins.
            Il n'en reste pas moins que ce bricolage m'oblige à relancer sur un même fichier 4 macro différentes. Est ce que vous avez une idée pour n'en faire qu'une seule ? ce qui conduirait à reconsidérer le pb du "Remplacer", et puis ca ne me parait pas très catholique d'ouvrir chaque fois un module différent, mais bon vous m'avez déjà bien amené à faire un truc qui fonctionne et qui me rend service pour mon boulot de consultant.
            0
        4. Re, j'avoue que je ne comprends strictement rien : pourquoi Sub Textesofficiels() qui se trouve à la réponse5/7, que j'ai copié, supprimé, recollé dans un autre module et testé sur ce nouveau fichier :

          https://www.cjoint.com/c/KIsptrA2htw

          fonctionne parfaitement, (vous pouvez tester aussi Sub Textesofficiels() est dans la liste des macro), et pourquoi Sub ProjetDj() construite exactement sur le même modèle, dasn un module différent, je n'y ai changé que les mots dans lesMots = Array, bogue. C'est vrai que les mots apparaissent en rouge sans que je comprenne pourquoi, et où il dénote une erreur de syntaxe alors que la syntaxe me parait correcte (et avant même de parler du "Remplacer" qui lui pose problème aussi).

          c'est pourtant sur Sub ProjetDj() qu'il me faut trouver une solution.
          Continuez de m'aider SVP sachant que VBA pour moi c'est du chinois
          0
          1. Contributeur Ambassadeur
            essaie de créer des modules dans le fichier lui-même, pas dans "normal".
            0
        5. SOLUTION 2 : Bonjour, j'ai continué à fouiller le pb et réussi à mettre tous mes 268 mots dans un seul code (module séparé naturellement) : il faut répéter à chaque portion lesMots=Array(.....
          Pour l'instant je ne sais pas à combien se limite chaque portion, moi j'étais aux alentours de 70; Si quelqu'un sait ça m'intéresse. Merci à vous 2 !

          Sub ProjDj268()

          Dim lesMots() As Variant
          Dim mot As Variant

          lesMots = Array("abandon", "accept", "accès", "accr", "achev", "acteur", "administra", "adopt", "AIV", "agence", "ajuste", "amélior", "analys", "analyse", "ann", "annex", "annuel", "appliq", "apprenti", "apprentissage", "approb", "approuv", "appui", "arabe", "assur", "assurance", "atelier", "attein", "audit", "augment", "béneficiaire", "besoin", "brut", "cadr", "calcul", "centr", "chiffre", "class", "classe", "collabor", "collecte", "comment", "communauté", "communi", "compéten", "conclu", "confirm", "connaissance", "conseil", "construction", "consult", "continu", "contract", "contrainte", "contrôle", "conv", "convenu", "corrige", "cour", "curricul", "cycle", "décaiss", "défi", "défini", "définition", "délais", "demand", "détail", "développ", "diffic")
          lesMots = Array("diminu", "disciplin", "discipline", "discuss", "diverge", "diversification", "document", "donnée", "durée", "dys", "échantillon", "école", "éducatif", "éducation", "efficace", "efficient", "élabor", "élarg", "élève", "emplacement", "encadr", "ENS", "enseign", "environnement", "équit", "établissement", "étudiant", "éval", "exact", "exam", "exécut", "exist", "expérience", "expert", "faible", "faisab", "femme", "fiab", "fille", "final", "flux", "focus", "fondamental", "form", "formul", "formule", "français", "fréquence", "général", "genre", "géographi", "gestion", "group", "handicap", "identifiant", "ILD", "impliq", "inclu", "incri", "indépendant", "indic", "infirm", "inform", "infrastructure", "initi", "inopiné", "intégration", "inval")
          lesMots = Array("justif", "lacune", "langue", "lien", "list", "livr", "local", "logistique", "loi", "maint", "maintenance", "mathématique", "matrice", "max", "mécanisme", "MENFOP", "mesur", "méthod", "mini", "mis", "mise", "mission", "modalité", "module", "moyen", "nive", "norm", "note", "nouvel", "novateur", "objectif", "observ", "obt", "œuvre", "officie", "offre", "opportunité", "OTI", "outil", "paiement", "parité", "part", "partenaire", "partenariat", "parti", "particip", "pédagog", "person", "pertin", "phys", "pièce", "pilot", "plan", "politique", "ponctuel", "porteur", "pourcentage", "prati", "pratique", "précis", "préliminaire", "prenant", "préscolaire", "preuve", "primaire")
          lesMots = Array("priorité", "priv", "profession", "programm", "proje", "promo", "protocole", "prouv", "publi", "qualité", "question", "rapport", "réalis", "recommand", "recueil", "redoubl", "référence", "réfug", "région", "registre", "renforcement", "renseign", "respect", "responsab", "résult", "rétention", "revendi", "révis", "scénario", "scol", "scolaris", "sélection", "session", "seuil", "sex", "significati", "site", "source", "statistique", "statut", "structur", "suiv", "supervis", "supplément", "surveil", "systém", "tableau", "taux", "techno", "terme", "terrain", "test", "TICE", "tranche", "universel", "variable", "ventil", "vérifi", "visite", "vulnérable")

          For Each mot In lesMots
          Remplacer mot
          Next mot
          End Sub

          Sub Remplacer(ByVal LeTexte As String)
          Selection.Find.ClearFormatting
          Selection.Find.Replacement.ClearFormatting
          Selection.Find.Replacement.Font.Color = wdColorRed
          With Selection.Find
          .Text = LeTexte
          .Replacement.Text = LeTexte
          .Forward = True
          .Wrap = wdFindContinue
          .Format = True
          .MatchCase = False
          .MatchWholeWord = False
          .MatchWildcards = False
          .MatchSoundsLike = False
          .MatchAllWordForms = False
          End With
          Selection.Find.Execute Replace:=wdReplaceAll
          End Sub
          0
          1. Contributeur Ambassadeur
            j'ai m'impression que tu ne tiens aucun compte de ce que nous t'expliquons.
            0