Developpez.com - Word
X

Choisissez d'abord la catégorieensuite la rubrique :


Interaction entre l'utilisateur et le document

Date de publication : 10 juillet 2010

Par Olivier Lebeau (Heureux-oli sur DVP)
 

Dans ce tutoriel, vous apprendrez comment gérer et mettre en place une interraction entre l'utilisateur et un document.

       Version PDF (Miroir)   Version hors-ligne (Miroir)
Viadeo Twitter Facebook Share on Google+        



1. Introduction
2. Le champ ASK
3. Les InputBox
4. Les UserFoms
4-A. Les contrôles
4-A-1. L'intitulé ou "Label"
4-A-2. La Zone de texte ou "TextBox"
4-A-3. Zone de liste modifiable ou "ComboBox"
4-A-4. Zone de liste ou "ListBox"
4-A-5. Case à cocher ou "CheckBox"
4-A-6. Bouton d'option ou "OptionButton"
4-A-7. Bouton à bascule ou "ToggleButton"
4-A-8. Cadre ou "Frame"
4-A-9. Bouton de commande ou "CommandButton"
4-A-10. Contrôle Multipage
4-A-11. Toupie ou "SpinButton"
4-A-12. Image
4-B. Les évènements
4-C. Les propriétés
4-E. Mise en ordre des contrôles
4-F. La pratique
4-F-1. Un UserForm pour afficher les propriétés du document
4-G. Les contrôles ActiveX
5. Remerciements


1. Introduction

Bon nombre de questions sont basées sur la méthode à utiliser pour dialoguer avec l'utilisateur lors de la création d'un nouveau document ou lors de l'ouverture d'un document existant.

Plusieurs méthodes sont utilisables, on peut citer les champs ASK, qui vont demander des informations au travers d'une boîte de dialogue, les InputBox (Boîtes de dialogue) qui peuvent être mise en place avec une macro ou encore un UserForm qui est une façon un peu plus élaborée de "dialoguer" avec l'ustilisateur.

Les captures d'écran sont issues de la version 2010, mais le principe reste le même pour les versions antérieures de Word.


2. Le champ ASK

Le champ ASK fait parties des champs que l'on peut utiliser en Word, les champs ne nécessitent aucune connaissance en programmation, ils sont utilisables directement depuis l'interface graphique.

Pour insérer un champ "Demander" ou "Ask", il est plus facile d'utiliser l'interface graphique, elle évite les éventuelles erreurs de saisie.

Vous pouvez utiliser autant de champs Ask que vous le souhaitez, mais n'abusez pas de cette méthode, elle risque de lasser très rapidement les utilisateurs.

Pour insérer un champ Ask, vous devez allez dans l'onglet Insertion et le groupe Texte. La commande se trouve sous le bouton QuickPart.

Vous obtenez une boîte de dialogue contenant les différents champs qu'il est possible d'insérer en Word. Notre champ Ask se trouve dans la catégorie Publipostage.

Une boîte de dialogue vous est proposée pour lajout de ce champ.

Nous utiliserons trois parties de ce champ.

  1. Le texte qui sera affiché dans la boîte de dialogue "Ask".
  2. Le signet qui sera utilisé. Si le signet existe déjà, il sera déplacé au point d'insertion (endroit où se trouve le curseur de la souris).
  3. Le texte qui sera affiché si l'utilisateur n'entre pas de texte.
Pour afficher le résultat, vous devez utiliser un champ REF qui fera référence au signet que vous avez choisi pour votre champ ASK.

Et le résultat :

Lorsque l'utilisateur va ouvrir le document, la boîte de dialogue sera affichée et le résultat sera visible dans le champ REF.

Pour le champ REF, nous allons utiliser la même méthoque que pour le champ ASK.

Ce champ se trouve dans la partie Liaisons et renvois, il ne reste que le signet à sélectionner, dans l'exemple, c'est S1.

Si vous souaitez recommencer le remplissage, vous devez demander à Word d'actualiser les champs par la combinaison de touches Ctrl + A pour sélectionner le document et ensuite F9 pour actualiser les champs.

info Les champs ASK doivent se trouver dans le document, si vous les insérez dans l'entête ou le pied de page, ils sont inutilisables dans le document.

3. Les InputBox

Pour utiliser les InputBoxes, vous allez devoir utiliser du VBA. ce sont des objets que l'on utilise en programmation. Les InputBoxes ne sont pas modifiables, ils ne contiennent qu'une zone de texte, des boutons que l'on peut choisir et une "icône".
Il est malgré tout possible d'utiliser les InputBoxes avec des contrôles supplémentaires, vous trouverez quelques informations dans ce tutoriel.

Pour adresser du texte dans un document, la méthode la plus facile reste le signet. Vous devrez donc préparer votre document en y ajoutant des signets qui recevront les données collectées par votre code.

Si vous n'avez jamais fait de VBA, je vous conseille de lire ce tutoriel qui s'adresse aux débutants.

Pour ouvrir le VBE (Visual Basic Editor) qui est léditeur de code VBA, vous avez plusieurs possibilité, mais celle que je retiens est la combinaison de touches Alt + F11.

