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

recenser les champs de fusion utilisés dans un courrier

18 réponses
Avatar
daniel
Bonsoir,
Je dois faire une liste sur plus de 250 courriers et répertorier pour chaque
courrier, les champs de fusion utilisés, les conditions utilisées, ainsi que
tous les signets et les tableaux insérés (voir plus....).
Est-il possible de le faire par VBA, et comment ?
Merci de vos prochaines réponses.
Daniel H

10 réponses

1 2
Avatar
Geo
Bonjour Daniel
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ]
Bonsoir,
Je dois faire une liste sur plus de 250 courriers et répertorier pour chaque courrier,
les champs de fusion utilisés, les conditions utilisées, ainsi que tous les signets et
les tableaux insérés (voir plus....).
Est-il possible de le faire par VBA, et comment ?



Oui, on peut, mais c'est un véritable développement que vous
demandez-là et qui demande un certain nombre de précisions comme la
manière dont vous voulez présenter les résultats.

Il me semble que vous devriez chercher un programmeur pour vous faire
ça surtout si vous n'avez pas de notions de vba.

--
A+
Avatar
Circé
Bonsoir,

Je rejoins entièrement l'avis de Geo.
Mais il y a une chose que je ne comprends pas. Les courriers
proviennent de publipostage ?? Dans ce cas, il n'y a plus de champ ni
de condition... Ou alors je n'ai pas tout compris ! Et ça c'est très
posssilbe ! ;)

Circé
http://faqword.com

daniel vient de nous annoncer :
Bonsoir,
Je dois faire une liste sur plus de 250 courriers et répertorier pour chaque
courrier, les champs de fusion utilisés, les conditions utilisées, ainsi que
tous les signets et les tableaux insérés (voir plus....).
Est-il possible de le faire par VBA, et comment ?
Merci de vos prochaines réponses.
Daniel H


Avatar
daniel
Bonsoir,
Merci pour votre réponse, mais je ne comprend pas votre réponse...
J'ai quelques notions de VBA, et arrive à les utiliser, plus ou moins, avec
EXCEL.
Il est vrai qu'avec EXCEL, j'arrive à me repérer grâce aux cellules, ce qui
n'est pas le cas dans WORD.
Mais je pense que comme avec EXCEL, dans WORD, des champs à particularité
sont détectables.
Enfin, si vous pensez qu'il n'y a pas d'autes moyens d'arriver à ce que je
souhaite sans faire appel à un programmeur, je m'aperçois que le forum
d'EXCEL fait plus confiance aux posteurs.
Je me permet donc de reprendre une citation dont je ne me rappelle plus
l'auteur, mais auquel je marque mon respect pour sa vérité : "Détenir le
savoir n'a pas plus beau plaisir que de savoir le partager".
Cordialement.
Bonne soirée
Daniel H

"Geo" a écrit dans le message de news:

Bonjour Daniel
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ] Bonsoir,
Je dois faire une liste sur plus de 250 courriers et répertorier pour
chaque courrier, les champs de fusion utilisés, les conditions utilisées,
ainsi que tous les signets et les tableaux insérés (voir plus....).
Est-il possible de le faire par VBA, et comment ?



Oui, on peut, mais c'est un véritable développement que vous demandez-là
et qui demande un certain nombre de précisions comme la manière dont vous
voulez présenter les résultats.

Il me semble que vous devriez chercher un programmeur pour vous faire ça
surtout si vous n'avez pas de notions de vba.

--
A+




Avatar
Geo
Bonsoir

Mais il y a une chose que je ne comprends pas. Les courriers proviennent de
publipostage ?? Dans ce cas, il n'y a plus de champ ni de condition... Ou alors je n'ai
pas tout compris ! Et ça c'est très posssilbe ! ;)



