Chercher Remplacer dans WORD par script VBS

Résolu
Bernardo39 Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 18 octobre 2011 - 17 oct. 2011 à 10:46
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 18 oct. 2011 à 14:25
Bonjour,

Comme professionnel je travaille essentiellement sur les bases de données, je pratique JAVA et WINDEV,WINWEB (au boulot). Je suis totalement débutant en Visual Basic.
Pour le boulot, je crée des scripts vbs depuis peu (je n'ai pas eu le temps de suivre les divers tutoriels et je n'ai pas l'intention de me spécialiser), pour des choses très simples dans OUTLOOK essentiellement et aussi dans WORD. A ce sujet, je bute sur un petit script que j'ai fabriqué comme les autres à partir de bouts de codes glanés sur les forums et dont l'objectif est d'aller remplacer automatiquement des chaines de caractères dans une liste de fichiers de WORD existants (en fait un CTRL+F pré paramétré !)

Le code auquel j'ai abouti est le suivant :

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open("C:\MonFichier.doc")
Set Selection = objWord.Selection

    Dim vRecherche 'As String
    Dim vRemplace 'As String
    Const wdFindContinue = 1
    Const wdReplaceAll  = 2
    vRecherche = "XX"
    vRemplace = "YY"
    
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = vRecherche
        .Replacement.Text = vRemplace
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

Selection.Find.Execute Replace = wdReplaceAll

objDoc.close
objWord.Visible = False
Set WordApp = Nothing
Set objDoc = Nothing


A l'exécution, ça bute sur la fonction "Replace" pour un nombre d'arguments. J'ai voulu chercher dans les manuels de références, je n'ai trouvé qu'une fonction "Replace" destinée à remplacer des chaines de caractères, pas spécifiquement dans WORD d'ailleurs.

D'autre part, dans bon nombre de ces petits sripts ayant ouvert un document de WORD, même si on a refermé la session, il y a toujours un processus WINWORD qui tourne, c'est génant.

Une (ou des) bonne(s) âme(s) pourraient_elles :

[list]
Mes souffler une solution pour le code ci-dessus ?
M'orienter vers une bonne documentation de référence sur VBS ?
Me dire pourquoi le processus WINWORD survit à la fermeture de WORD ?
/list
Merci d'avance,

Bernard JURA

8 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 oct. 2011 à 14:25
as tu eu des déboires avec ce langage ?

Non, mais de très sérieuses raisons de sécurité.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 oct. 2011 à 11:24
Bonjour,
mets donc le Execute dans ton bloc With, juste avant End Woith
.Execute Replace:= wdReplaceAll

et regarde la syntaxe ( := )

Pour ce qui est du reste : Il faut quitter (par Quit ) l'azpploication Word.
objWord.Application.Quit

Avant de le détruire par = Nothing, bien entendu.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Bernardo39 Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 18 octobre 2011
17 oct. 2011 à 13:28
Merci de ta réponse si rapide !

J'ai bien mis l'instruction execute dans le With.
Par contre pour le reste, j'avais déjà essayé et sans surprise :
[list]
Si je mets := j'obtiens erreur 800A0400 "instruction attendue"
Si je mets = j'obtiens erreur 800A01C2 "nombre d'arguments ou affectation de propriété incorrects"
/list
Pour être sur qu'on se comprend bien, je joins le code modifié comme préconisé :
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open("C:\MomFichier.doc")
Set Selection = objWord.Selection

    Dim vRecherche 'As String
    Dim vRemplace 'As String
    Const wdFindContinue = 1
    Const wdReplaceAll  = 2
    vRecherche = "XX"
    vRemplace = "YY"
    
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = vRecherche
        .Replacement.Text = vRemplace
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
.Execute Replace := wdReplaceAll
    End With

objDoc.close
objWord.Application.quit
Set WordApp = Nothing
Set objDoc = Nothing

J'ai donc toujours mon problème avec cette fichue focntion "Replace".

Merci encore,

Bernard JURA
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 oct. 2011 à 14:03
Ecoute,

je viens d'essayer avec succès ceci :
With Selection.Find
        remplacer_par = "YY"
        .Text = "XX"
        .Replacement.Text = remplacer_par
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll
      End With


Depuis Word lui-même.
VBS étant banni depuis longtemps de mes machines, je ne peux tester depuis VBS

Je n'ai pas non plus le moindre problème en écrivant ainsi :
ActiveDocument.Select
    With Selection.Find
        remplacer_par = "Hello"
        .Text = "XXXX1"
        .Replacement.Text = remplacer_par
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll
      End With


Il se peut donc que ton erreur soit due depuis VBS, à cette ligne :
Set Selection = objWord.Selection

Peut-être convient-il de la remplacer depuis VBS par quelque-chose du genre :
 objDoc.select 


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bernardo39 Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 18 octobre 2011
17 oct. 2011 à 14:44
Merci encore de ta persistance à me trouver une solution !

Le problème de l'objet "sélection" m'avait déjà bien occupé. En fait la ligne que j'ai écrite "Set Selection...." est la seule manière que j'ai trouvée pour qu'il la lise sans me réclamer désespérément "un objet sélection". Je viens d'essayer avec ton "objDoc.select" mais ça ne marche pas. VBS ne reconnait même pas le .select puisqu'il ne le colore pas en bleu comme dans ton VisualBasic.
[list]
En mettant objDoc.select j'obtiens erreur 800A01A8 "objet requis "objDoc.select""
/list
Quant au fait que ça marche dans WORD, je sais bien et ça m'attriste car le jeu consiste justement à ne pas avoir à ouvrir WORD !! (autrement qu'en automatique bien sur)
Je me demande si la solution ne serait pas de créer une macro paramétrée (byval texteAvant,byval texteApres) dans WORD et de la lancer depuis le script, je ne sais pas encore comment faire ça mais ça doit se trouver ! Qu'en penses tu ?