idea Je vous conseille de créer un modèle, de cette manière, le document original ne risque pas d'être altéré par une mauvaise manipulation d'un de vos utilisateurs.
Dans la fenêtre Explorateur de projets de l'éditeur, nous obtenons ceci :

Un double clic sur ThisDocument va ouvrir la fenêtre d'édition

Avant
Après
C'est dans cette fenêtre que nous allons saisir notre code.
Comme nous souhaitons que le code s'exécute dès la création d'un nouveau document, nous allons utiliser l'èvenement New. Cet évènement se produit lors de la création d'un nouveau document basé sur notre modèle.

warning Veillez à ce que le code soit inséré dans le module de votre modèle, si le code se trouve dans le modèle normal, il sera exécuté à chaque création d'un nouveau document, ce qui provoquera imanquablement des erreurs.
Pour utiliser les évènements liés aux documents, le plus simple est de choisir l'objet document dans la liste déroulante.

Choix de l'objet
En principe l'évènement qui est pris par défaut sera New.

Si ce nest pas le cas et que vous souhaitez ne pas faire d'erreur, vous pouvez choisir l'évènement lié à cet objet dans la liste déroulante de droite.

Nous voilà prêt pour l'écriture de notre code.

La fonction InputBox renvoie une valeur, si vous ne souhaitez pas traiter cette valeur après sa saisie, il suffit de l'adresser directement au signet de votre document, dans le cas contraire, vous serez amené à l'affecter à une variable.
Sans variable

Private Sub Document_New()

ActiveDocument.Bookmarks("S1").Range.Text = InputBox("Entrez une valeur qui sera insérée sur le signet S1")

End Sub
Si vous préférez utiliser des variables. Je ne vous conseille l'utilisation des variables que si vous les traitez. Comme dans le cas d'une date, vous pouvez tester si c'est une date et si elle est postérieure à la date du jour.
Avec variable

Private Sub Document_New()
'Déclaration des variables
Dim stMaPremiereReponse As String

'Affectation de la valeur à la variable
stMaPremiereReponse = InputBox("Entrez une valeur qui sera insérée sur le signet S1")

'Affectation du contenu de la variable au signet
ActiveDocument.Bookmarks("S1").Range.Text = stMaPremiereReponse

End Sub
Le code peut contenir de nombreux InputBoxes, ils seront traités dans le même ordre que le code. Vous pouvez utiliser des boucles ou des conditions dans votre code.
Exemple avec condition

Private Sub Document_New()
'Déclaration des variables
Dim stMaPremiereReponse As String
'Etiquette
ici:
'Affectation de la valeur à la variable
stMaPremiereReponse = InputBox("Entrez une valeur qui sera insérée sur le signet S1")
'Si aucun texte n'est entré, on retourne vers l'étiquette
If Len(stMaPremiereReponse) = 0 Then GoTo ici


End Sub
Nous allons en profiter pour découvrir ce que peut faire un InputBox. Vous aurez remarqué qu'il contient deux boutons, qu'il possède une barre de titre. Il est en outre possible de le positionner.

Les boutons
Il possède deux boutons, Ok et Annuler. Le bouton OK sert à valider. Le bouton Annuler lorsqu'il est utilisé va renvoyer une chaîne de longueur nulle, il ne va en aucun cas mettre un terme à la procédure.

Le texte ou Prompt
Le texte de votre InputBox est une chaîne de caractère qui ne peut dépasser 1024 caractères. Lorsque vous souhaitez utiliser plusieurs lignes, vous devez insérer des Retours à la ligne (Carriage Return) par l'insertion de Chr(13) ou vbCrLf.

Le titre
Par défaut, le titre de votre InputBox est Microsoft Word. Vous pouvez changer ce titre par un titre personnel.

Valeur par défaut
Il est possible de spécifier une valeur qui sera affichée par défaut dans votre InputBox.

La position
Si vous ne spécifiez pas de valeurs pour les arguments xpos et ypos, votre InputBox sera centré sur l'écran.

Nous allons illustrer ces possibilités par un petit exemple et réutiliser les valeurs introduites. Pour chaque InputBox affiché, nous allons récupérer les valeurs des précédents pour les afficher, nous nous limiterons à trois objets. Les données récoltées seront insérées dans une table qui contiendra une ligne de 3 cellules.
Petit exemple

Sub MesInputsBoxes()
'Déclaration des variables
'Les trois titres
Dim stTit01 As String, stTit02 As String, stTit03 As String
'Le texte entré concaténé
Dim stTextIn As String
'Le texte de chaque InputBox
Dim stTemp As String
'Les trois prompts
Dim stText01 As String, stText02 As String, stText03 As String
'La table
Dim oTbl As Table

'Affectation de la table
Set oTbl = ActiveDocument.Tables.Add(Range:=Selection.Range, NumRows:=1, numcolumns:=3)
With oTbl
    .Borders(wdBorderBottom).LineStyle = wdLineStyleSingle
    .Borders(wdBorderLeft).LineStyle = wdLineStyleSingle
    .Borders(wdBorderRight).LineStyle = wdLineStyleSingle
    .Borders(wdBorderTop).LineStyle = wdLineStyleSingle
    .Borders(wdBorderHorizontal).LineStyle = wdLineStyleSingle
    .Borders(wdBorderVertical).LineStyle = wdLineStyleSingle
