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 24/05/2011, 18h01   #1
Membre à l'essai
 
Inscription : novembre 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 95
Points : 21
Points : 21
Par défaut Champ de fusion + macro

Bonjour,

On a un document word construit à l'aide de champ de fusion.
J'ai cherché (vainement) pour trouver une manière simple d’exécuter une fonction VBA sur l'un de ces champs.
En gros on a un numéro d'abonné dans le champ de fusion (NUMERO_ABONNE) et je cherche a le modifier suivant un l'algorithme.

Auriez vous une solution pour moi ?

Merci d'avance.

Pierre
label55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h47   #2
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
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 : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Une fois la fusion terminée, les champs de fusion n'existent plus.
La solution est de lancer une macro avant. Pour cela, il faut gérer les évènements dans Word.

Un peu de lecture sur ce point
http://heureuxoli.developpez.com/off...age=page2#L2-C

Voici le prototype de fonction pour deux évènements qui peuvent t'intéresser.

Avant le début de la fusion
Code :
Private Sub app_MailMergeBeforeMerge(ByVal Doc As Document, ByVal StartRecord As Long, ByVal EndRecord As Long, Cancel As Boolean)
et
avant la fusion de chaque enregistrement
Code :
Private Sub app_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 10h24   #3
Membre à l'essai
 
Inscription : novembre 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 95
Points : 21
Points : 21
ok merci pour ta réponse.
je viens de tester mais je n'arrive pas a modifier la collection car elle est en lecture seul.
Est ce que j'ai un autre moyen que de retenir la valeur dans une variable et la remplacer ensuite dans le document.
voici mon code :

Code :
1
2
3
4
5
6
7
8
 
Private Sub appWord_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
    For i = 0 To Doc.MailMerge.DataSource.DataFields.Count
        If Doc.MailMerge.DataSource.DataFields(i).Name = "NUMERO_D_ABONNE_DE_L_ADRESSE" Then
            Doc.MailMerge.DataSource.DataFields(i).value = "totot"  \\ ne marche pas car propriete en lecture seul
        End If
    Loop
End Sub
Cordialement
Pierre
label55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 12h54   #4
Membre à l'essai
 
Inscription : novembre 2007
Messages : 95
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 95
Points : 21
Points : 21
voila le code que j'ai testé mais sans succès dans le module de classe :
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
 
Private Sub appWord_MailMergeAfterRecordMerge(ByVal Doc As Document)
    Doc.Activate
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = Numabo
        .Replacement.Text = "tutu"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
End Sub
 
Private Sub appWord_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
    For i = 0 To Doc.MailMerge.DataSource.DataFields.Count
        If Doc.MailMerge.DataSource.DataFields(i).Name = "NUMERO_D_ABONNE_DE_L_ADRESSE" Then
            Numabo = Doc.MailMerge.DataSource.DataFields(i).Value
        End If
    Next
 
End Sub
label55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2012, 09h46   #5
Membre éclairé
 
Avatar de Kihmé Xs
 
Inscription : janvier 2007
Messages : 477
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2007
Messages : 477
Points : 324
Points : 324
bonjour,

Avez vous trouvez une solution à ce problème? Je suis intéressé par savoir comment passer outre la lecture seule des propriétés.
Kihmé Xs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2012, 14h15   #6
Membre éclairé
 
Avatar de Kihmé Xs
 
Inscription : janvier 2007
Messages : 477
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2007
Messages : 477
Points : 324
Points : 324
A force de tests j'ai trouvé une solution au problème de label55, je la diffuse pour ceux qui en aurai besoin :

L'édition d'une source de donnée ou d'un de ses champs n'est pas possible.

En lieu et place de :
Code :
Doc.MailMerge.DataSource.DataFields(i).value = "totot"  \\ ne marche pas car propriete en lecture seul
Il faut stocker dans une variable de document :
Code :
ActiveDocument.Variables("NOM_VARIABLE").Value = "totot"
Ensuite, dans le document maître il faut remplacer le champ de fusion par la variable de document nouvellement crée :

Code :
{ DOCVARIABLE NOM_VARIABLE }
Une question supplémentaire :
L'utilisation de la fonction
Code :
Private Sub app_MailMergeBeforeMerge(ByVal Doc As Document, ByVal StartRecord As Long, ByVal EndRecord As Long, Cancel As Boolean)
que mentionne ce post, est elle possible dans le document maître?

Le publipostage est détectable dans le document créé ainsi que dans les éventuelles macro de fusion. Mais le document maître semble être uniquement lu et donc ne voit pas d’évènement de son côté.
Kihmé Xs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h22.


 
 
 
 
Partenaires

Hébergement Web