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

VBA récupération de la valeur d'un signet

7 réponses
Avatar
Pierre Raguet
Bonjour,

je ne trouve pas comment accéder à la valeur d'un signet dans VBA pour le
modifier ; dans mes balbutiements j'en suis à
"ActiveDocument.Bookmarks("monsignet")", et... grand mystère !
En fait mon problème est le suivant :
- à l'ouverture d'un document je mets à jour un certain nombre de champs (champs
ASK associés à des signets) ;
- je souhaite récupérer la valeur d'un de ces champs pour en extraire une chaîne
de caractères et l'assigner à un autre champ que j'utilise à plusieurs endroits
dans ce document...

Merci d'avance (non, non... je reviendrai dire merci, promis !-)

7 réponses

Avatar
Kyrill
Bonsoir Pierre

Une question toute bête mais pourquoi dans votre document ne pas tout
simplement insérer le signet par le champs REF monsignet

Sinon en vba peut etre monsignetb=monsigneta ( dans l'esprit et non dans la
syntaxe )
Mais les adeptes des doigts dans le moteur pourrait etre plus precis

--

Bonne Journée

Kyrill (Bipède en station verticale)
"Pierre Raguet" wrote in message
news:eogb2e$bqm$
Bonjour,

je ne trouve pas comment accéder à la valeur d'un signet dans VBA pour le
modifier ; dans mes balbutiements j'en suis à
"ActiveDocument.Bookmarks("monsignet")", et... grand mystère !
En fait mon problème est le suivant :
- à l'ouverture d'un document je mets à jour un certain nombre de champs
(champs

ASK associés à des signets) ;
- je souhaite récupérer la valeur d'un de ces champs pour en extraire une
chaîne

de caractères et l'assigner à un autre champ que j'utilise à plusieurs
endroits

dans ce document...

Merci d'avance (non, non... je reviendrai dire merci, promis !-)




Avatar
Pierre Raguet
"Kyrill" a écrit dans le message de news:

Bonsoir Pierre

Une question toute bête mais pourquoi dans votre document ne pas tout
simplement insérer le signet par le champs REF monsignet

Bonsoir,


Parce que je veux modifier ce qui a été saisi ; plus exactement j'ai un champ
qui dépend de la valeur d'un autre champ saisi à l'ouverture du document.

Sinon en vba peut etre monsignetb=monsigneta ( dans l'esprit et non dans la
syntaxe )


c'est la syntaxe qui me fait défaut, pas l'esprit (enfin, je crois !).

Mais les adeptes des doigts dans le moteur pourrait etre plus precis

--

Bonne Journée

Kyrill (Bipède en station verticale)
"Pierre Raguet" wrote in message
news:eogb2e$bqm$
Bonjour,

je ne trouve pas comment accéder à la valeur d'un signet dans VBA pour le
modifier ; dans mes balbutiements j'en suis à
"ActiveDocument.Bookmarks("monsignet")", et... grand mystère !
En fait mon problème est le suivant :
- à l'ouverture d'un document je mets à jour un certain nombre de champs
(champs

ASK associés à des signets) ;
- je souhaite récupérer la valeur d'un de ces champs pour en extraire une
chaîne

de caractères et l'assigner à un autre champ que j'utilise à plusieurs
endroits

dans ce document...

Merci d'avance (non, non... je reviendrai dire merci, promis !-)








Avatar
Anacoluthe
Bonjour !

'Pierre Raguet' nous a écrit ...
Parce que je veux modifier ce qui a été saisi ; plus exactement j'ai un champ
qui dépend de la valeur d'un autre champ saisi à l'ouverture du document.


