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

Mise à jour des champs d'un formulaire

5 réponses
Avatar
JMM21
Bonjour,

J'ai "commis laborieusement" (c'est le mot) un document word contenant
plusieurs tableaux dans lesquels cohabitent des champs de formulaire (de type
"nombre" – "texte") renseignés par l'utilisateur, des champs de formulaire
(de type "calcul"), des champs de formules {IF ...}, des signets de texte
"[ref,1]~" récupérant des données externes (format-police-masqué).
Le document est donc protégé et pour mettre à jour la totalité des champs je
souhaiterais utiliser la macro suivante :
Sub autoexec()
ActiveDocument.Unprotect
ActiveDocument.Fields.Update
ActiveDocument.Protect NoReset:=True, Type:= _
wdAllowOnlyFormFields
End Sub
Seulement il y a un gros "hic" : les champs de formulaire (de type "nombre"
– "texte") renseignés par l'utilisateur sont réinitialisés à vide.
Mis à part de créer une macro sélectionnant un par un uniquement les champs
nécessitant une mise à jour, n'y aurait-il pas une autre solution ?
(En effet, cette macro fonctionne, mais elle est longue d'exécution et donne
le tournis à l'utilisateur qui voit défiler une à une les instructions)

Pendant que j'y suis, je me permets une autre question.
J'ai téléchargé sur la FAQ la superbe macro "CalculEnLigne" (merci
Anacoluthe).
Est-il envisageable d'utiliser ce code dans un champ de formulaire (type
"nombre") de telle manière que le résultat du calcul renseigné dans ce champ
(ex : 2+5-3*6/2) "prenne la place" de ce même calcul ? (me suis-je bien fait
comprendre, pas si sûr…)

Quand bien même aucune solution ne serait apportée, merci à vous tous
bénévoles éclairés.

Cordialement

5 réponses

Avatar
Geo

[...]
Seulement il y a un gros "hic" : les champs de formulaire (de type "nombre"
– "texte") renseignés par l'utilisateur sont réinitialisés à vide.
Mis à part de créer une macro sélectionnant un par un uniquement les champs
nécessitant une mise à jour, n'y aurait-il pas une autre solution ?
(En effet, cette macro fonctionne, mais elle est longue d'exécution et donne
le tournis à l'utilisateur qui voit défiler une à une les instructions)


Pour le tournis, ajoutez ceci :
Msgbox "Cliquez sur OK et allez prendre un café"
Application.ScreenUpdating = False

En plus ça accélère le traitement

On peut même faire plus fort, c'est à dire cacher Word lui-même

Pour le choix des champs à mettre à jour, comment voulez-vous que Word
le sache de lui-même ? il faut bien lui dire ceux qu'il faut traiter ou
pas.

--
A+

Avatar
JMM21
Bonjour,

D'abord merci pour votre aide.

J'avais déjà tenté ce code
Application.ScreenUpdating = False,
mais il a un effet très curieux sur l'affichage (c'est pire).
C'est peut-être lié aux codes de ma macro
ActiveDocument.FormFields(nom_signet).Select
Selection.Fields.Update
ou
ActiveDocument.Bookmarks(nom_signet).Select
Selection.Fields.Update
qui s'éxécute une cinquantaine de fois?

Je n'arrive pas non plus à mettre plusieurs
noms de signet dans le code.

Tant pis

Cordialement




[...]
Seulement il y a un gros "hic" : les champs de formulaire (de type "nombre"
– "texte") renseignés par l'utilisateur sont réinitialisés à vide.
Mis à part de créer une macro sélectionnant un par un uniquement les champs
nécessitant une mise à jour, n'y aurait-il pas une autre solution ?
(En effet, cette macro fonctionne, mais elle est longue d'exécution et donne
le tournis à l'utilisateur qui voit défiler une à une les instructions)


Pour le tournis, ajoutez ceci :
Msgbox "Cliquez sur OK et allez prendre un café"
Application.ScreenUpdating = False

En plus ça accélère le traitement

On peut même faire plus fort, c'est à dire cacher Word lui-même

Pour le choix des champs à mettre à jour, comment voulez-vous que Word
le sache de lui-même ? il faut bien lui dire ceux qu'il faut traiter ou
pas.

--
A+






Avatar
Geo

J'avais déjà tenté ce code
Application.ScreenUpdating = False,
mais il a un effet très curieux sur l'affichage (c'est pire).


Il est vrai qu'en Word il a l'air moins efficace que dans Excel, il
faut penser à remettre True à la fin et éventuellement faire un
Refresh.

C'est peut-être lié aux codes de ma macro
ActiveDocument.FormFields(nom_signet).Select
Selection.Fields.Update


Il vaut mieux éviter la sélection, ça doit limiter l'agitation sur
l'écran :

ActiveDocument.FormFields(nom_signet).Range.Fields.Update
ActiveDocument.Bookmarks(nom_signet).Range.Fields.Update

Je n'arrive pas non plus à mettre plusieurs
noms de signet dans le code.


Je ne vois pas ? Un nom de signet est une variable de type String, on
peut en avoir autant qu'on veut.
A moins que vous vouliez dire traiter plusieurs champs à la fois ?
Si plusieurs champs sont dans un paragraphe ::
ActiveDocument.Paragraphs(25).Range.Fields.Update
Vous pouvez aussi le faire pour une section entière, c'est l'avantage
de passer par Range et non sélection, c'est plus souple.
On peut même le faire du signet a au signet b, y compris les signets
placés entre, mais là si vous voulez un exemple, il faut que je teste.

--
A+

Avatar
JMM21
Merci pour toutes ces précisions.
Si j'ai un souci je sais où aller...

Cordialement



J'avais déjà tenté ce code
Application.ScreenUpdating = False,
mais il a un effet très curieux sur l'affichage (c'est pire).


Il est vrai qu'en Word il a l'air moins efficace que dans Excel, il
faut penser à remettre True à la fin et éventuellement faire un
Refresh.

C'est peut-être lié aux codes de ma macro
ActiveDocument.FormFields(nom_signet).Select
Selection.Fields.Update


Il vaut mieux éviter la sélection, ça doit limiter l'agitation sur
l'écran :

ActiveDocument.FormFields(nom_signet).Range.Fields.Update
ActiveDocument.Bookmarks(nom_signet).Range.Fields.Update

Je n'arrive pas non plus à mettre plusieurs
noms de signet dans le code.


Je ne vois pas ? Un nom de signet est une variable de type String, on
peut en avoir autant qu'on veut.
A moins que vous vouliez dire traiter plusieurs champs à la fois ?
Si plusieurs champs sont dans un paragraphe ::
ActiveDocument.Paragraphs(25).Range.Fields.Update
Vous pouvez aussi le faire pour une section entière, c'est l'avantage
de passer par Range et non sélection, c'est plus souple.
On peut même le faire du signet a au signet b, y compris les signets
placés entre, mais là si vous voulez un exemple, il faut que je teste.

--
A+






Avatar
Geo

Merci pour toutes ces précisions.
Si j'ai un souci je sais où aller...


Même sans souci, vous pouvez passer, surtout si c'est "vous" au
féminin.
La passante du champ sans souci
ça ferait joli.

--
A+