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 18/11/2010, 11h14   #1
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Par défaut Publipostage piloté par un ERP et VBA

Bonjour,

Je cherche à modifier un publipostage piloté par un ERP. Je souhaite que lorsque la fusion est lancée, un document pdf dont le nom est composé de la valeur de champs de fusion s'ouvre.

Je rencontre les problèmes suivants:

- j'ai essayé de placer mon code VBA dans un module auto_open du squelette en vain. La valeur des champs de fusion n'est pas renseignée à ce moment-là.

- j'ai essayé de passer par une macro complémentaire qui serait accessible sur le document final et qui permettrait, via un bouton, de lancer l'ouverture du document. Dans ce cas, il n'y a plus de lien avec les champs de données
Code :
ActiveDocument.MailMerge.State = 0
Quelle pourrait-être la solution ?

Merci d'avance.
Julien.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 19h19   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 292
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 292
Points : 29 023
Points : 29 023
Salut,

Et après publipostage, les champs n'existent plus.
de plus, si c'est un ERP qui génère le publipostage, il y a peu de chance que tu puisses intervenir.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 21h13   #3
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
Bonjour,

Tu as un espoir si lors de la fusion, le document principal doit rester ouvert.
Il te suffit alors de gérer l'évènement
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
Dim with Events wdapp as Word.Application
 
Sub Document_Open()
Set wdapp = Application
End sub
 
Sub Document_Close()
set wdapp=Nothing
End Sub
 
Private Sub wdapp_MailMergeBeforeRecordMerge (Byval Doc as Document)
 
