Chercher Remplacer dans WORD par script VBS [Résolu]

Messages postés
5
Date d'inscription
lundi 17 octobre 2011
Dernière intervention
18 octobre 2011
- 17 oct. 2011 à 10:46 - Dernière réponse :
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 18 oct. 2011 à 14:25
3
Merci
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

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 17 oct. 2011 à 11:24
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
5
Date d'inscription
lundi 17 octobre 2011
Dernière intervention
18 octobre 2011
- 17 oct. 2011 à 13:28
0
Merci
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
Commenter la réponse de Bernardo39
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 17 oct. 2011 à 14:03
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
5
Date d'inscription
lundi 17 octobre 2011
Dernière intervention
18 octobre 2011
- 17 oct. 2011 à 14:44
0
Merci
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
Commenter la réponse de Bernardo39
Messages postés
5
Date d'inscription
lundi 17 octobre 2011
Dernière intervention
18 octobre 2011
- 18 oct. 2011 à 09:00
0
Merci
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
Commenter la réponse de Bernardo39
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 18 oct. 2011 à 11:00
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
5
Date d'inscription
lundi 17 octobre 2011
Dernière intervention
18 octobre 2011
- 18 oct. 2011 à 12:57
0
Merci
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
Commenter la réponse de Bernardo39

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.