End With

'Initialisation des vriables texte
stTextIn = "Vous avez entré : " & vbCrLf
'Les titre de nos Inputboxes
stTit01 = "Entrez un premier texte !"
stTit02 = "Entrez un second texte !"
stTit03 = "Entrez un troisième texte !"
'Le text des Inpuboxes
stText01 = "Entrez votre premier texte  "
stText02 = "Entrez votre deuxième texte  "
stText03 = "Entrez votre dernier texte  "

'Premier InputBox
stTemp = InputBox(stText01)
oTbl.Cell(1, 1).Range.Text = stTemp
'Concaténation du résultat
stTextIn = stTextIn & vbCrLf & stTemp

'Deuxième InputBox
stTemp = InputBox(stTextIn & vbCrLf & vbCrLf & stText02)
oTbl.Cell(1, 2).Range.Text = stTemp
'Concaténation du résultat
stTextIn = stTextIn & vbCrLf & stTemp

'Dernier InputBox
stTemp = InputBox(stTextIn & vbCrLf & vbCrLf & stText03)
oTbl.Cell(1, 3).Range.Text = stTemp
'Concaténation du résultat
stTextIn = stTextIn & vbCrLf & stTemp

'Affichage du résultat
MsgBox stTextIn

'Libération des objets
Set oTbl = Nothing



End Sub
Ce code même s'il est long reste très simple à la lecture.

Si vous avez utilisé l'exemple ci-dessus, vous aurez certainement remarqué que ce n'est pas très convivial. Les Inputboxes à répétition sont lassantes et il n'est pas facile de changer les données de la premère boîte après l'avoir validée. La vraie solution pour un "dialogue" avec l'utilisateur est le UserForm. Les données restent disponibles pour modification tant que l'ensemble n'a pas été validé, ce qui représente un gros avantage.


4. Les UserFoms

warning Les UserForms ne doivent pas être confondu avec les formulaires. Ce sont deux choses totalement différentes.
Les UserForms sont des objets VBA que l'on insére et modifie via l'interface VBE (Visual Basic Editor). L'ajout d'un UserForm à votre projet est très facile, séléctionnez le projet.

Dans le menu Insertion, choisissez UserForm.

Vous avez maintenant un UserForm dans votre projet.

Lorsque vous affichez le UserForm, il est accompagné de sa Boîte à outils. Ce sont eux qui vont nous permettre d'ajouter des contrôles sur notre UserForm.
La manipulation pour ajouter un contrôle à un UserForm est assez simple, il suffit de cliquer sur le contrôle souhaité et de le dessiner à la souris sur le UserForm.

Et lorsque l'on relâche la souris, notre contrôle est dessiné sur le UserForm.

info Les valeurs contenues dans les contrôles sont volatiles, quand le UserForm est fermé, toutes les données sont perdues. Si vous ne les enregistrez pas, vous ne pourrez plus les utiliser.

4-A. Les contrôles


4-A-1. L'intitulé ou "Label"

Ce contrôle est principalement utilisé pour afficher des informations, il n'est pas statique, les données qu'il affiche peuvent être mise à jour, mais n'est pas interractif, il n'est pas possible d'y effectuer une saisie.
Ce contrôle réagit à certains évènements comme le clic.

La propriété qui permet de modifier le texte affiché par ce contrôle est "Caption", on accède à cet objet en utilisant l'objet parent qui est le UserForm.

UserForm1.Label1.Caption = "Le texte de mon étiquette"
VBA permet un accès plus rapide lorsque l'on se trouve dans le module dépendant d'un d'objet d'utiliser "Me" pour faire directement référence à cet objet.
Si le code que l'on utilise se situe dans le module du document, on fera référence au sous objet en utilisant l'objet parent.

Sub Document_Open()
UserForm1.Label1.Caption = "Venant du code du document"
End Sub
Alors que si le code se trouve dans le module du UserForm, on fera référence à "Me".

Private Sub UserForm_Click()
Me.Label1.Caption = "Mon étiquette"
End Sub
Sur un évènement

Private Sub Label2_Click()
Me.Label1.Caption = "Vous avez cliqué sur l'étiquette 2 !"
End Sub

4-A-2. La Zone de texte ou "TextBox"

Ce contrôle est interactif, il peut être utilisé pour afficher ou pour saisir des données, il réagit à certains évènement comme la mise ajour, le clic, ...

Pour y injecter des données, on utilise la propriété .Text

Me.TextBox1.Text = "Mon texte"
On uilise la même propriété pour récupérer le texte qui a été introduit par l'utilisateur ou inséré par code.