J'ai l'impression qu'il s'agit de recenser toutes les données qui sont
utilisées dans des documents de base réalisés pour des publipostages.
Et vu qu'il y en a 200, ça va vite devenir l'usine à gaz.
Imaginons que le résultat soit : la donnée <<Nom>> est utilisée en
ligne 23 du document "Lettre aux notaires" et aussi à la ligne 26 du
document "lettre aux huissiers" et aux lignes 12, 15 et 18 dans le
document "lettre aux avocats" ...

On peut toujours dire que pour balayer les champs d'un document on peut
utiliser un
for each f in activeDocument.fields,
les tables :
for each t in ActiveDocument.Tables .
Une fois qu'on a trouvé une table, qu'est-ce qu'on en fait ?
Pour balayer les 200 documents il y a la batchmacro d'anacoluthe sur la
faq.

--
A+
Avatar
daniel
Bonsoir,
Je reviens sur mon message pour vous dire où j'en suis.... pas loin :-((
Voici le code "amélioré" depuis l'origine de ce message :

Sub ListeDesChamps()
'Activation du courrier ouvert
Windows(1).Activate
'On revient au début du document
Selection.HomeKey Unit:=wdStory
'Atteindre le signet qui suit
Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:=""
Selection.Find.ClearFormatting
'Compteur jusqu'à 100, je ne sais pas déceler que c'est le dernier signet
Compte = 1
Do While Compte < 100
'Sélection du signet et copie de celui-ci
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.Copy
'Activation du fichier pour recenser tous les champs
Documents("Listage_champs_courrier.doc").Activate
'On colle le champs et on ajoute une fin de paragraphe
Selection.Paste
Selection.TypeParagraph
'On revient sur le courrier
Windows(1).Activate
Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:=""
Selection.Find.ClearFormatting
'On met à jour le compteur
Compte = Compte + 1
'Boucle
Loop
Documents("Listage_champs_courrier.doc").Activate
Selection.TypeParagraph
Selection.TypeParagraph
Selection.TypeParagraph
Selection.TypeParagraph
Selection.InsertBreak Type:=wdPageBreak
Windows(1).Activate
End Sub

Donc, ce que je recherche est de répertorier tous les champs de fusion,
tableaux, ainsi que les conditions ou calculs créés dans mes courriers.
Je le fais champs par champs, et les inscrit dans un document
("Listage_champs_courrier.doc"), avec le nom du fichier en début de liste
(j'ai réussi à modifier la macro pour arriver à ça, mais je ne l'ai pas avec
moi...).
Le principe des for each "f" ou "t" ( je suppose qu'il faut indiquer à quel
type de données cela correspond ??, ce que je ne sais pas faire....) doit
sûrement permettre de les répertorier dans un tableau (array, pour excel,
mais là aussi je découvre) et ensuite de les recopier dans mon document
("Listage_champs_courrier.doc") et éviter d'avoir le dernier champs repris n
fois du fait de la boucle comme c'est le cas avec mon bricolage.
Merci de vos prochaines réponses.
Danielh


"Geo" a écrit dans le message de news:

Bonsoir

Mais il y a une chose que je ne comprends pas. Les courriers proviennent
de publipostage ?? Dans ce cas, il n'y a plus de champ ni de condition...
Ou alors je n'ai pas tout compris ! Et ça c'est très posssilbe ! ;)



J'ai l'impression qu'il s'agit de recenser toutes les données qui sont
utilisées dans des documents de base réalisés pour des publipostages.
Et vu qu'il y en a 200, ça va vite devenir l'usine à gaz.
Imaginons que le résultat soit : la donnée <<Nom>> est utilisée en ligne
23 du document "Lettre aux notaires" et aussi à la ligne 26 du document
"lettre aux huissiers" et aux lignes 12, 15 et 18 dans le document "lettre
aux avocats" ...

On peut toujours dire que pour balayer les champs d'un document on peut
utiliser un
for each f in activeDocument.fields,
les tables :
for each t in ActiveDocument.Tables .
Une fois qu'on a trouvé une table, qu'est-ce qu'on en fait ?
Pour balayer les 200 documents il y a la batchmacro d'anacoluthe sur la
faq.

