11 juin 2010

Microsoft Office Word: Utilisation des formulaires

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.

Le champ texte
La case à cocher
La liste déroulante
La gomme
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".

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.

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

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.

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

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

idea 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
info 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.

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

warning 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
warning 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
info 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

Aucun commentaire:

Enregistrer un commentaire