Les signets (bookmarks) de Word sont de nature double :
- Un signet est d'abord un /emplacement/ dans un document
cet emplacement peut être vide ou englober une zone continue (Range)
du document. Les signets peuvent être repérés dans le document
sous forme de crochets [ ] gris (Outils/Options/Affichage/Signets)
- Un signet peut aussi être une /variable/ interne contenant du texte
exemple { SET Toto "Ceci est le texte du signet toto" }
référencé par { REF Toto }
Si vous 'affichez' les signets, vous voyez un signet vide ][
à l'emplacement du champ SET

Cette double nature 'historique' des signets Word n'est certainement
pas une bonne chose. Elle amène souvent confusions et erreurs.

En vba pour modifier le contenu d'un signet on utilise la syntaxe :
ActiveDocument.Bookmarks("toto").Range.Text = "Nouvelle valeur pour Toto"
mais ceci écrase le Range du signet et supprime le signet, d'où toute
une gymnastique pour le conserver :

Public Sub RemplirSignet(S As String, T As String)
' Remplit le signet S avec le texte T sans détruire S
On Error GoTo rien
Dim Place As Long
Place = ActiveDocument.Bookmarks(S).Range.Start
ActiveDocument.Bookmarks(S).Range.Text = T
ActiveDocument.Bookmarks.Add Name:=S, _
Range:¬tiveDocument.Range(Place, Place + Len(T))
rien:
End Sub

Il faudra ensuite mettre à jour les références (champs REF) au
signet modifié. Notez que vous aurez perdu vos champs ASK
placés initialement dans ces signets.

Anacoluthe
« Lire, c'est déchiffrer l'ambiguïté. »
- Jean-Michel WYL

Avatar
Pierre Raguet
Merci beaucoup, j'y suis presque !

"Anacoluthe" a écrit dans le message de news:
%
[...]
mais ceci écrase le Range du signet et supprime le signet, d'où toute
une gymnastique pour le conserver :


Ce qui m'inquiète c'est que j'ai le sentiment que j'aurais eu du mal à trouver
ça tout seul...

Il faudra ensuite mettre à jour les références (champs REF)


Ce qui m'inquiète encore plus, c'est que même comment faire ça automatiquement
je ne l'ai pas trouvé !
J'ai ajouté l'appel à votre code dans UpdateFields, ce qui me fait bien ce que
je souhaite (à l'ouverture du document on rempli un certain nombre de champs, il
y a un traitement en fonction des valeurs de certains de ces champs et placement
du résultat dans le signet modifié), mais ensuite les références à ce signet ne
sont pas mises à jour ; en faisant F9 ça remet à jour, mais j'aimerais éviter !

Merci pour le petit coup de pouce qui me manque (et comme c'est juste pour un
besoin ponctuel, je ne saurai jamais si c'est l'aide en ligne ou mon cerveau qui
est en cause... tant mieux...).

Avatar
Circé
Bonjour Pierre,

Regarde l'exemple de la userform de la faq fait par anacoluthe, il y a
justement ce cas de signets à mettre à jour :

http://faqword.free.fr/anacoluthe1/didacticiel_userform.pdf

Circé
http://faqword.free.fr


Pierre Raguet a présenté l'énoncé suivant :
Merci beaucoup, j'y suis presque !

"Anacoluthe" a écrit dans le message de news:
%
[...]
mais ceci écrase le Range du signet et supprime le signet, d'où toute
une gymnastique pour le conserver :


Ce qui m'inquiète c'est que j'ai le sentiment que j'aurais eu du mal à
trouver ça tout seul...

Il faudra ensuite mettre à jour les références (champs REF)


Ce qui m'inquiète encore plus, c'est que même comment faire ça
automatiquement je ne l'ai pas trouvé !
J'ai ajouté l'appel à votre code dans UpdateFields, ce qui me fait bien ce
que je souhaite (à l'ouverture du document on rempli un certain nombre de
champs, il y a un traitement en fonction des valeurs de certains de ces
champs et placement du résultat dans le signet modifié), mais ensuite les
références à ce signet ne sont pas mises à jour ; en faisant F9 ça remet à
jour, mais j'aimerais éviter !

Merci pour le petit coup de pouce qui me manque (et comme c'est juste pour un
besoin ponctuel, je ne saurai jamais si c'est l'aide en ligne ou mon cerveau
qui est en cause... tant mieux...).



Avatar
Pierre Raguet
Merci, ça m'a résolu mon problème.
J'ai fait un truc pas très propre, mais qui a l'avantage de marcher.
Si j'ajoute un ActiveDocument.Fields.Update comme dans l'exemple, ça boucle un
peu vu que je l'appellerais de UpdatFields !-)
Alors, plutôt que de refaire tout avec une UserForme (ce qui aurait été
mieux...) j'ai ajouté un test sur les "Fields", pour ne mettre à jour que ceux
de type wdFieldRef (parce que je ne sais pas repérer les champs qui font
référence à "monsignet" !).

Donc ça marche, je ne touche plus à rien !!

Merci à vous deux.

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

Bonjour Pierre,

Regarde l'exemple de la userform de la faq fait par anacoluthe, il y a
justement ce cas de signets à mettre à jour :

http://faqword.free.fr/anacoluthe1/didacticiel_userform.pdf

Circé
http://faqword.free.fr


Pierre Raguet a présenté l'énoncé suivant :
Merci beaucoup, j'y suis presque !

"Anacoluthe" a écrit dans le message de news:
%
[...]
mais ceci écrase le Range du signet et supprime le signet, d'où toute
une gymnastique pour le conserver :


Ce qui m'inquiète c'est que j'ai le sentiment que j'aurais eu du mal à
trouver ça tout seul...

Il faudra ensuite mettre à jour les références (champs REF)


Ce qui m'inquiète encore plus, c'est que même comment faire ça
automatiquement je ne l'ai pas trouvé !
J'ai ajouté l'appel à votre code dans UpdateFields, ce qui me fait bien ce
que je souhaite (à l'ouverture du document on rempli un certain nombre de
champs, il y a un traitement en fonction des valeurs de certains de ces
champs et placement du résultat dans le signet modifié), mais ensuite les
références à ce signet ne sont pas mises à jour ; en faisant F9 ça remet à
jour, mais j'aimerais éviter !

Merci pour le petit coup de pouce qui me manque (et comme c'est juste pour un
besoin ponctuel, je ne saurai jamais si c'est l'aide en ligne ou mon cerveau
qui est en cause... tant mieux...).







Avatar
bahamu
BOnjour,

Il faut faire : Activedocument.bookmarks("MonSignet").Range.Text

On 15 jan, 17:45, "Pierre Raguet" wrote:
Bonjour,

je ne trouve pas comment accéder à la valeur d'un signet dans VBA pou r le
modifier ; dans mes balbutiements j'en suis à
"ActiveDocument.Bookmarks("monsignet")", et... grand mystère !
En fait mon problème est le suivant :
- à l'ouverture d'un document je mets à jour un certain nombre de cha mps (champs
ASK associés à des signets) ;
- je souhaite récupérer la valeur d'un de ces champs pour en extraire une chaîne
de caractères et l'assigner à un autre champ que j'utilise à plusie urs endroits
dans ce document...

Merci d'avance (non, non... je reviendrai dire merci, promis !-)