Génération du nom de ton fichier avec les champs + Ouverture éventuelle de ton document PDF.
End sub
Je n'ai pas eu le temps de retester cette solution mais je l'ai déjà utilisée pour un progiciel et ca marche bien.
Attention, la fusion devient très longue (puisque c'est exécuter pour chaque enregistrement).

Cordialement,
Christophe
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 09h13   #4
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Citation:
Envoyé par carden752 Voir le message
Bonjour,

Tu as un espoir si lors de la fusion, le document principal doit rester ouvert.
Il te suffit alors de gérer l'évènement
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
Dim with Events wdapp as Word.Application
 
Sub Document_Open()
Set wdapp = Application
End sub
 
Sub Document_Close()
set wdapp=Nothing
End Sub
 
Private Sub wdapp_MailMergeBeforeRecordMerge (Byval Doc as Document)
 
Génération du nom de ton fichier avec les champs + Ouverture éventuelle de ton document PDF.
End sub
Je n'ai pas eu le temps de retester cette solution mais je l'ai déjà utilisée pour un progiciel et ca marche bien.
Attention, la fusion devient très longue (puisque c'est exécuter pour chaque enregistrement).

Cordialement,
Christophe
J'ai repris ce code dans mon document de départ.
La syntaxe de
Code :
1
2
 
Dim with Events wdapp as Word.Application
n'est pas correcte.
Quand dois-je appeler
Code :
wdapp_MailMergeBeforeRecordMerge
?
A la fusion, on ne passe pas dans .

Julien.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 14h01   #5
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
Bonjour,

Elle est effectivement bonne cette syntaxe mais ne doit pas être dans le normal. Elle doit être initialisé directement dans le document (lettre type).

Tout le code doit être inséré dans la partie VBA de ta lettre type. (Project Nom_lettre_type->Microsoft Word Objects -> ThisDocument).


Mais si le document lettre type n'est pas ouvert, tu ne peux pas le gérer.
Tu n'appelles pas cette méthode directement, le principe est qu'il détecte directement le début de la fusion de chaque enregistrement. Juste avant, tu as la possibilité d'insérer du code où tu as accès à la valeur des champs.



Citation:
Cependant, je ne comprends pas pourquoi ton fichier de fusion n'est pas ouvert.
Est-ce que tu as bien inséré le code à cet endroit.

Cordialement,
Christophe
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 15h41   #6
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Voici ce que j'ai placé dans ThisDocument de ma lettre type:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Dim WithEvents wdapp As Word.Application
 
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, ByVal lpOperation As String, _
  ByVal lpFile As String, ByVal lpParameters As String, _
  ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
 
Sub Document_Open()
 
    Set wdapp = Application
End Sub
 
Sub Document_Close()
 
    Set wdapp = Nothing
End Sub
 
Private Sub wdapp_MailMergeBeforeRecordMerge(ByVal Doc As Document)
 
     Dim fich As String
     Dim lib_agence As String
 
     MsgBox ("ici")
 
     MsgBox ActiveDocument.MailMerge.DataSource.DataFields("NOMAGE").Value
 
     fich = "I:\" & ActiveDocument.MailMerge.DataSource.DataFields("NOMAGE").Value & ".pdf"
     ShellExecute 0, "open", fich, "", "", 0
 
End Sub
Je ne passe pas dans le wdapp_MailMergeBeforeRecordMerge.

Julien.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 16h11   #7
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
Bonjour,

Je viens de reprendre un exemple et j'ai oublié un argument dans la méthode privée.

Code :
Private Sub wdapp_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
Ca devrait être mieux.
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 16h20   #8
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Citation:
Envoyé par carden752 Voir le message
Bonjour,

Je viens de reprendre un exemple et j'ai oublié un argument dans la méthode privée.

Code :
Private Sub wdapp_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
Ca devrait être mieux.
Il ne passe toujours pas dans la méthode.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 17h21   #9
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
Est-ce qu'il passe dans document_Open(), je pense que non donc l'évènement ne peut pas être détecté.
Tu peux mettre un MsgBox dans Document_Open pour voir.
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 18h36   #10
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Il passe dans Document_open, j'ai mis un message.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 20h25   #11
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
J'ai trouve, je pense d'où ca vient.

Peux-tu déclarer l'évènement comme suit en public
Citation:
Dim WithEvents wdapp As Word.Application
devient
Code :
Public WithEvents wdapp As Word.Application
Tiens moi au courant mais là ça devrait passer normalement, enfin j'espère lol.

Cordialement,
Christophe
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 22h15   #12
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 292
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 292
Points : 29 023
Points : 29 023
Salut,

Je pense qu'il faut quelques excplications supplémentaires.

La gestion des évènements dans Word nécessite l'utilisation d'un module de classe pour cette gestion.

Par exempl : Document_Open est un évènement Document et ne nécessite rien.

Pour les évènements application un début de piste : http://heureuxoli.developpez.com/off...age=page2#L2-C
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 22h38   #13
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
Bonjour Heureux-Oli,

Pourquoi est-ce que l'évènement est quand même géré s'il est placé dans ThisDocument directement sans la création d'un module de classe.

Quelle est donc l'utilité de créer un module de classe?
Est-ce uniquement pour pouvoir réutiliser l'évènement pour les document ayant un même modèle de document?

Merci de me le confirmer.
Cordialement,
Christophe
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 23h07   #14
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 292
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 292
Points : 29 023
Points : 29 023
Salut,

tu as raison, il n'est pas nécessaire d'utiliser un module de classe, j'ai sur ce point suivi les indications de MS qui préconise l'utilisation d'un module de classe contenant les évènements.

Le seul avantage que j'y trouve, c'est qu'on peut le mettre dans le normal.dot ou un autre modèle et la gestion des évènements est centralisée.

Maintenant, la différence entre Dim et Public, Public autorise l'utilisation partout alors que Dim ne le permet que dans le projet en cours et Private dans le module.

Maintenant, MS préconise l'utilisation de Public alors que ça fonctionne aussi boen avec Dim dans ce cas.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 23h46   #15
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
Merci de ces précisions Heureux-Oli.
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 11h36   #16
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Voici le code que j'ai placé dans ThisDocument

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Public WithEvents wdapp As Word.Application
 
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, ByVal lpOperation As String, _
  ByVal lpFile As String, ByVal lpParameters As String, _
  ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
 
Sub Document_Open()
    MsgBox ("ouverture")
    Set wdapp = Application
End Sub
 
Sub Document_Close()
 
    Set wdapp = Nothing
End Sub
 
Private Sub wdapp_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
 
     Dim fich As String
     Dim lib_agence As String
 
     MsgBox ("ici")
 
    ' MsgBox ActiveDocument.MailMerge.DataSource.DataFields("CODAGE").Value
 
     ' fich = "I:\" & ActiveDocument.MailMerge.DataSource.DataFields("CODAGE").Value & ".pdf"
     'fich = "I:\X.pdf"
     ' ShellExecute 0, "open", fich, "", "", 0
 
End Sub
Je n'ai que le message "Ouverture" à l'ouverture du document.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 21h25   #17
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 971
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 971
Points : 1 575
Points : 1 575
Envoyer un message via MSN à carden752
bonjour,

peux-tu enlever la partie document_close

il ne faudrait pas qu'il mette à rien l'objet application wdapp.
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 09h27   #18
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
J'ai enlevé le Document_close mais cela ne change rien.

Je vais donc faire autrement. Lors de la fusion, les données sont transférées dans un fichier et les champs de fusion sont séparés par des ";". Je vais coder sur le autoOpen la récupération des valeurs des champs de fusion et l'ouverture des fichiers. Par contre, si on doit ajouter des champs de fusion dans le document, je devrai modifier la récupération des valeurs des champs de fusion. Cela aurait été plus propre avec la méthode MS.

Merci beaucoup pour votre aide.

Bonne journée.
Julien.
juju05 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 07h55.


 
 
 
 
Partenaires

Hébergement Web