Debug.Print Me.TextBox1.Text = "Mon texte"
Les TextBoxes réagissent aux évènements. L'évènement que j'utilise le plus est Controle_AfterUpdate, il se produit lorqu'une modification du contenu du contrôle a été effectuée.
L'évènement proposé par défaut lors d'un double clic sur le contrôle est Controle_Change, il se produit lors de chaque changement de donnée dans le contrôle. Si vous entrez un texte, il se produira à chaque ajout ou suppression de caractère.


4-A-3. Zone de liste modifiable ou "ComboBox"

Les listes modifiables permettent de proposer aux utilisateurs de faire un choix parmis les éléments qui la composent. En fonction de valeur donnée à la propriété MatchRequired (True ou False), si cette valeur est True, on impose à l'utilisateur que l'élément saisi soit présent dans la liste, dans le cas contraire, la saisie est libre.

Par défaut, les listes sont vides, les éléments qui la composent sont ajoutés à l'aide du code. Il y a deux méthodes pour ajouter des éléments à la lsite, soit on ajoute chaque élément séparément, soit on utilise un tableau.
Dans la majorité des cas, on utilise l'évènement Initialize du UserForm.

Pour ajouter des éléments un par un il suffit de répéter la même ligne en changeant l'argument.
Avec une liste

Private Sub UserForm_Initialize()
'Ajout des éléments dans la liste
Me.ComboBox1.AddItem "AAA"
Me.ComboBox1.AddItem "BBB"
Me.ComboBox1.AddItem "CCC"
Me.ComboBox1.AddItem "DDD"

End Sub
Avec un tableau

Private Sub UserForm_Initialize()
Dim myTbl() As String

ReDim myTbl(4)

myTbl(1) = "AAA"
myTbl(2) = "BBB"
myTbl(3) = "CCC"
myTbl(4) = "DDD"
myTbl(0) = "ZZZ"

Me.ComboBox1.List() = myTbl

End Sub
Cette méthode peut être utilisée avec des tableau multidimentionels, dans ce cas, vous devez spécifier le nombre de colonnes que vous souhaitez dans votre contrôle. Cette opération peut être réalisée par le VBE ou dans votre code.

Par le code

Private Sub UserForm_Initialize()
'Déclaration des variables
Dim myTbl(4, 1) As String

'Remplissage du tableau
myTbl(1, 0) = "AAA"
myTbl(2, 0) = "BBB"
myTbl(3, 0) = "CCC"
myTbl(4, 0) = "DDD"
myTbl(0, 0) = "ZZZ"
myTbl(1, 1) = "a-a-a"
myTbl(2, 1) = "b-b-b"
myTbl(3, 1) = "c-c-c"
myTbl(4, 1) = "d-d-d"
myTbl(0, 1) = "z-z-z"

'Définition du nombre de colonnes et de leur largeur
With Me.ComboBox1
    .ColumnCount = 2
    .ColumnWidths = "2 cm; 2 cm"
End With
    
'Remplissage du contrôle
Me.ComboBox1.List() = myTbl

End Sub
Le résultat avec nos deux colonnes.

La valeur choisie ou introduite est récupérée avec la propriété Value du contrôle. Il est possible d'utiliser un évènement pour traiter la valeur ou de la traiter à par la suite.

Si l'on souhaite récupérer la valeur lorsque le contenu du Combo change, nous utiliserons l'évènement Change.

Private Sub ComboBox1_Change()
Debug.Print Me.ComboBox1.Value
End Sub
info Je vous déconseille cet évènement si la propriété MatchRequired est à True.
Si vous avez otpé pour une liste à deux colonnes, la propriété value renvoie l'élément contenu dans la colonne "BoundColumn". Si vous souhaitez récupérer une autre valeur, c'est la propriété Column() que vous utiliserez.

Private Sub ComboBox1_AfterUpdate()
'Récupération de la valeur contenue dans la 
'seconde colonne
Me.TextBox1 = Me.ComboBox1.Column(1)
End Sub
info Le première colonne est la colonne 0

4-A-4. Zone de liste ou "ListBox"

Il existe peu de différences entre une Zone de liste modifiable (ComboBox) et un Zone de liste. Dans une Zone de liste, il n'est pas possible d'utiliser une valeur qui ne se trouve pas dans la liste. La surface occupée par une Zone de liste est plus importante que pour une Zone de liste modifiable.
La liste est remplie de la même manière que pour une Zone d liste Modifiable.
Avec une liste

Private Sub UserForm_Initialize()
'Ajout des éléments dans la liste
Me.ListBox1.AddItem "AAA"
Me.ListBox1.AddItem "BBB"
Me.ListBox1.AddItem "CCC"
Me.ListBox1.AddItem "DDD"

End Sub
Comme pour la zone de liste modifiable, nous pouvons utiliser un tableau à une dimension.
Avec un tableau

Private Sub UserForm_Initialize()
Dim myTbl() As String

ReDim myTbl(4)

myTbl(1) = "AAA"
myTbl(2) = "BBB"
myTbl(3) = "CCC"
myTbl(4) = "DDD"
myTbl(0) = "ZZZ"

Me.ListBox1.List() = myTbl

End Sub
Ou encore un tableau à deux dimensions
Avec un tableau deux dimensions

Private Sub UserForm_Initialize()
'Déclaration des variables
Dim myTbl(4, 1) As String

