Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

word + vbs

17 réponses
Avatar
Youri Ligotmi
Bonjour

J'utilise le vbscript pour créer des utilisateurs sur un domaine windows.
Je voudrais pouvoir faire une fusion de document, c'est à dire depuis
mon script appeler word en lui passant des paramètres qui seront placés
à certaines positions d'un document maître.
Je pense qu'il va falloir que j'écrive un script vba qui traitera les
données passées par mon vbs.
Je n'y connais rien en vba, qui pourrait m'aider ou me donner quelques
adresses qui me dépanneraient?
Merci

7 réponses

1 2
Avatar
Youri Ligotmi
Bonjour !

'Youri Ligotmi' nous a écrit ...
Je précise qu'il s'agit d'un vbs et pas d'un vba


Utilisez la forme exacte de la méthode VBA avec ses parenthèses
objet.méthode(arg1,arg2,arg3)
au besoin en omettant les arguments facultatifs objet.méthode(arg1,,arg3)

N'utilisez pas les constantes non référencées dans VBS !!!
exemple argument Replace:=wdReplaceAll
Comment VBS peut-il compiler wdReplaceAll ????
wdReplaceAll est égal à 2 (facile à retrouver dans vba)
donc utilisez l'argument 2

Le moteur c'est l'application Word. VBS ne fait rien que piloter.
Vous devez écrire et tester votre programme dans Word.
Ensuite la transposition dans VBS n'est guère compliquée. Si ça vous gonfle
de faire la réécriture le plus simple est de lancer la macro vba
toute faite dans Word depuis votre script (le script ouvre un document
qui contient la macro puis fait exécuter cette macro)


Merci pour votre aide. Effectivement une macro autorun intégrée au
document simplifierait pas mal l'écriture du script sauf que je ne vois
pas comment je pourrais passer des arguments (variables de remplacement)
à word qui les passerait à la macro.
La solution me parait être de commander word à partir de mon vbs. Je
continue à fouiller ça et je reviendrai vous donner des nouvelles.
merci encore


Avatar
Anacoluthe
Bonjour !

'Youri Ligotmi' nous a écrit ...
Merci pour votre aide. Effectivement une macro autorun intégrée au
document simplifierait pas mal l'écriture du script sauf que je ne vois
pas comment je pourrais passer des arguments (variables de remplacement)
à word qui les passerait à la macro.


Une macro est effectivement par définition une procédure sans argument :
Sub maMacro()
Mais une procédure VBA peut avoir des arguments :
Sub maProc(A As String, B as String, C as Integer)
Vous pouvez exécuter en automation la procédure en passant des arguments :
monApplication.Run("maProc","Toto","Tata",3)

Anacoluthe
« La connaissance des mots conduit à la connaissance des choses. »
- PLATON

Avatar
Youri Ligotmi
Bonjour !

'Youri Ligotmi' nous a écrit ...
Merci pour votre aide. Effectivement une macro autorun intégrée au
document simplifierait pas mal l'écriture du script sauf que je ne
vois pas comment je pourrais passer des arguments (variables de
remplacement) à word qui les passerait à la macro.


Une macro est effectivement par définition une procédure sans argument :
Sub maMacro()
Mais une procédure VBA peut avoir des arguments :
Sub maProc(A As String, B as String, C as Integer)
Vous pouvez exécuter en automation la procédure en passant des arguments :
monApplication.Run("maProc","Toto","Tata",3)


Ca y est ça fonctionne (voir le bout de script plus bas), enfin ce n'est
pas parfait.
Une fois mes replacements effectués j'imprime le document et aussitôt
après je le ferme, ça me génère une erreur parceque word n'a pas eu le
temps de mettre le document en forme puis de l'envoyer au spooler.
Comment je peux résoudre ça? mettre une tempo je trouve ça moyen parce
que le temps de mise en forme et d'envoi au spoller peut être variable.
Je me demandais s'il n'y avait pas moyen de savoir que word a fini son
boulot pour l'impression, à ce moment-làseulement je le ferme.