--
A+




Avatar
Geo
Bonjour

Sub ListeDesChamps()



Mettez les nom des documents dans des variables ils seront bien plus
facile à manipuler.

Dim DocCourant as document
Dim DocRes as Document
set DocCourant = Activedocument
Set DocRes = Documents("Listage_champs_courrier.doc")

'Activation du courrier ouvert


Inutile si vous évitez utilisez les sélections
Windows(1).Activate



'On revient au début du document
Selection.HomeKey Unit:=wdStory
'Atteindre le signet qui suit



Ce n'est pas le signet mais le champ qui suit

Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:=""
Selection.Find.ClearFormatting
'Compteur jusqu'à 100, je ne sais pas déceler que c'est le dernier signet
Compte = 1
Do While Compte < 100
'Sélection du signet et copie de celui-ci
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend



Tout ce qui précède peut être remplacé par

Dim MonChamp as field
For each MonChamp in Doccourant.fields
il manque ici la vérification du code de champ pour savoir si c'est un
champ de fusion ou autre chose
Selection.Copy


MonChamp.Range.Copy

'Activation du fichier pour recenser tous les champs
Documents("Listage_champs_courrier.doc").Activate
'On colle le champs et on ajoute une fin de paragraphe




Selection.Paste


DocRes.Bookmarks("EndOfDoc").Range.Paste
Selection.TypeParagraph


DocRes.Bookmarks("EndOfDoc").Range.insertafter vbcr

'On revient sur le courrier
Windows(1).Activate
Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:=""
Selection.Find.ClearFormatting
'On met à jour le compteur
Compte = Compte + 1
'Boucle
Loop



Next MonChamp



Donc, ce que je recherche est de répertorier tous les champs de fusion, tableaux, ainsi
que les conditions ou calculs créés dans mes courriers.
Je le fais champs par champs, et les inscrit dans un document
("Listage_champs_courrier.doc"), avec le nom du fichier en début de liste (j'ai réussi
à modifier la macro pour arriver à ça, mais je ne l'ai pas avec moi...).
Le principe des for each "f" ou "t" ( je suppose qu'il faut indiquer à quel type de
données cela correspond ??, ce que je ne sais pas faire....)



Quand on ne sait pas, on met Object, et on regarde le type que met le
code en cours d'exécution et on recopie pour la fois d'après.
doit sûrement permettre de
les répertorier dans un tableau (array, pour excel, mais là aussi je découvre) et
ensuite de les recopier dans mon document ("Listage_champs_courrier.doc") et éviter
d'avoir le dernier champs repris n fois du fait de la boucle comme c'est le cas avec
mon bricolage.



Si c'est dans Word, un tableau s'appelle Table, dans Excel utilise
directement les cellules.

Pour faire un tableau dans word, vous pouvez juste mettre des
tabulations (vbtab) et des fins de paragraphes (vbcr), puis vous
convertissez le tout en tableau par macro comme vous le faites à la
main.

--
A+
Avatar
Geo
Re

Selection.Paste



Ici vous allez coller la valeur du champ, mais c'est plutôt les
paramètres du champ que vous voulez récupérer il me semble, donc au
lieu de :
MonChamp.Range.Copy
DocRes.Bookmarks("EndOfDoc").Range.Paste

Il vaut sans doute mieux utiliser qqch comme :

DocRes.Bookmarks("EndOfDoc").Range.InsertAfter MonChamp.Code.Text
par exemple.

vous pouvez ajouter
& vbcr
pour la fin de paragraphe qui suit.

--
A+
Avatar
daniel
Bonsoir,
J'ai utilisé votre code et c'est vraiment autre chose ;-)), juste 3
lignes...
Je cherche autour, mais cette notion de sélection ou non, et ce qu'elle
permet m'échappe.
Je cherche comment reprendre le nom du courrier dont les champs sont
extraits (bien les paramètres, pas de soucis) pour l'inscrire au début, ou à
la fin de la liste des champs....
Et aussi, c'est tout nouveau, de mettre une trame de fond sur les champs..
Encore merci pour les infos.
Danielh