'Remplissage du tableau
myTbl(1, 0) = "AAA"
myTbl(2, 0) = "BBB"
myTbl(3, 0) = "CCC"
myTbl(4, 0) = "DDD"
myTbl(0, 0) = "ZZZ"
myTbl(1, 1) = "a-a-a"
myTbl(2, 1) = "b-b-b"
myTbl(3, 1) = "c-c-c"
myTbl(4, 1) = "d-d-d"
myTbl(0, 1) = "z-z-z"

'Définition du nombre de colonnes et de leur largeur
With Me.ListBox1
.ColumnCount = 2
.ColumnWidths = "2 cm; 2 cm"
End With

    
'Remplissage du contrôle
Me.ListBox1.List() = myTbl


End Sub
La récupération des données est elle aussi identique.
Récupération des données

Private Sub ListBox1_Click()
Debug.Print Me.ListBox1.Value
End Sub
Ou encore pour la seconde colonne.

Private Sub ListBox1_Click()
Debug.Print  Me.ListBox1.Column(1)
End Sub
idea Comme pour le combobox, la première colonne est la 0.

4-A-5. Case à cocher ou "CheckBox"

La case à cocher est un contrôle qui ne peut avoir que deux états, coché ou pas coché, vrai ou faux.
Elle possède une étiquette qui peut être modifiée avec la propriété Caption du contrôle.
Comme tous les contrôle présents sur un UserForm, la case à cocher réagit à certains évènements.

Les contrôles CheckBox possèdent une étiquette.

La case à cocher ne possède que deux valeurs vrai ou faux et peut être récupérée à tout moment.

Me.CheckBox1.Value

4-A-6. Bouton d'option ou "OptionButton"

Les boutons à options ont le même effet que les boutons à bascule. Lorsqu'ils sont dans un cadre, ils fonctionnent comme s'ils étaient groupés et une seul bouton peut être actif par groupe.

Commencez par placer un cadre et ensuite les Boutons d'option.

Si vous n'utilisez pas de cadre, les contrôles Boutons d'opion réagiront comme s'ils faisaient tous partie du même groupe. Pour pouvoir utiliser plusieurs "séries" de Boutons d'option, vous devrez utiliser autant de cadre que vous souhaitez avoir de groupe.

Avec plusieurs cadres, vous augmentez les choix des utilisateurs.

La valeur des boutons à bascules est récupérée bouton après bouton.

Private Sub cmdEtatBoutonsOption_Click()
'Déclaration des variables
Dim myMsg As String
'Exécution des tests
If Me.OptionButton1 Then myMsg = "Le premier bouton d'option est coché "
If Me.OptionButton2 Then myMsg = myMsg & "Le second bouton d'option est coché "
If Me.OptionButton3 Then myMsg = myMsg & "Le troisième bouton d'option est coché "
MsgBox myMsg

End Sub
info Comme la valeur du Bouton d'option est 0 ou 1, True ou False, il n'est pas nécessaire de faire un test logique.
idea Si vous déposez des contrôles boutons d'options sans utiliser de cadre, ils seront tous groupés ensembles, vous n'aurez alors qu'un seul groupe pour tout votre UserForm.

4-A-7. Bouton à bascule ou "ToggleButton"

Le bouton a bascule possède deux états enfoncé ou relaché. Ils sont comparables aux cases à cocher. La valeur renvoyée est True lorsque le bouton est enfoncé et False lorsqu'il est relaché.

Si vous affectez la valeur True à ce contrôle, il sera enfoncé.

Me.ToggleButton1 = True
La valeur est récupérée de la même manière.

Debug.Print Me.ToggleButton1

4-A-8. Cadre ou "Frame"

Le Cadre ou Frame est utilisé pour grouper ou entourer des contrôles.

Lorsqu'il est utilisé pour des boutons d'option, un seul de ces contrôles peut être coché.


4-A-9. Bouton de commande ou "CommandButton"

On pourrait dire que c'est le contrôle principal. L'évènement par défaut de ce contrôle est Clic. C'est en général ce contrôle qui est utilisé pour "valider" une action.


Private Sub CommandButton1_Click()
Debug.Print Me.ToggleButton1
Me.CommandButton1.Caption = "Validé !"

End Sub
Ce contrôle possède une étiquette qu'il est possible de modifier au travers de propriétés du contrôle ou par le code.


4-A-10. Contrôle Multipage

Avec un contrôle multipage, vous pouvez augmenter la surface utilisable de votre UserForm. En utilisant les onglets, vous pouvez accéder aux differentes pages de votre contrôle. Chaque page peut contenir plusieurs objets.


4-A-11. Toupie ou "SpinButton"

Ce contrôle est double, il comporte deux boutons, l'un en haut et l'autre en bas.

Grossis exagérément, on distingue bien ces deux parties.

Les deux évènements les plus intéressantes de ce contrôle sont SinUp et SpinDown. Ils se produisent lorsque l'utilisateur clique respectivement sur la partie du haut ou la partie du bas du contrôle.
Accouplé à un autre contôle, on peut utiliser ce SpinButton pour modifier le contenu du contrôle par incrémentation ou décrémentation.