Merci encore pour votre aide

----------Chercher-Remplcer dans word en vbs----------
Set objWord = CreateObject("Word.Application")
objWord.Visible = False

Set objDoc = objWord.Documents.Open(doc)


objDoc.select
objWord.Selection.Find.ClearFormatting
objWord.Selection.Find.Replacement.ClearFormatting
objWord.Selection.Find.Execute_
"$nom",False,False,False,False,False,True,1,False,nom,2
objWord.Selection.Find.Execute_
"$prenom",False,False,False,False,False,True,1,False,prenom,2
objWord.Selection.Find.Execute_
"$discipline",False,False,False,False,False,True,1,False,discipline,2
objWord.Selection.Find.Execute_
"$login",False,False,False,False,False,True,1,False,login,2
objWord.Selection.Find.Execute_
"$mdp",False,False,False,False,False,True,1,False,mdp,2
objDoc.PrintOut
objDoc.Saved = TRUE
objWord.Quit

Wscript.quit


Avatar
Geo

Ca y est ça fonctionne (voir le bout de script plus bas), enfin ce n'est pas parfait.
Une fois mes replacements effectués j'imprime le document et aussitôt après je le
ferme, ça me génère une erreur parceque word n'a pas eu le temps de mettre le document
en forme puis de l'envoyer au spooler.
Comment je peux résoudre ça?


Copié-collé d'une précédente réponse, avec même la citation :
----------------------------
Il y a plusieurs méthodes pour attendre une fin d'impression:
- supprimer l'impression en tâche de fond
ActiveDocument.Printout Background:úlse
ou
Options.PrintBackground = False
- si on veut garder le spooling pour pouvoir faire autre chose
on peut aussi avec Options.PrintBackground = True
faire intervenir un autre processus d'attente
comme par exemple une UserForm "Impression en cours..."
qui ne fait rien qu'attendre que la file d'attente soit vide
Set WordApp = GetObject(, "Word.Application")
Do While WordApp.BackgroundPrintingStatus > 0
DoEvents
Loop
- on peut passer par des API d'attente de processus
- on peut placer une temporisation plus ou moins fixe
etc. etc.

Anacoluthe
« Attendre est encore une occupation.
C'est ne rien attendre qui est terrible. »
- Cesare PAVESE

--
A+

Avatar
Anacoluthe
Bonjour !

'Youri Ligotmi' nous a écrit ...
Ca y est ça fonctionne (voir le bout de script plus bas)


Bravo !


ça me génère une erreur parceque word n'a pas eu le
temps de mettre le document en forme puis de l'envoyer au spooler.
Comment je peux résoudre ça?


Attendre la fin d'impression dans une macro ou un script.
(Notamment si l'impression est longue comme une impression en pdf)

Il y a de nombreuses solutions selon qu'on fait intervenir ou non
l'utilisateur (on peut lui demander de valider la fin de l'impression
par exemple) : on peut inhiber l'impression en tâche de fond par
Options.PrintBackground = False
ou avec Background:úlse dans la méthode PrintOut
ou au contraire laisser le multitâche avec Options.PrintBackground = True
et attendre dans un autre processus que l'impression soit terminée
Do While WordApp.BackgroundPrintingStatus > 0
DoEvents
Loop

Anacoluthe
« Attendre est encore une occupation.
C'est ne rien attendre qui est terrible. »
- Cesare PAVESE

Avatar
Anacoluthe
Bonjour !

'Geo' nous a écrit ...
Copié-collé d'une précédente réponse, avec même la citation :


Oupss pas vu ta réponse plus rapide :-)

A+
A~

Avatar
Geo

Bonjour !

'Geo' nous a écrit ...
Copié-collé d'une précédente réponse, avec même la citation :


Oupss pas vu ta réponse plus rapide :-)


Pas grave.
je me demande quand même si tu n'aurais pas un peu copié ?
mdr

En fait, j'y suis allé tout droit car tu es le spécialiste du sujet.

--
A+


1 2