"Geo" a écrit dans le message de news:

Re

Selection.Paste



Ici vous allez coller la valeur du champ, mais c'est plutôt les paramètres
du champ que vous voulez récupérer il me semble, donc au lieu de :
MonChamp.Range.Copy
DocRes.Bookmarks("EndOfDoc").Range.Paste

Il vaut sns doute mieux utiliser qqch comme :

DocRes.Bookmarks("EndOfDoc").Range.InsertAfter MonChamp.Code.Text
par exemple.

vous pouvez ajouter
& vbcr
pour la fin de paragraphe qui suit.

--
A+




Avatar
Geo
Bonjour
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ]



Je cherche autour, mais cette notion de sélection ou non, et ce qu'elle permet
m'échappe.



L'enregistreur de macro traduit les manipulations de l'opérateur, il
utilise donc la notion de selection puisque c'est comme ça qu'on
travaille.
En vba il faut se dire qu'on traite tout ou partie de document, c'est à
dire l'objet Range.
Un inconvénient d'utiliser des sélections dans les macros c'est que
l'affichage réagit à chaque changement de sélection et cela ralentit
d'autant.
Mais comme ils ont des propriétés similaires on peut se servir de
l'enregistreur de macros pour écrire son code.

Je cherche comment reprendre le nom du courrier dont les champs sont extraits (bien les
paramètres, pas de soucis) pour l'inscrire au début, ou à la fin de la liste des
champs....



Le nom complet du document ouvert est Mondocument.Name
ou le nom seul : activewindow.Caption

Et aussi, c'est tout nouveau, de mettre une trame de fond sur les champs..



Sur quels champs ? Sur le contenu des champs que vous avez recopié ?
Pour savoir comment mettre une trame, utilisez l'enregistreur de
macros.
Restera à délimiter le range à tramer, ça dépend de votre code.

--
A+
Avatar
daniel
Bonsoir,
Merci pour la réponse. Je vais donc reprendre le nom du courrier contenant
pour le coller dans mon document qui va recenser tous les champs, puis
utiliser votre code pour lister ceux-ci.
La trame de fond doit être formater sur les champs de chaque courrier.
Ceci, afin que lorsque les fusions seront faites, les données variables
soient surlignées, d'ailleurs est-ce possible sans select ??
J'essaie donc de faire ces manipulations sans utiliser de select, car comme
vous le précisez, le temps de réponse est très long.
Je continue à chercher, merci.
Daniel

"Geo" a écrit dans le message de news:

Bonjour
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ]



Je cherche autour, mais cette notion de sélection ou non, et ce qu'elle
permet m'échappe.



L'enregistreur de macro traduit les manipulations de l'opérateur, il
utilise donc la notion de selection puisque c'est comme ça qu'on
travaille.
En vba il faut se dire qu'on traite tout ou partie de document, c'est à
dire l'objet Range.
Un inconvénient d'utiliser des sélections dans les macros c'est que
l'affichage réagit à chaque changement de sélection et cela ralentit
d'autant.
Mais comme ils ont des propriétés similaires on peut se servir de
l'enregistreur de macros pour écrire son code.

Je cherche comment reprendre le nom du courrier dont les champs sont
extraits (bien les paramètres, pas de soucis) pour l'inscrire au début,
ou à la fin de la liste des champs....



Le nom complet du document ouvert est Mondocument.Name
ou le nom seul : activewindow.Caption

Et aussi, c'est tout nouveau, de mettre une trame de fond sur les
champs..



Sur quels champs ? Sur le contenu des champs que vous avez recopié ?
Pour savoir comment mettre une trame, utilisez l'enregistreur de macros.
Restera à délimiter le range à tramer, ça dépend de votre code.

--
A+




1 2