Private Sub SpinButton1_SpinDown()
'Incrémentation
Me.TextBox1 = Me.TextBox1 - 1
End Sub
'***********************************
Private Sub SpinButton1_SpinUp()
'Décrémentation
Me.TextBox1 = Me.TextBox1 + 1
End Sub

4-A-12. Image

Ce contrôle permet l'affichage d'une image sur votre UserForm. Cette image peut être chargée au début ou en cours d'éxécution. Pour afficher une image dès le départ, il suffit de modifier la propriété.

Ou encore au travers de votre code.

Me.Image1.Picture = LoadPicture("c:\temp\b.jpg")

4-B. Les évènements

Une des principaux avantages des UserForms est la gestion des évènements. Les évènements sont en général déclenchés par l'utilisateur.
Ci dessous la liste des évènements pouvant étre déclanchés sur les différens objets d'un UserFom.

  Intitulé Zone de texte Zone de liste modifiable Zone de liste Case à cocher Bouton d'option Bouton bascule
  Label TextBox ComboBox ListBox ChekBox OptionButton ToggleButton
Activate   X          
AddControl              
AfterUpdate   X X X X X X
BeforDragOver X X X X X X X
BeforeDragOrPaste X X X X X X X
BeforUpdate   X X X X X X
Change   X X X X X X
Click X   X X X X X
DblClick X X X X X X X
DropButtonClick   X X X      
Enter   X X X X X X
Error X X X X X X X
Exit   X X X X X X
KeyDown   X X X X X X
KeyPressed   X X X X X X
KeyUp   X X X X X X
Layout              
MouseDown X X X X X X X
MouseMove X X X X X X X
MouseUp X X X X X X X
RemoveControl              
Scroll              
SpinDown              
SpinUp              
Zoom              



  Cadre Bouton de commande Contrôle Onglet Barre de défilement Toupie Image
  Frame CommandButton TabStrip ScrollBar SpinButton Image
Activate            
AddControl X          
AfterUpdate       X X  
BeforDragOver X X X X X X
BeforeDragOrPaste X X X X X X
BeforUpdate       X X  
Change       X X  
Click X X X X   X
DblClick X X X     X
DropButtonClick            
Enter X X X X X  
Error X X X X X X
Exit X X X X    
KeyDown X X X X X  
KeyPressed X X X X X  
KeyUp X X X X X  
Layout X          
MouseDown X X X     X
MouseMove X X X     X
MouseUp X X X     X
RemoveControl X          
Scroll X     X    
SpinDown            
SpinUp            
Zoom X          

Si tous les objets appartenant à un UserForm réagissent aux évènement, le UserForm réagit aussi à certains évènements.

UserForm
Activate
Addontrol
BeforDragOver
BeforeDropOrPaste
Click
DblClick
Deactivate
Error
Initialize
KeyDown
KeyPressed
KeyUp
Layout
MouseDown
MouseMove
MouseUp
QueryClose
RemoveControl
Resize
Scroll
Terminate
Zoom

4-C. Les propriétés

Le UserForm et ses contrôles possèdent des propriétés comme la couleur de fond, la couleur du texte, le texte par défaut, la taille, ...
Ces propriétés peuvent être définiess lors de la création de vos objets, mais également par le code.


4-E. Mise en ordre des contrôles

Lorsque vous déposez des contrôles sur votre UserForm, l'ordre dans lequel ils seront parcourus à l'aide du clavier correspond à l'ordre avec lequel vous les avez déposé. VBE est doté d'un outil permettant de modifier l'ordre de "tabulation" (Tab Stop Order).


4-F. La pratique

Nous allons ajouter un UserForm à un modèle et sera affiché lors de la création d'un nouveau document basé sur ce modèle.

Première étape, la création d'un document basé sur un document vierge.

Nous obtenons un document vierge. Lors de la sauvegarde, nous allons choisir "Modèle Word prenant en charge les macros (*.dotm)". Si vous optez pour un *.dotx, les macros ne pourront pas être sauvegardées dans le modèle.

idea Le modèle doit être sauvegardé avec vos autres modèles de document. Si ce n'est pas le cas, il ne sera pas disponible par la commande Fichier => Nouveau => Mes modèles.
L'étape suivant est l'ajout du UserForm et le code qui va permettre de l'afficher.

Nous allons ouvrir le VBE (Visual Basic Editor) avec la conbinaison de touches Alt + F11. Dans la fenêtre d'exploration de projet, nous avons tous les projets en cours. Dans notre cas, juste deux projets, le normal qui est présent par défaut et le projet lié à notre modèle. Un double clic sur "ThisDocument" va ouvrir la fenêtre "Code".

C'est dans cette fenêtre que nous allons saisir le code de notre projet. Le code est arrangé par "Module". Le module principal étant le module "ThisDocument".

Nous allons maintenant avant de saisir du code ajouter un UserForm à notre projet : Insertion => UserForm.

Le résultat, nous le connaissons.