Bernard JURA
0
Bernardo39 Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 18 octobre 2011
18 oct. 2011 à 09:00
A l'attention de "ucfoutu" :

Bonjour,

J'ai réglé mon problème en lançant la macro depuis un script VBS avec des paramètres, ça marche !
Ca ne me satisfait que partiellement car mon code ne marche que sur une session de WORD ayant accès à la macro, je vais travailler sur un code créant la macro, mais plus tard car j'ai peu de temps.
Si par hasard tu tombes sur une solution comme je la cherchais (sans passer par une macro) n'hésite pas à transmettre, je ferai de même de mon côté le cas échéant.
Merci encore et à une autre fois.

Bernard JURA
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 oct. 2011 à 11:00
Ouais...
Sans VBS (banni chez moi) dur dur ..
Je me dis toutefois que tu peux avoir un problème d'ambiguïté de nom avec la variable onjet selection.

Essaye (à tout hasard) en changeant ainsi ce mot :

Set objWord = CreateObject("Word.Application")
  objWord.Visible = True
  Set objdoc = objWord.Documents.Open("C:\MonFichier.doc")
  Set maselection = objWord.selection
  Dim vRecherche 'As String
    Dim vRemplace 'As String
    Const wdFindContinue = 1
    Const wdReplaceAll = 2
    vRecherche = "XX"
    vRemplace = "YY"
    maselection.Find.ClearFormatting
    maselection.Find.Replacement.ClearFormatting
    With maselection.Find
        .Text = vRecherche
        .Replacement.Text = vRemplace
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute Replace:=wdReplaceAll
    End With


Juste pour voir ce qui se passe, hein !
Et si ne marche toujours pas depuis VBS ===>> je ne peux qu'abdiquer
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Bernardo39 Messages postés 5 Date d'inscription lundi 17 octobre 2011 Statut Membre Dernière intervention 18 octobre 2011
18 oct. 2011 à 12:57
Bonjour ucfoutu,

J'ai lancé ton script et comme je m'y attendais, il me sort une erreur 800A0400 "instruction attendue" juste après le := de ton avant dernière ligne !

De toute manière j'ai bien l'impression que ce symbole d'affectation est inconnu de VBScript. Il utilise le "=" ,si tu veux de la doc à ce sujet, j'ai cherché la mienne sur "http://www.descodev.com/docs.aspx".

Je break la dessus pour le moment, par contre une autre chose m'interesse : tu parles de "bannir" VBScript de tes machines, as tu eu des déboires avec ce langage ?

En tous cas merci encore,

Bernard JURA
0
Rejoignez-nous