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

Rouler une macro sur plusieurs objets

10 réponses
Avatar
Jocelyne
Bonjour à tous,

J'ai créé un formulaire avec des cases à cocher provenant d'une
macrobutton. Je dois reporter le résultat dans un autre formulaire qui
lui est fait de champs de formulaire case à cocher.

J'ai réussi à faire la macro suivante qui détermine si la case (marquée
d'un signet) est cochée ou non et elle est fonctionnelle.

Le problème c'est que j'ai environ une vingtaine de cases à analyser
dans ce formulaire.

Je me demandais si c'était possible de faire cette procédure sur
plusieurs signets sans réécrire le code pour chaque signet que je veux
analyser. Un peu comme une fonction, mais je dois vous avouer que j'ai
de la difficulté à créer cette fonction si celle-ci est possible.

Sub AnalyseCoche()
'Fonctionne pour la macro Checkit et Uncheckit
Dim strTemp As String
Dim rep As Boolean

ActiveWindow.View.ShowFieldCodes = True

ActiveDocument.Bookmarks("CTibCalVal").Select 'Sélectionne la
macrobutton marquée d'un signet

strTemp = Selection.Text
Debug.Print strTemp

strTemp = Mid(strTemp, 16, 3)
Debug.Print strTemp

ActiveWindow.View.ShowFieldCodes = False

If strTemp = "Che" Then
rep = False
Else
rep = True
End If
End Sub

Je prends toutes les suggestions que vous me proposerez.

Merci

Jocelyne

10 réponses

Avatar
Gloops
Bonjour,

Hum, si j'ai bien compris de quoi il retourne, je proposerais bien
plutôt quelque chose de ce style :

Sub ListeChk()
Dim N As Integer
Dim Fd As FormField
For N = 1 To ActiveDocument.FormFields.Count
Set Fd = ActiveDocument.FormFields(N)
If Fd.Type = wdFieldFormCheckBox Then
Debug.Print Fd.Name, Fd.CheckBox.Value
End If
Next
End Sub

_______________________________________
Jocelyne a écrit, le 14/03/2010 00:49 :
Bonjour à tous,

J'ai créé un formulaire avec des cases à cocher provenant d'une
macrobutton. Je dois reporter le résultat dans un autre formulaire qu i
lui est fait de champs de formulaire case à cocher.

J'ai réussi à faire la macro suivante qui détermine si la case (m arquée
d'un signet) est cochée ou non et elle est fonctionnelle.

Le problème c'est que j'ai environ une vingtaine de cases à analyse r
dans ce formulaire.

Je me demandais si c'était possible de faire cette procédure sur
plusieurs signets sans réécrire le code pour chaque signet que je v eux
analyser. Un peu comme une fonction, mais je dois vous avouer que j'ai
de la difficulté à créer cette fonction si celle-ci est possible.

Sub AnalyseCoche()
'Fonctionne pour la macro Checkit et Uncheckit
Dim strTemp As String
Dim rep As Boolean

ActiveWindow.View.ShowFieldCodes = True

ActiveDocument.Bookmarks("CTibCalVal").Select 'Sélectionne la
macrobutton marquée d'un signet

strTemp = Selection.Text
Debug.Print strTemp

strTemp = Mid(strTemp, 16, 3)
Debug.Print strTemp

ActiveWindow.View.ShowFieldCodes = False

If strTemp = "Che" Then
rep = False
Else
rep = True
End If
End Sub

Je prends toutes les suggestions que vous me proposerez.

Merci

Jocelyne


Avatar
Gloops
Ah oui, euh, la version sans le N, comme ça, pour faire joli :

Sub ListeChk()
Dim Fd As FormField
For Each Fd In ActiveDocument.FormFields
If Fd.Type = wdFieldFormCheckBox Then
Debug.Print Fd.Name, Fd.CheckBox.Value
End If
Next
End Sub
Avatar
Jocelyne
Gloops a exprimé avec précision :
Ah oui, euh, la version sans le N, comme ça, pour faire joli :

