Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/11/2007, 23h31   #1
Membre du Club
 
Inscription : avril 2004
Messages : 44
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 44
Points : 43
Points : 43
Par défaut Automation : appel de procédure paramétrée

Automation - Word 2003 SP2 - Document Maître et Sous-documents
Précisons que je ne connais pas du tout VBA et le fonctionnement avancé de Word.

Bonjour,

je pilote des documents Word par automation (en l'occurrence appli sous Windev) mais j'ai quelques soucis : je génère dans un répertoire une série de documents Word dont l'un va devenir document maître et les autres des sous-documents. Si j'automatise tout le processus en Automation, et en ayant essayé plein de combinaisons différentes, les sous-documents se retrouvent toujours au début du doc maître et pas en fin.

J'ai alors opté pour une autre solution : écrire le maximum de manipulations en code VBA dans le fichier qui sert de "modèle" au doc maitre et appeler une procédure du module VBA dans le document depuis Automation, sauf que lorsque je crée un nouveau document (par fusion/publipostage), il ne contient pas le module VBA (il n'a pas été 'copié' lors de la fusion/publipostage).

En cherchant, j'ai trouvé que que je pouvais intégrer ce module dans le nouveau document grace à
Code :
ActiveDocument.VBProject.VBComponents.Import(<chemin du .bas>)
sauf que je reçois une exception de sécurité, je n'ai pas le "programmability access right", le droit d'importer un module depuis une appli tierce partie. En revanche (et là j'avoue que je suis surpris parce que ça me parait con d'interdire l'un et d'autoriser l'autre) je peux créer à la volée un module et y copier les lignes de code qui m'intéresse, puis l'exécuter :
Code :
1
2
3
oModule = ActiveDocument.VBProject.VBComponents.Add(vbext_ct_StdModule)
oModule.addFromString(<ma chaine de code VBA>
Application.Run(<chemin logique de la proc>)
Jusque là, c'est cool. Mais bien sûr la procédure que j'appelle est paramétrée (elle doit recevoir entre autre la liste des sous-documents à insérer). Problème : les procédures sans paramètres sont visibles et appelables pas mais celles qui en ont (est-ce normal?). Pour passer outre, je créer à la volée une procédure spécifique pour ce document maître dans laquelle sont déclarées et initialisées les variables qui auraient du servir de paramètres et qui appelle la procédure "réelle".

Bon, ça marche. Mais c'est tout de même pas pratique pour plein de raisons ; je vois déjà tous les problèmes de sécurité, d'environnement, de versionning.

Ceci constitue ma première question : existe-t-il un moyen de simplifier tout ça?

Ensuite, la question bonus. L'injection du code VBA dans le document, l'appel de la procédure dummy et l'insertion des sous-documents par VBA fonctionnent donc, mais ... j'ai un problème de pagination : la numérotation des pages repart à 1 à chaque sous-document, et ce bien que tous les documents "modèles" aient été paramétrés en "à la suite de la section précédente". Il semblerait que ce soit un comportement par défaut lorsqu'on ajoute un sous-document à un document maître. Le code suivant ne semble pas marcher :
Code :
1
2
3
4
' on met à jour la pagination
For iCpt = 1 To ActiveDocument.Sections.Count
    ActiveDocument.Sections(iCpt).Footers(wdHeaderFooterPrimary).LinkToPrevious = True
Next
Comment parcourir chaque pied de page pour remettre "à la suite de la section précédente" ?

En vous remerciant par avance.
Laestic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2007, 17h37   #2
Membre du Club
 
Inscription : avril 2004
Messages : 44
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 44
Points : 43
Points : 43
Trouvé pour la pagination, il faut affecter false à la propriété RestartNumberingAtSection :
Code :
ActiveDocument.Sections(iCpt).Footers(wdHeaderFooterPrimary).PageNumbers.RestartNumberingAtSection = False
Avis perso : l'aide de VBA n'est absolument pas pratique à manipuler.
Laestic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2007, 12h50   #3
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Ta réponse à ta question est intéressante, je garde ça en mémoire (vive)
Si tu as résolu ton problème, même tout seul, il est bien de taguer sans quoi on ne sait pas que c'est résolu (bouton en bas de cette fenêtre)
Merci
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2007, 18h46   #4
Membre du Club
 
Inscription : avril 2004
Messages : 44
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 44
Points : 43
Points : 43
Oui pardon j'ai résolu le problème, en le contournant en fait. Je suis obligé de demander aux clients de cocher "Faire confiance au Projet VB" pour que mes modules fonctionnent sans souci.
Laestic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h24.


 
 
 
 
Partenaires

Hébergement Web