Après avoir ajouté le Userform, nous allons lui donner un autre nom que "UserForm1". Pour y parvenir, nous allons modifier les propriétés des notre Form. Par défaut, la fenêtre des propriétés est affichée, si ce n'est pas le cas, l'utilisation de la touche F4 affichera ce volet.

Remplaçons le UserForm1 par Accueil pour les propriétés Name et Caption. La propriété Name est le nom de l'objet, c'est ce nom que nous utilisons pour référencer l'objet dans notre code et la propriété Caption est le texte qui figure dans la barre de titre de notre formulaire, ce titre est à l'attention des utilisateurs.

Nous allons maintenant ajouter un morceau de code à notre document pour que le UserForm soit affiché lors de la création d'un document basé sur ce modèle. Pour y parvenir, nous allons utiliser l'évènement New() du modèle.
Dans le VBE, double-cliquons sur ThisDocument du modèle pour ouvrir le module lié à notre document.
Pour ajouter un code s'exécutant sur un évènement de notre document, nous allons utiliser une fonctionnalité de VBE.
Dans la partie suppérieur de la fenêtre de code, nous avons deux "déroulants", le premier permet de choisir les objets et le second les évènements liés à l'objet choisi.

Nous obtenons deux lignes de codes :

Private Sub Document_New()

End Sub
Nous aurions pu écrire ces lignes, mais l'utilisation des outils mis à notre disposition permet d'éviter les erreurs de saisie.

Pour afficher notre UserForm, c'est très simple, nous allon simplement ajouter Accueil.Show dans notre porcédure.

Private Sub Document_New()
	Accueil.Show
End Sub
VBE est doté d'un outil IntelliSense, cet outil vous aide lors de la saisie de votre code en vous proposant les méthodes et propriétés des objets. Dans notre cas lors de la saisie, la méthode Show nous est proposée.

Si vous sauvegardez le modèle et que vous créez un nouveau document basé sur ce modèle, un UserForm vide sera affiché. Comme il ne contient rien, vous devez le fermer avec la croix du coin suppérieur droit.

Dans cet état, ce UserForm ne nous est d'aucun intérêt. Pour qu'il soit "utile", il doit comporter au moins un bouton et contrôle. Ajoutons une zone de texte, une étiquette et un bouton. Comme pour le UserForm, nous pouvons changer certaines propriétés de nos contrôle.

idea Je vous conseille de donner à vos contrôles des noms autres que les noms donnés par défaut. Comment faire lorsque le UserForm comporte 25 zones de texte nommées de TextBox1 à TextBox25.
L'étiquette va servir à donner des indications sur les fonctions des contrôles aux utilisateurs.

Pour éviter que l'étiquette ne soit séparée de son contrôle, VBE nous donne la possibilité de grouper les contrôles. C'est ce que nous allons faire. À l'aide de la souris et de la touche Ctrl du clavier, nous sélectionnons les deux contrôles.

Ensuite, par le menu Format et Grouper, nos pouvons grouper ces deux contrôles.

Nous obtenons un groupe de deux contrôles.
Modifions maintenant le contenu de l'étiquette, le nom a peu d'importance, mais peut être changé à votre convenance.

Même après avoir été groupes, les contrôles restent accessibles individuellement.

Passons maintenant à notre bouton de commande, changeons trois choses, le nom (Name), le texte affiché (Caption) et la propriété activé (Enabled). Pour le nom, comme c'est un bouton de commande, il est recommandé de faire précéder le nom de "cmd", de cette manière, nous savons que nous avons affaire à un bouton de commande. Le texte affiché dans le bouton doit donner une indication aux utilisateurs.


Nous avons mis la propriété Enabled du bouton à False, ce qui rend ce bouton inactif. Pour rendre ce bouton actif, nous allons utiliser un peu de code, il ne deviendra actif qu'après avoir effectué une saisie dans la zone de texte.
La méthode lap lus facile pour ajouter du texte à un contrôle est de double cliquer sur le contôle, la fenêtre de code apparaît avec un procédure lié à ce contrôle. Si vous double cliquez sur la zone de texte, vous obtenez ceci :

Ajoutons une ligne de code permettant l'activation du bouton de commande


Private Sub txtEntree_Change()
Me.cmdFini.Enabled = True

End Sub
Un réflexe que vous devez acquérir est l'ajout de commentaire dans votre code, ils vous seront très utiles.

Private Sub txtEntree_Change()
'Activation du bouton de commande
Me.cmdFini.Enabled = True

End Sub
Testons notre UserForm, il n'est pas nécessaire de passer par la création d'un nouveau document pour afficher le UserForm, on peut l'exécuter au départ du VBE.
Vous affichez le formulaire et en cliquant sur le bouton Exécuter ou la touche F5.
Dès que vous aurez commencé une saisie dans le zone de texte, le bouton deviendra actif.

Pour l'instant, un clic sur le bouton ne produit aucune action, nous allons éditer le bouton.
Pour fermer le UserForm, vous devez cliquer sur la croix dans le coin supérieur droit du UserForm.

Pour revenir à la fenêtre de code, il suffit de cliquer dans l'éditeur sur le bouton code.