Sub ListeChk()
Dim Fd As FormField
For Each Fd In ActiveDocument.FormFields
If Fd.Type = wdFieldFormCheckBox Then
Debug.Print Fd.Name, Fd.CheckBox.Value
End If
Next
End Sub



Merci pour votre réponse.

En fait, les champs que je veux exploiter ne sont pas des FormFields;
ce sont des codes de champs MACROBUTTON dans lesquels je lance la macro
CheckIt qui, lorsque l'utilisateur double-clique sur ce champ, le code
de champ est remplacé par {MACROBUTTON UnCheckIt}. Ces deux macros
insèrent les symboles Wingdings correspondant à la case à cocher et à
la case vide. (J'ai pris ces exemples d'obtention de cases dans les
modèles de télécopie de Word 2003 ou 2002.)

Petite précision, le document n'est pas un formulaire protégé et tous
les champs de saisie de texte sont identifiés par des codes de champs
du genre [Cliquer ici] et sont marqués d'un signet pour pouvoir les
reporter. Les codes de champs des cases sont aussi marqués d'un signet.

Mon but est de reporter certains champs de ce document dans un autre
formulaire (celui-ci est de type FormFields) qui contient des champs
correspondants, par exemple le contenu du champ de saisie du Prénom
devra se reporter dans le TextBox prévu pour le prénom.

Pour les types de champs de texte, ça va, je suis capable de tout
reporter comme je le souhaite. Là où ça se corse, c'est au niveau des
cases à cocher.

Dans un premier temps, il faut que je détermine si le code de champ
{MACROBUTTON...} montre la case cochée ou non. Comme je l'ai dit dans
mon premier message, j'ai fait une macro qui me retourne la valeur Vrai
ou Faux selon le cas.

Cependant, ce traitement doit s'opérer sur plusieurs code de champ
{MACROBUTTON CheckIt} et je me demandais si ça pouvait se faire sans
répéter mes instructions de codes à chaque signet des MACROBUTTON.

En résumé, ce serait :

Va au signet F, est-ce un case cochée ou case vide, si elle est vide,
retourne Faux, sinon, retourne Vrai dans une variable qui me
permettrait de reporter la réponse dans le CheckBox correspondant de
l'autre formulaire.

Va au signet M, est-ce un case cochée ou case vide, et ainsi de
suite...

J'espère que c'est plus clair ainsi.

Merci de votre aide.
Jocelyne
Avatar
Gloops
Jocelyne a écrit, le 14/03/2010 04:58 :
Gloops a exprimé avec précision :


merci :)

(J'ai pris ces exemples d'obtention de cases dans les
modèles de télécopie de Word 2003 ou 2002.)



Ah, ben oui, c'est ça qu'il faut préciser, ça évite d'aller voir sur
Google, de tomber sur un anti-popup, tout ça ...

Bon alors à ce que je comprends le bouton exécute une macro CheckIt o u
une macro UnCheckIt. Sur le plan fonctionnel, il me semble que la
différence par rapport aux cases à cocher de formulaire est d'ordre
esthétique ? D'où la présence sur un fax, effectivement.

En tout cas, je ne vois guère d'obstacle à utiliser le même code po ur
savoir ce que ces boutons ont dans les tripes :

Sub ListeChk()
Dim Fd As Field
For Each Fd In ActiveDocument.Fields
If Fd.Type = wdFieldMacroButton Then
Debug.Print Fd.Index, Chr(34) + Fd.Code + Chr(34)
Select Case Fd.Code
Case " MACROBUTTON CheckIt "
Debug.Print "Celle-ci n'est pas cochée"
Case " MACROBUTTON UnCheckIt "
Debug.Print "Celle-ci est bien cochée"
Case Else
Debug.Print "Ce machin-là n'est pas dans mes bataillon s"
End Select
End If
Next
End Sub

Attention cette affaire-là est sensible au nombre d'espaces, et si
jamais il y a des paramètres de précisés alors il faut en tenir com pte.
Bien vérifier la casse de UnCheckIt, si elle est différente on tomber a
dans le cas par défaut, à moins de tout convertir en majuscules ou en
minuscules.

