Création dynamique d'un document word à partir d'un formulaire [Résolu]

Signaler
Messages postés
12
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
20 novembre 2009
-
Messages postés
12
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
20 novembre 2009
-
Bonjour,

Je souhaite créer un document word de manière dynamique en me basant sur un modèle de document et sur les données d'un formulaire.

Ce modèle contient des signets et la valeur de ces signets doit être affichée à plusieurs endroits différents.

Pour cela j'ai créé des signets et des renvoi vers ces signets aux endroits ou je souhaite les afficher. Ensuite je récupère le texte par programmation pour l'insérer dans un autre document. le problème c'est que le texte récupéré ne contient pas les valeurs des signets (aux endroits ou j'y fait référence).

Y a t-il un moyen pour récupérer les références aux signets et forcer l'insertion du texte au niveau de ces références?

J'espère que j'ai été claire.

Merci pour votre aide

8 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Après avoir consulté l'aide de Word, j'en arrive à ça.
    Dim aField As Field
    Dim myRange As Range
    Set myRange = ActiveDocument.Range(Start:=0, End:=Selection.End)
    For Each aField In myRange.Fields
        Debug.Print aField.Code, aField.Code.Start, aField.Code.End
    Next
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Salut
lol : voilà 30 minutes que je buche sur ton problème qui semble bien épineux.
J'ai commencé à te répondre avec ce qui suit, mais je pense qu'il y a un problème de compréhension :
Ne confonds-tu pas les Signets avec les Champs ?
Après découverte de ce petit monde, pour moi, un Signet est un simple emplacement, permettant de ce déplacer rapidement de Signet en Signet.
Si maintenant tu veux insérer le contenu d'un champ à cet endroit, la réponse que j'ai commencé à faire ci-dessous pourra peut-être te répondre.
Ca m'a l'air bien obscure, tout ça ...
A+


Dans l'aide de Word, ils suggèrent d'utiliser ce format de définition :
{ SET monSignet "Bonjour Codes-Sources"}
et ce format d'insertion
{ REF monSignet }
les {} étant générés par Ctrl-F9
Bien entendu, il faut faire un rafraichissement après coup (F9)

Une fois que les signets sont définis, pour récupérer son contenu :
With Bookmarks("monSignet")
MsgBox ActiveDocument.Range(.Start, .End)
End With

Pour le modifier, en revanche, tu as raison, c'est une autre paire de manche !
J'ai tenté cette enregistrement de macro.
Il semble qu'on ne puisse pas accéder à l'objet Signet (Bookmark), mais qu'il faille redéfinir celui-ci.
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
"SET Toto ""Darla di radada"" ", PreserveFormatting:=True

Découverte :
Dans les { et }, on définit des Champs.
Pour que ce champ devienne un signet, il faut de positionner juste avant le } final et "insérer un signet" : il se matérialise par un I grisâtre.
Messages postés
12
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
20 novembre 2009

Merci d'avoir pris le temps de bucher sur mon pb ! C'est vrai qu'il est épineux et je récupère un projet déjà entamé donc difficile de changer la manière de traiter les choses vu le laps de temps court dont je bénéficie.

Tu a raison c'est des champs dont je parle. Je m'y connais pas des masse en VBA

le code de ce champs dans mon document se présente ainsi : {REF MonSignet \h \* MERGEFORMAT}

Dans le code que tu as donné pour la modification (ou du moins la redéfinition du signet), cette partie là : Text:= _
"SET Toto ""Darla di radada"" elle fait quoi exactement?

Merci
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
lol, oui, j'ai fait plusieurs essais et pas collé le bon :
Text:= "SET Toto ""Darla di radada"" "
Dans cette ligne :
Toto = monSignet (ou plutôt le nom de mon champ)
"Darla di radada" qui est le texte qu'il représente.
Tu noteras que ce texte est à mettre entre " à l'intérieur de la zone.
Lorsque tu retrouves ce texte dans une chaine représentant ce texte, tu trouves des doubles " qui signifient qu'il faut insérer un seul " à l'intérieur de la chaine (elle même délimitée par des ")
Exemple :
"Toto ""Codes-Source"""
donnera :
Toto "Codes-Source"

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Donc, si toi tu veux insérer un texte issu d'une variable :
Text:= "SET Toto """ & maVariableString & """"

A noter : Si cette variable représente une valeur numérique, pas la peine de mettres des " :
Text:= "SET Toto 18.12"
donc
Text:= "SET Toto " & CStr(maVariableNumérique)
Messages postés
12
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
20 novembre 2009

Ok j'ai compris.

Question : comment dans mon code je peux récupérer l'endroit ou je veux mettre le texte du champ?

Je m'explique mon signet se trouve à un certain endroit. A un autre endroit du document, j'ai un champ qui affiche aussi la valeur de ce signet (dont le code est {REF MonSignet \h \* MERGEFORMAT} )

Je souhaite récupérer non pas l'endroit ou ce trouve le signet mais l'endroit ou on fait référence à ce signet. Est-ce possible?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
PS : La fenêtre de debug (dans laquelle s'affiche le résultat) s'ouvre avec Ctrl-G
Messages postés
12
Date d'inscription
jeudi 12 novembre 2009
Statut
Membre
Dernière intervention
20 novembre 2009

Merci beaucoup!!!!

ton code m'a beaucoup aidée!