Dans la liste de gauche, nous allons choisir notre bouton cmdFini. Tous les objets de notre UserForm sont disponibles dans cette liste. Une nouvelle procédure est ajoutée à notre projet.

Private Sub cmdFini_Click()

End Sub
Nous nous contenterons de fermer le formulaire.

Private Sub cmdFini_Click()
'Fermeture du UserForm
Accueil.Hide

End Sub
Si nous exécutons notre formulaire, après avoir saisi des données dans la zone de texte, une action sur le bouton permet de fermer le formulaire.

Les contrôles peuvent avoir une interaction entre-eux sur les données, nous allons ajouter trois contrôles TextBox supplémentaires à notre UserForm. Deux pour introduire des données et le troisième pour afficher un résultat.

Pour nommer vos contrôles, c'est assez logique, le premier contrôle va recevoir le premier nombre, je l'ai donc appelé txtNbr1 et par analogie, le second est txtNbr2, le dernier va recevoir le résultat de la somme des deux premiers, je l'ai donc appelé txtResult.

info Même si ça ne pose en général pas de problème, évitez d'utiliser les lettres accentuées dans le nom de vos contrôles.
Ajoutons du code pour obtenir le résultat. Avec deux contrôles, il est préférable de mettre du code sur les deux contrôles. Si nous ne mettons du code que sur un des deux contrôles, nous n'aurons un resultat qu'après la saisie dans ce contrôle.
Nous allons donc ajouter du code aux deux contrôles.

Private Sub txtNbr1_Change()
'Obtenir la somme
Me.txtResult = Me.txtNbr1 + Me.txtNbr2
End Sub

Private Sub txtNbr2_Change()
'Obtenir la somme
Me.txtResult = Me.txtNbr1 + Me.txtNbr2
End Sub
Dans l'état actuel de votre UserForm, ce n'est pas une addition mais une concaténation qui se produit. Pour pouvoir faire une addition, nous avons besoin de nombres, VBA dispose d'outils de conversion qui permettent de convertir des "chaînes" en nombre pour autant que ce soit possible.

Private Sub txtNbr1_Change()
'Obtenir la somme
Me.txtResult = CDbl(Me.txtNbr1) + CDbl(Me.txtNbr2)
End Sub
Les choses n'étant pas simple, si nous utilisons ce code sans aucun autre changement, nous obtenons une erreur de compatibilité de type. En effet, le TextBox txtNbr2 est vide et ce n'est pas compatible avec une fonction de conversion.
Une des solutions est de mettre une valeur par défaut au contrôle et dans le cas d'une addition, le 0 est neutre, nous allons modifier la propriété Value de notre contrôle en lui mettant 0 comme valeur.

Cette action doit être répétée pour le second contrôle.
Cette fois, c'est bien une addition que nous obtenons.

Puisque nous travaillons avec des nombres, nous allons utiliser un contrôle particulier : la Toupie (SpinButton). L'utilisation de ce contrôle va nous permettre d'incrémenter ou de décrémenter nos nombres.
Vous pouvez les disposer n'importe où sur votre formulaire, il est plus logique de les déposer près du contrôle qui sera influencé par son action.

Cette toupie réagit aux évènements que nous allons exploiter.
Deux évènements nous intéressent, SpinUp et SpinDown qui correspondent à un clic sur le bouton du dessus ou sur le bouton du dessous.

Une action sur le haut de ce bouton va incrémenter d'une unité la valeur contenue dans notre txtNbr1.

Private Sub SpinButton1_SpinUp()
'incrémentation de la valeur de txtNbr1 de une unité
Me.txtNbr1 = Me.txtNbr1 + 1

End Sub
		
Une action sur le bas du bouton va décrémenter d'une unité la valeur contenue dans notre txtNbr1.

Private Sub SpinButton1_SpinDown()
'décrémentation de la valeur de txtNbr1 de une unité
Me.txtNbr1 = Me.txtNbr1 - 1

End Sub
En plus de modifier la valeur contenue dans notre TextBox, l'évènement Change du TextBox est déclenché, ce qui met à jour le résultat dans txtEntree.


4-F-1. Un UserForm pour afficher les propriétés du document

Lançons nous dans la réalisation d'un formulaire pour afficher les propriétés du document et en ajouter.


4-G. Les contrôles ActiveX

En plus des contrôles standards, les UserForms peuvent recevroides contrôles ActiveX. Ces contrôles sont utilisables par toutes les applications prenant en charge le VBA. Le plus connu est le contrôle calendrier.

Pour ajouter des contrôles supplémentaires, allez dans le menu Outils => Contrôles supplémentaires.

Dans la liste des contrôles, cherchez Microsoft Date and Time picker.

Vous obtenez un nouveau contrôle dans votre boîte à outils.

La méthode pour l'insérer ne diffère pas des autres contrôles.


5. Remerciements



               Version PDF (Miroir)   Version hors-ligne (Miroir)

Valid XHTML 1.0 TransitionalValid CSS!

Copyright © 2010 Olivier Lebeau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.

Responsables bénévoles de la rubrique Word : Pierre Fauconnier - Arkham46 -