Pour être plus souple face à des modifications au niveau du code du
bouton on peut chercher du côté de Split, éventuellement après av oir
remplacé le nombre de fois qu'il faut deux espaces consécutifs par un et
vérifié si il y en a un au début et un à la fin.


Il y a vraiment quelque chose d'esthétique à faire avec ces cases à
cocher ou il s'agit juste de faire entrer des options ?

On pourrait prendre le problème dans l'autre sens, entrer les choix ave c
un formulaire (ou une boîte de dialogue, mais ça ça suppose d'étu dier la
création d'une boîte de dialogue), et ensuite faire la mise en forme en
reprenant le code (ou une partie du code) de CheckIt et UnCheckIt.
Avatar
Gloops
Je dois bien reconnaître que j'ai proposé une réponse guère prati que car
elle ne repère les boutons macros que par leur numéro d'ordre. On peu t
leur affecter un texte à afficher, en deuxième paramètre de MACROBU TTON,
en retouchant les macros CheckIt et UnCheckIt, si tant est que cela
n'affecte pas le caractère esthétique visé (ce qui n'est pas forcé ment
gagné).

Toutefois puisque des signets ont été affectés aux boutons, ça po urrait
aider de continuer à passer par les signets.
Nous avons quatre lignes Debug.Print qui se suivent, si les outils de
newsgroups en ont scindé une il ne faut pas oublier de rejoindre les
deux bouts avant d'exécuter -de toute façon sinon on se fera rappeler à
l'ordre avec des lignes de code qui s'afficheront en rouge.

Sub ListeBmk()
Dim B As Bookmark
Dim F As Field
For Each B In ActiveDocument.Bookmarks
Debug.Print " ==> signet " + B.Name, B.Start, B.End, B.Range.Tex t
If B.Range.Fields.Count > 0 Then
For Each F In B.Range.Fields
If F.Type = wdFieldMacroButton Then
Debug.Print "Ici nous avons un bouton de macro contenu
dans le signet " + B.Name
Debug.Print F.Code
Debug.Print "et nous en avons fini avec le signet " +
B.Name
Debug.Print ""
End If
Next
End If
Next
End Sub

et alors une fois que nous avons F.Code, ça devient simple de remettre
le Select Case évoqué dans mon message précédent, en tenant compt e des
remarques que j'ai formulées en dessous.
Avatar
Jocelyne
Gloops a exposé le 14-03-10 :
Jocelyne a écrit, le 14/03/2010 04:58 :
Gloops a exprimé avec précision :


merci :)

(J'ai pris ces exemples d'obtention de cases dans les modèles de télécopie
de Word 2003 ou 2002.)



Ah, ben oui, c'est ça qu'il faut préciser, ça évite d'aller voir sur Google,
de tomber sur un anti-popup, tout ça ...

Bon alors à ce que je comprends le bouton exécute une macro CheckIt ou une
macro UnCheckIt. Sur le plan fonctionnel, il me semble que la différence par
rapport aux cases à cocher de formulaire est d'ordre esthétique ? D'où la
présence sur un fax, effectivement.

En tout cas, je ne vois guère d'obstacle à utiliser le même code pour savoir
ce que ces boutons ont dans les tripes :

Sub ListeChk()
Dim Fd As Field
For Each Fd In ActiveDocument.Fields
If Fd.Type = wdFieldMacroButton Then
Debug.Print Fd.Index, Chr(34) + Fd.Code + Chr(34)
Select Case Fd.Code
Case " MACROBUTTON CheckIt "
Debug.Print "Celle-ci n'est pas cochée"
Case " MACROBUTTON UnCheckIt "
Debug.Print "Celle-ci est bien cochée"
Case Else
Debug.Print "Ce machin-là n'est pas dans mes bataillons"
End Select
End If
Next
End Sub

Attention cette affaire-là est sensible au nombre d'espaces, et si jamais il
y a des paramètres de précisés alors il faut en tenir compte. Bien vérifier
la casse de UnCheckIt, si elle est différente on tombera dans le cas par
défaut, à moins de tout convertir en majuscules ou en minuscules.

