1. Introduction▲
Vous êtes nombreux à rencontrer des problèmes pour créer, utiliser et gérer des formulaires dans vos documents. Ces opérations ne sont pas compliquées mais nécessitent de la rigueur.
Nous aborderons les contrôles de formulaire sous deux aspects, en mode normal et en VBA.
2. Ajouter des contrôles de formulaire à votre document▲
Nous allons utiliser les contrôles de formulaire hérités qui sont communs aux versions 2003 et 2007 de Word. Ces contrôles sont faciles à mettre en œuvre.
2-A. Word 2003▲
Pour insérer des contrôles sous Word 2003, vous devez afficher la barre d'outils Formulaire. Vous pouvez l'activer à l'aide d'un clic droit dans la partie des menus qui ne contient pas de texte.
Dans la liste, choisissez Formulaire.
Vous obtenez une barre d'outils contenant les contrôles de formulaire.
Les outils qui nous intéressent sont au nombre de 5.
2-B. Word 2007▲
Pour insérer des contrôles de formulaire à votre document, vous devez afficher l'onglet "Développeur".
Si l'onglet "Développeur" n'est pas affiché, vous devez l'activer via les Options de Word.
Bouton Office, Option de Word et cocher : Afficher l'onglet développeur dans le ruban.
Cet onglet possède dans le groupe contrôle un bouton donnant accès aux contrôles de formulaire, ces contrôles sont qualifiés d'hérités.
En cliquant sur ce bouton vous ouvrez une petite fenêtre contenant les différents contrôles hérités utilisables.
2-C. Le champ Texte▲
Ce type de champ peut recevoir n'importe quel type de données simples (texte, date, nombre).
Si vous double cliquez sur un champ de formulaire, vous ouvrez la boîte de dialogue relative aux propriétés de ce champ.
La première liste permet le choix du type de donnée que le champ devra contenir.
Si vous choisissez un type "Nombre" et que vous tentez d'introduire une lettre, la donnée est convertie en 0.
Vous pouvez définir un texte par défaut pour votre champ.
Avec comme résultat :
Vous pouvez également déterminer quelle sera la taille de votre champ ainsi que la casse qui sera utilisée pour afficher le texte.
Les options relatives aux macros permettent de choisir dans la liste des macros du document celle qui pourrait être utilisées lors de la sortie ou entrée du champ.
La dernière partie de la fenêtre est utilisée pour définir le nom du signet utilisé pour le champ (1), si le remplissage du champ (2) est activé (case cochée) ou si la mise à jour des champs (3) doit être effectuée (case cochée).
Vous avez la possibilité de définir un texte pour aider l'utilisateur à la saisie de données dans vos champs (4).
Vous ouvrez alors une boîte de dialogue permettant d'entrer le texte d'aide, il sera affiché selon le cas dans la barre
d'état de Word ou sur l'utilisation de la touche "F1".
Ce qui apparaît dans la barre d'état :
2-D. La Case à cocher▲
La case à cocher est le contrôle le plus simple, il n'est utilisé qu'avec un seul type de données Oui/Non. Vous pouvez accéder aux propriétés de ce champ de formulaire par double clic sur le contrôle. Les propriétés disponibles sont moins nombreuses.
La première zone de propriétés permet de définir la taille de la case à cocher, elle sera soit automatique (en fonction de la taille de la police), soit avec la taille de votre choix.
Vous avez le choix pour la valeur par défaut de votre contrôle.
Et les propriétés traditionnelles pour l'activation des macros, sur l'entrée ou la sortie du contrôle.
La dernière zone contient les mêmes propriétés que le champ texte.
2-E. La liste déroulante▲
La liste déroulante permet de choisir dans une liste de valeurs. Ce type de champ permet un meilleur contrôle des données qui seront utilisées. Ces données sont entrées via la boîte de dialogue des propriétés du champ.
La liste est peuplée élément par élément.
Chaque élément est ajouté à la liste par un bouton ou par la touche Entrée, et les éléments sont affichés dans la case de droite.
Les listes déroulantes ont un très gros défaut, le nombre d'éléments qu'elles peuvent contenir ne peut être supérieur à 25.
2-F. Navigation▲
La navigation entre les différents champs de formulaire peut se faire par la souris ou à l'aide de la touche Tabulation ou Maj Tabulation. Cette navigation n'est possible que si la section est protégée et n'autorise que le remplissage de formulaire.
2-G. Protection du formulaire▲
Pour que votre formulaire soit utilisable, il est impératif de le protéger. Pour protéger votre formulaire, dans l'onglet Développeur, vous avez un bouton "Protéger un document".
Ce bouton ouvre un volet contenant plusieurs options.
La partie qui nous intéresse est la seconde "Restriction des modifications".
Après avoir coché vous pouvez choisir le type de limitation qui vous souhaitez appliquer à votre document.
Vous devez ensuite activer la protection
Vous pouvez utiliser un mot de passe mais ce n'est pas obligatoire.
Si votre document ne possède qu'une seule section, la restriction sera applicable à l'ensemble du document.
2-G-1. Protection d'une section▲
Pour ne verrouiller que la partie de votre document contenant les champs de formulaire, vous devez ajouter un saut de section avant et après vos champs. Ce saut de section doit être continu.
Après avoir ajouté des sections supplémentaires à votre document, vous pouvez choisir les sections auxquelles va s'appliquer la restriction.
Seules les sections sélectionnées auront une restriction de modification, les autres resteront éditables.
3. Passons à la pratique▲
Nous allons créer un document contenant deux sections, la première contiendra les champs de formulaire et la seconde du texte libre.
La partie formulaire servira à récolter les informations sur le destinataire.
Nous allons en vis-à-vis du texte ajouter les champs de formulaire. Les champs destinés à recueillir les Nom, Prénom, Adresse, Ville, CP et téléphone seront de simple texte. Les informations relatives aux civilités seront des cases à cocher, la date de naissance un champ texte avec limitation sur le contenu et le nombre d'enfants un liste de choix avec 10 possibilités.
Tous les champs de formulaire seront ajoutés à la fin des paragraphes.
Le premier champ contenant le nom sera toujours en majuscule alors que celui du prénom n'aura que la première lettre en majuscule.
Le choix : "Initiale en majuscule" sera plus approprié pour les prénoms composés.
Pour le champ CP, nous allons limiter la taille du champ à 5 caractères.
Pour les civilités, nous allons utiliser des cases à cocher, une par civilité.
La date de naissance sera entrée dans une zone de texte mais de type date.
Et finalement, le nombre d'enfants sera choisi dans une liste d'éléments.
Nous allons ajouter un saut de section continu à la fin de notre formulaire pour permettre l'utilisation d'un texte libre.
Il ne nous reste qu'à protéger le document et le sauvegarder en tant que modèle de document.
Nous avons maintenant un formulaire que nous pouvons envoyer pour récolter des données.
Il est possible d'enregistrer les données contenues dans le formulaire sous la forme de texte délimité. Vous devez pour ce faire, modifier une option de Word.
Le résultat d'une sauvegarde est un fichier txt sous format csv.
Si vous avez prévu du texte libre, il ne sera pas enregistré.
Il est temps de mettre de l'ordre dans notre formulaire. Si le but n'est que le remplissage, les actions suivantes ne sont pas utiles. Si vous souhaitez utiliser du code dans votre formulaire pour automatiser certaines actions ou vérifications, il est important d'utiliser des signets en cohérence avec le texte qui accompagne vos champs.
Dans cette illustration, le nom du signet est "Texte1", ce n'est pas très évocateur du contenu. Comme ce nom sert à identifier un signet contenant un champ de formulaire, nous avons plusieurs solutions, utiliser un préfixe signalant que c'est un champ de formulaire, un signet, un champ texte, ...
L'option que j'ai choisie est le signalement d'un signet, d'un champ texte et de la donnée.
- Nom : bm_txt_Nom
- Prénom : bm_txt_Prenom
- Adresse : bm_txt_Adresse
- Ville CP : bm_txt_CP
- Tel : bm_txt_Tel
- État civil M : bm_boo_M
- État civil C : bm_boo_C
- État civil V : bm_boo_V
- État civil D : bm_boo_D
- Date de Naissance : bm_dte_Naiss
- Nombre d'enfants : bm_txt_Enfant
bm est utilisé pour BookMark
4. Le VBA▲
Dans les propriétés, nous avons vu qu'il était possible d'exécuter du code sur l'entrée ou la sortie d'un champ de formulaire.
Nous allons utiliser un exemple simple qui va nous permettre dans un premier temps de contrôler que notre code est bien exécuté.
Dans cet exemple, nous allons afficher après saisie le contenu d'un champ dans une boîte de message.
Insérez ce code dans l'éditeur VBE, de préférence dans le module du document.
Sub
AfficherContenu
(
)
MsgBox
ActiveDocument.FormFields
(
"bm_txt_Nom"
).Result
End
Sub
Dans les propriétés du champ de formulaire, vous avez la possibilité de choisir cette procédure. Nous allons l'insérer pour qu'elle soit exécutée sur l'évènement de sortie du contrôle.
Le principe est assez simple, lorsque vous allez sortir du contrôle, la procédure sera exécutée et le contenu du champ sera affiché dans une boîte de message.
N'oubliez pas d'activer la protection pour pouvoir utiliser les champs de formulaire.
Si vous avez correctement écrit votre code, vous obtenez ceci lorsque vous entrez une valeur dans le champ.
Vous pouvez, au lieu d'afficher votre saisie dans une boîte de dialogue, effectuer un traitement sur les données introduites.
Nous allons détailler le code utilisé.
Les champs de formulaire font partie de la collection FormFields, pour accéder à un champ de formulaire, nous pouvons
utiliser son index ou son nom, le nom étant le nom donné au signet.
Pour obtenir le contenu du champ, nous utilisons la propriété Result.
Nous pouvons aussi faire une boucle sur les différents champs contenus dans notre document.
Sub
BoucleSurChamp
(
)
Dim
myFF As
FormField
For
Each
myFF In
ActiveDocument.FormFields
Debug.Print
myFF.Name
Next
myFF
End
Sub
Le VBA nous permet d'ajouter des valeurs à une liste déroulante.
Ajoutons à un formulaire une liste déroulante qui aura comme nom LD1, nous allons maintenant ajouter des éléments
à cette liste avec un petit morceau de code.
Sub
AjouterAListe
(
)
'Ajout des éléments
With
ActiveDocument.FormFields
(
"LD1"
).DropDown.ListEntries
.Add
"Valeur 1"
.Add
"Valeur 2"
End
With
End
Sub
Avec comme résultat :
Si nous exécutons le code une seconde fois, les éléments sont à nouveau ajoutés à la liste.
Si nous souhaitons remplir la liste et ne pas y ajouter de nouveaux éléments, il faut la "vider" avant. La méthode Clear permet de vider la liste avant de la remplir.
Sub
AjouterAListe
(
)
With
ActiveDocument.FormFields
(
"LD1"
).DropDown.ListEntries
'la méthode Clear vide la liste
.Clear
.Add
"Valeur 1"
.Add
"Valeur 2"
End
With
End
Sub
Nous allons réaliser un petit formulaire avec deux listes déroulantes, la première contiendra une liste de trois pays et la seconde une liste contenant 5 villes de ces pays.
Nous allons entrer la liste des pays manuellement.
- Belgique
- France
- Suisse
Les villes seront :
Pays | Villes |
---|---|
Belgique | Bruxelles Charleroi Liège Mons Namur |
France | Avignon Lille Marseille Paris Rennes |
Suisse | Genève Lausanne Montreux Neuchâtel Orbe |
Pour modifier le contenu de la seconde liste, nous allons utiliser le résultat de la première. Nous avons utilisé cette propriété
un peu plus haut : "Result". En fonction du résultat obtenu, nous allons remplir la seconde liste en prenant soin de la vider avant.
Sub
ListesEnchainees
(
)
Dim
stPays As
String
'récupération du pays
stPays =
ActiveDocument.FormFields
(
1
).Result
'nettoyage de la seconde liste
ActiveDocument.FormFields
(
2
).DropDown.ListEntries.Clear
'ajout en fonction du pays
Select
Case
stPays
Case
"Belgique"
With
ActiveDocument.FormFields
(
2
).DropDown.ListEntries
.Add
"Bruxelles"
.Add
"Charleroi"
.Add
"Liège"
.Add
"Mons"
.Add
"Namur"
End
With
Case
"France"
With
ActiveDocument.FormFields
(
2
).DropDown.ListEntries
.Add
"Avignon"
.Add
"Lille"
.Add
"Marseille"
.Add
"Paris"
.Add
"Rennes"
End
With
Case
"Suisse"
With
ActiveDocument.FormFields
(
2
).DropDown.ListEntries
.Add
"Genève"
.Add
"Lausanne"
.Add
"Montreux"
.Add
"Neuchâtel"
.Add
"Orbe"
End
With
End
Select
End
Sub
Ce code sera exécuté lors de la sortie du contrôle.
Essayons !
N'oubliez pas de protéger le document en mode remplissage de formulaire.
Nous avons bien une mise à jour en fonction du choix effectué dans la première liste.
4-A. Effet "Boutons Radio"▲
Il n'y a pas de "Boutons Radio" prévus pour les contrôles de formulaire. Mais nous pouvons à l'aide de code obtenir le même résultat.
Le fonctionnement des boutons radio est assez simple, lorsqu'une valeur "Vrai" est assignée à un élément, tous les autres éléments du groupe prennent la valeur "Faux". Nous allons donc appliquer ce principe aux cases à cocher utilisées pour les civilités.
Nous allons donner à chaque procédure un nom spécifique, il faut une procédure par case à cocher. Le nom choisi est CAC_X, ou CAC pour Case à Cocher et X pour la civilité traitée. Cette procédure sera utilisée lorsque nous allons sortir du champ.
Sub
CAC_C
(
)
If
ActiveDocument.FormFields
(
"bm_boo_C"
).Result
Then
With
ActiveDocument
.FormFields
(
"bm_boo_M"
).Result
=
False
.FormFields
(
"bm_boo_V"
).Result
=
False
.FormFields
(
"bm_boo_D"
).Result
=
False
End
With
End
If
End
Sub
Dans le code ci-dessus, à la sortie de la case à cocher C, si la valeur de cette case est vraie, toutes les autres sont passées en fausse. Pour atteindre la case à cocher voulue, nous utilisons son signet.
5. Références▲
Nous allons passer en revue quelques références de nos FormFields.
5-A. Protection▲
Pour pouvoir utiliser un formulaire, il est nécessaire d'activer la protection du document. Dans le même ordre d'idée, il est parfois nécessaire de suspendre la protection pour intervenir sur le document pour ensuite protéger à nouveau ce document.
Pour déprotéger le document, nous allons utiliser la méthode Unprotect du Document
ActiveDocument.Unprotect
Password:=
""
La protection est aussi simple, il est cependant nécessaire de spécifier en argument le type de protection que nous allons utiliser.
ActiveDocument.Protect
WdProtectionType:=
wdAllowOnlyFormFields, Password:=
""
5-B. Propriétés▲
5-B-1. CalculateOnExit ▲
Cette propriété reçoit comme valeur un Boolean qui spécifie que les champs seront mis à jour lors de la sortie du champ en cours.
Cette mise à jour agit sur tous les champs du document.
ActiveDocument.FormFields
(
4
).CalculateOnExit
=
True
Cette propriété est en lecture/écriture
Debug.Print
ActiveDocument.FormFields
(
4
).CalculateOnExit
On peut très bien envisager de modifier en une seule fois cette propriété pour tous les champs de formulaire d'un document.
Sub
modifierTousLesChamps
(
)
Dim
myFF As
FormField
For
Each
myFF In
ActiveDocument.FormFields
myFF.CalculateOnExit
=
True
Next
myFF
End
Sub
De cette manière, nous sommes certains de ne pas en avoir oublié un.
5-B-2. CheckBox ▲
Cette propriété n'est pas exploitable directement. Vous pouvez à l'aide de cette propriété savoir si un champ de formulaire est une case à cocher.
If
ActiveDocument.Formfields
(
3
).CheckBox
Then
ActiveDocument.FormFields
(
3
).CheckBox.Value
=
True
Si le champ FormFields(3) est bien une case à cocher, la valeur renvoyée est True.
Propriété | Utilisation |
---|---|
Valid | Renvoie True si le champ est une case à cocher |
Default | Définit la valeur par défaut du champ |
Value | Donne une valeur au champ. Ne pas confondre avec Result |
5-B-3. DropDown ▲
Cette propriété est identique à la précédente mais s'applique à une liste déroulante.
C'est cette propriété que nous avons utilisée un peu plus tôt dans cet article pour ajouter des éléments à une liste.
With
ActiveDocument.FormFields
(
2
).DropDown.ListEntries
.Add
"Bruxelles"
.Add
"Charleroi"
.Add
"Liège"
.Add
"Mons"
.Add
"Namur"
End
With
Propriété | Utilisation |
---|---|
Valid | Renvoie True si le champ est une liste déroulante |
ListEntries | Permet d'intervenir sur le contenu de la liste. |
Value | Renvoie l'index de l'item choisi de la liste. Mais permet aussi d'afficher une valeur à la liste |
ActiveDocument.FormFields
(
2
).DropDown.Value
=
2
Cet exemple permettra d'afficher le second élément de la liste, qui peut être modifié par l'utilisateur.
5-B-4. Enabled ▲
Cette propriété détermine si le champ est activé ou non, elle se traduit par une case à cocher dans la boîte de dialogue des propriétés du champ.
ActiveDocument.FormFields
(
1
).Enabled
=
True
5-B-5. EntryMacro et ExitMacro ▲
Ces propriétés définissent quelle sera la macro qui sera exécutée lors de l'entrée ou de la sortie du contrôle.
Le nom de la macro est passé en argument sous la forme d'une chaîne de caractère.
ActiveDocument.FormFields
(
4
).EntryMacro
=
"MaMacro"
5-B-6. HelpText ▲
Cette propriété n'est pas utilisable seule, elle doit être associée à la propriété OnwHelp qui doit être True.
With
ActiveDocument.FormFields
(
4
)
.OwnHelp
=
True
.HelpText
=
"MonMessage"
End
With
Elle permet d'afficher le texte d'aide lorsque l'utilisateur presse la touche F1.
5-B-7. Name▲
Cette propriété permet de récupérer ou de modifier le nom d'un champ de formulaire.
ActiveDocument.FormFields
(
1
).Name
=
"FF1"
Debug.Printe
ActiveDocument.FormFields
(
1
).Name
5-B-8. Next et Previous ▲
Ces deux propriétés permettent d'agir respectivement sur le champ précédent ou suivant.
ActiveDocument.FormFields
(
3
).Next.Result
=
"Developpez.com"
5-B-9. OwnHelp ▲
Nous l'avons vu plus haut, cette propriété détermine si le champ possède son propre texte d'aide.
5-B-10. Result ▲
Probablement la propriété la plus intéressante, elle permet de récupérer le contenu de votre champ de formulaire.
ActiveDocument.FormFields
(
1
).Result
Comme nous l'avons vu plus tôt, en récupérant le résultat, vous pouvez modifier des choix, créer des champs.
Si vous souhaitez faire du traitement en série de vos formulaires, je vous propose un peu de lecture : un formulaire pour traiter des données
5-B-11. StatusText ▲
Cette propriété contient le texte qui sera affiché dans la barre d'état de Word.
ActiveDocument.FormFields
(
1
).StatusText
=
"Le texte de la barre d'état"
5-B-12. Type ▲
Renvoie ou définit le type de champ de formulaire.
Dim
myFF As
FormField
For
Each
myFF In
ActiveDocument.FormFields
Debug.Print
myFF.Type
Next
myFF
Le type renvoyé est sous forme numérique.
Valeur | Type | Description |
---|---|---|
71 | wdFieldFormCheckBox | Champ FormCheckBox. |
83 | wdFieldFormDropDown | Champ FormDropDown. |
70 | wdFieldFormTextInput | Champ FormText. |
5-B-13. Count ▲
C'est la plus "célèbre" des propriétés, elle permet de savoir combien d'objets FormFields sont contenus dans la collection.
Debug.Print
ActiveDocument.FormFields.Count
5-B-14. Shaded ▲
Cette propriété est purement esthétique. En fonction de la valeur qui lui est attribuée, les champs de formulaire seront grisés ou non. C'est une question de goût.
ActiveDocument.FormFields.Shaded
=
True
Cette propriété s'applique à toute la collection, il n'est donc pas possible de mélanger des champs grisés et non grisés sur un même document.
5-C. Méthodes▲
5-C-1. Add▲
La méthode Add permet d'ajouter un élément à la collection des champs de formulaire (FormFields).
Ajoutez dans un document un champ de formulaire Case à cocher. Sur la sortie de ce champ, choisissez
la procédure ci-dessous.
Ajoutez un signet "S1" à votre document.
Sub
AjouterChamp
(
)
If
ActiveDocument.FormFields
(
3
).Result
Then
ActiveDocument.Bookmarks
(
"S1"
).Range.FormFields.Add
Range:=
ActiveDocument.Bookmarks
(
"S1"
).Range
, WdFieldType:=
wdFieldFormTextInput
End
If
End
Sub
Attention, dans cet exemple, la Case à cocher est le troisième champ de formulaire !
Sur sortie, si la case à cocher est cochée, un champ supplémentaire sera ajouté.
5-C-2. Copy et Cut▲
Permet de couper le champ choisi. Cette méthode ne fonctionne que si le document n'est pas protégé.
Sub
CouperChamp
(
)
'Suppression de la protection
ActiveDocument.Unprotect
ActiveDocument.FormFields
(
5
).Cut
'Activation de la protection
ActiveDocument.Protect
wdAllowOnlyFormFields
End
Sub
5-C-3. Delete▲
Cette méthode va, sans surprise, supprimer le champ de formulaire auquel cette méthode sera appliquée.
ActiveDocument.FormFields
(
5
).Delete
5-C-4. Select▲
Cette méthode est l'équivalent de la sélection du champ à l'aide de la souris. Elle renvoie un objet Selection et n'est utilisable que si la protection du document est enlevée, le Select fonctionne, mais on ne peut rien en faire.
ActiveDocument.FormFields
(
1
).Select
6. Liens▲
7. Remerciements▲
Merci à jacques_jean et Jeannot45 qui ont pris le temps de me corriger.
Merci à DVP pour son hébergement de qualité et durable.