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.

Image non disponible

Dans la liste, choisissez Formulaire.

Image non disponible

Vous obtenez une barre d'outils contenant les contrôles de formulaire.

Image non disponible

Les outils qui nous intéressent sont au nombre de 5.

Image non disponible
Le champ texte
Image non disponible
La case à cocher
Image non disponible
La liste déroulante
Image non disponible
La gomme
Image non disponible
Le bouton de protection

2-B. Word 2007

Pour insérer des contrôles de formulaire à votre document, vous devez afficher l'onglet "Développeur".

Image non disponible

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.

Image non disponible

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.

Image non disponible
Image non disponible

En cliquant sur ce bouton vous ouvrez une petite fenêtre contenant les différents contrôles hérités utilisables.

Image non disponible
Le champ texte
Image non disponible
La case à cocher
Image non disponible
La liste déroulante
Image non disponible
La gomme

2-C. Le champ Texte

Ce type de champ peut recevoir n'importe quel type de données simples (texte, date, nombre).

Image non disponible

Si vous double cliquez sur un champ de formulaire, vous ouvrez la boîte de dialogue relative aux propriétés de ce champ.

Image non disponible

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.

Image non disponible

Vous pouvez définir un texte par défaut pour votre champ.

Image non disponible

Avec comme résultat :

Image non disponible

Vous pouvez également déterminer quelle sera la taille de votre champ ainsi que la casse qui sera utilisée pour afficher le texte.

Image non disponible

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.

Image non disponible

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).

Image non disponible

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".

Image non disponible

Ce qui apparaît dans la barre d'état :

Image non disponible

2-D. La Case à cocher

Image non disponible

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.

Image non disponible

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.

Image non disponible

Vous avez le choix pour la valeur par défaut de votre contrôle.

Image non disponible

Et les propriétés traditionnelles pour l'activation des macros, sur l'entrée ou la sortie du contrôle.

Image non disponible

La dernière zone contient les mêmes propriétés que le champ texte.

2-E. La liste déroulante

Image non disponible

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.

Image non disponible

La liste est peuplée élément par élément.

Image non disponible

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.

Image non disponible Image non disponible

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.

Image non disponible

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".

Image non disponible

Ce bouton ouvre un volet contenant plusieurs options.

Image non disponible

La partie qui nous intéresse est la seconde "Restriction des modifications".

Image non disponible

Après avoir coché vous pouvez choisir le type de limitation qui vous souhaitez appliquer à votre document.

Vous devez ensuite activer la protection

Image non disponible

Vous pouvez utiliser un mot de passe mais ce n'est pas obligatoire.

Image non disponible

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.

Image non disponible

Après avoir ajouté des sections supplémentaires à votre document, vous pouvez choisir les sections auxquelles va s'appliquer la restriction.

Image non disponible
Image non disponible

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.

Image non disponible

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.

Image non disponible

Pour le champ CP, nous allons limiter la taille du champ à 5 caractères.

Image non disponible

Pour les civilités, nous allons utiliser des cases à cocher, une par civilité.

Image non disponible

La date de naissance sera entrée dans une zone de texte mais de type date.

Image non disponible

Et finalement, le nombre d'enfants sera choisi dans une liste d'éléments.

Image non disponible

Nous allons ajouter un saut de section continu à la fin de notre formulaire pour permettre l'utilisation d'un texte libre.

Image non disponible

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.

Image non disponible

Le résultat d'une sauvegarde est un fichier txt sous format csv.

Image non disponible

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.

Image non disponible

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, ...

Image non disponible

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.

 
Sélectionnez

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.

Image non disponible

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.

Image non disponible

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.

Image non disponible

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.

 
Sélectionnez

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.

 
Sélectionnez

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 :

Image non disponible

Si nous exécutons le code une seconde fois, les éléments sont à nouveau ajoutés à la liste.

Image non disponible

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.

 
Sélectionnez

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.

Image non disponible

Nous allons entrer la liste des pays manuellement.

  • Belgique
  • France
  • Suisse
Image non disponible

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.

 
Sélectionnez

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.

Image non disponible Image non disponible Image non disponible

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.

 
Sélectionnez

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

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

ActiveDocument.FormFields(4).CalculateOnExit = True

Cette propriété est en lecture/écriture

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

    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
 
Sélectionnez

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.

Image non disponible
 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

With ActiveDocument.FormFields(4)
    .OwnHelp = True
    .HelpText = "MonMessage"
End With
Image non disponible

Elle permet d'afficher le texte d'aide lorsque l'utilisateur presse la touche F1.

Image non disponible

5-B-7. Name

Cette propriété permet de récupérer ou de modifier le nom d'un champ de formulaire.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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é.

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

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.