Pour être plus souple face à des modifications au niveau du code du bouton on
peut chercher du côté de Split, éventuellement après avoir remplacé le nombre
de fois qu'il faut deux espaces consécutifs par un et vérifié si il y en a un
au début et un à la fin.


Il y a vraiment quelque chose d'esthétique à faire avec ces cases à cocher ou
il s'agit juste de faire entrer des options ?

On pourrait prendre le problème dans l'autre sens, entrer les choix avec un
formulaire (ou une boîte de dialogue, mais ça ça suppose d'étudier la
création d'une boîte de dialogue), et ensuite faire la mise en forme en
reprenant le code (ou une partie du code) de CheckIt et UnCheckIt.



Un gros merci Gloops, je vais tester ton code.

Je sais, ma structure de formulaire semble complexe mais je n'avais pas
d'autres choix que de faire comme ça selon mes connaissances dans Word.

Je ne pouvais pas utiliser le vrai formulaire avec des checkbox et
textbox car une fois protégé, l'utilisateur ne peut plus utiliser les
options de dessin même si la section est déprotégée. Aussi, la création
du document (évaluation médicale) débute par une UserForm que
l'utilisateur remplit dans un premier temps. Par la suite, les autres
informations sont entrées directement le document avec les champs de
saisie et ces infos ne sont pas saisies immédiatement.

Une grande parties des informations saisies dans l'évaluation doivent
être reportées dans différents documents dont un formulaire avec
CheckBox etc.

En tout cas encore merci de tout l'aide que vous m'apportez.

Jocelyne
Avatar
Gloops
J'ai mis mon horloge à l'heure, car elle s'était tiré un coup de fl emme :)

Jocelyne a écrit, le 14/03/2010 16:31 :
Un gros merci Gloops, je vais tester ton code.

Je sais, ma structure de formulaire semble complexe mais je n'avais pas
d'autres choix que de faire comme ça selon mes connaissances dans Wor d.

Je ne pouvais pas utiliser le vrai formulaire avec des checkbox et
textbox car une fois protégé, l'utilisateur ne peut plus utiliser l es
options de dessin même si la section est déprotégée.



Attention, il existe deux types de cases à cocher dans Word (en ne
comptant pas les éléments graphiques des fax) :
- celles qu'on crée à partir de la barre d'outils "Formulaires"
- celles qu'on crée à partir de celle qui s'appelle "Boîte à outi ls
Contrôles"

Seule la première catégorie est concernée par ce reproche.

On obtient l'état d'un contrôle case à cocher (créé donc par la boîte à
outils Contrôles) en interrogeant sa propriété Value :
CheckBox1.Value

(retourne vrai ou faux)

Ceci présente simplement la difficulté que l'objet CheckBox n'est
reconnu que dans le module du document où il se trouve.


Aussi, la création
du document (évaluation médicale)



Ah, voilà qui me rappelle des histoires d'essais cliniques ...

débute par une UserForm que
l'utilisateur remplit dans un premier temps. Par la suite, les autres
informations sont entrées directement le document avec les champs de
saisie et ces infos ne sont pas saisies immédiatement.



Saisie en plusieurs fois, donc ?



Une grande parties des informations saisies dans l'évaluation doivent
être reportées dans différents documents dont un formulaire avec
CheckBox etc.



J'ai un modèle de courrier qui fonctionne sur le même principe, une
boîte de dialogue permet de saisir l'objet et l'identité du
correspondant, ce qui est reporté dans le document et dans les
statistiques de courrier, pour les recherches. Le titre de salutation,
Monsieur ou Madame, est reporté au début du courrier, et en même te mps
dans la salutation à la fin.


En tout cas encore merci de tout l'aide que vous m'apportez.




Pas d'quoi :)

Au besoin dans mon adresse mail il faut retirer invalid.
Avatar
Gloops
Gloops a écrit, le 14/03/2010 18:25 :
Attention, il existe deux types de cases à cocher dans Word (en ne
comptant pas les éléments graphiques des fax) :
- celles qu'on crée à partir de la barre d'outils "Formulaires"
- celles qu'on crée à partir de celle qui s'appelle "Boîte à ou tils
Contrôles"

Seule la première catégorie est concernée par ce reproche.




Une précision quand même, le premier bouton de la boîte à outils
Contrôles, qui représente une sorte d'équerre, permet de quitter le mode
création ou d'y revenir, pour soit ajouter ou retirer des contrôles,
soit s'en servir. L'avantage sur le verrouillage des formulaires est
qu'il n'empêche pas d'utiliser les outils de dessin.
Avatar
Jocelyne
Gloops avait soumis l'idée :
Gloops a écrit, le 14/03/2010 18:25 :
Attention, il existe deux types de cases à cocher dans Word (en ne comptant
pas les éléments graphiques des fax) :
- celles qu'on crée à partir de la barre d'outils "Formulaires"
- celles qu'on crée à partir de celle qui s'appelle "Boîte à outils
Contrôles"

Seule la première catégorie est concernée par ce reproche.




Une précision quand même, le premier bouton de la boîte à outils Contrôles,
qui représente une sorte d'équerre, permet de quitter le mode création ou d'y
revenir, pour soit ajouter ou retirer des contrôles, soit s'en servir.
L'avantage sur le verrouillage des formulaires est qu'il n'empêche pas
d'utiliser les outils de dessin.



Rebonjour,

J'ai essayé de mettre ce type de contrôle uniquement aux endroits où je
dois analyser le contenu mais je ne connais rien des contrôles ActiveX
si ce n'est de les insérer dans le document :-(.

De plus, je n'arrivais pas à modifier l'apparence des cases pour
qu'elles aient l'apparence des autres cases (bordure simple tout
autour).

Et pour terminer, la programmation sur ces objets me rend la vie
difficile car, avec les petits tests que j'ai faits, il semble que le
code doit être placé dans ThisDocument du projet et je ne parviens pas
à l'ajouter à mes autres modules.

J'avoue que je n'ai pas beaucoup de temps pour apprendre à coder les
Contrôles ActiveX. Un jour peut-être!!!

Je vais regarder ce que vous me proposez. J'apprécie grandement ce que
vous faites.

Jocelyne
Avatar
Gloops
Jocelyne a écrit, le 14/03/2010 18:45 :
Et pour terminer, la programmation sur ces objets me rend la vie
difficile car, avec les petits tests que j'ai faits, il semble que le
code doit être placé dans ThisDocument du projet et je ne parviens pas à
l'ajouter à mes autres modules.



Effectivement dans les tests que j'ai faits tout-à-l'heure, je me suis
heurté au même problème, je n'y avais pas touché depuis quelques mois.
En fait, je viens de réessayer, j'ai pu y accéder ainsi :

Dim D As Document
Set D = Application.Documents("Document1")
Debug.Print D.CheckBox1.Value

Comme CheckBox1 n'est pas présent par défaut, il n'est pas proposé par
l'IntelliSense (c'est-à-dire que lorsqu'on tape le point derrière D, on
ne voit pas apparaître CheckBox1 dans la liste, donc on croit qu'il n'y
est pas. La liste IntelliSense fait apparaître les propriétés et
méthodes de l'objet Document, mais pas celles qu'on a ajoutées à ce
document particulier. Finalement, dans ce cas particulier, j'aurais
aussi bien pu déclarer D comme Object. Il n'empêche que le code
ci-dessus fonctionne depuis un autre module (sous réserve de rectifier
le nom du document bien entendu). ça marche aussi avec ActiveDocument, à
condition que ce soit le bon document qui soit actif.



J'avoue que je n'ai pas beaucoup de temps pour apprendre à coder les
Contrôles ActiveX. Un jour peut-être!!!



Il faut bien avouer que si il y a deux types de contrôles, c'est bien
parce qu'il y a (au moins) deux types de publics. Parfois ça rend
service d'avoir un contrôle facile à appréhender, et pour en arrive r là
Microsoft en a réduit les possibilités.


Je vais regarder ce que vous me proposez. J'apprécie grandement ce qu e
vous faites.



Si ça peut rendre service ...