# Macros-commandes VBA/Création de Formulaire

Un Userform (également appelé formulaire dynamique), permet de réaliser des interfaces utilisateurs simples et conviviales pour la saisie, la modification ou la visualisation de données. Nous allons dans ce chapitre expliquer le fonctionnement de base de la création de formulaire à l’aide de plusieurs exemples.

## Généralités
### Définition du formulaire

Un formulaire est un document conçu avec une structure et un format qui permettent de faciliter la lecture, la capture, l’organisation et la modification des informations à saisir ou à afficher. Il existe 2 types de formulaires :
* Les formulaires imprimés sur papier (formulaires statiques) qui contiennent des mises en forme, des étiquettes et des espaces vides pour écrire des données. Vous pouvez utiliser Excel et les modèles Excel pour créer des formulaires imprimés.
* Les formulaires affichés à l'écran (formulaires dynamiques) qui contiennent des mises en forme, des étiquettes, des objets de saisie et des espaces vides pour renseigner, cocher ou sélectionner des données et qui peuvent surtout réagir aux actions de l’utilisateur (clic, déplacement, ...). Vous pouvez utiliser VBA Excel pour créer des formulaires affichés.

### Types de formulaires dynamiques Excel

Vous pouvez créer 2 types de formulaires dans Excel : formulaires utilisateurs (userforms) ou feuilles de calcul (sheets). Les 2 types peuvent contenir des contrôles de formulaire et des contrôles ActiveX ainsi que le code VBA qui leur est associé. Vous pouvez utiliser chaque type de formulaire de manière autonome, ou les combiner de différentes façons pour créer une solution qui vous convienne. Nous allons dans ce chapitre étudier les formulaires utilisateurs VBA.

### Un peu de vocabulaire autour des formulaires

Dans le module Userform (formulaire), toutes les procédures sont des actions répondant à des actions sur des objets nommés contrôles ActiveX (formulaire, bouton, boite de texte, case à cocher, liste déroulante, …) inclus dans le formulaire. Ce formulaire présentant en outre un ensemble de propriétés , de méthodes et répondant à des événements :
* Name : permet de définir le nom du formulaire
* Caption : permet de définir le titre du formulaire
* Minimize : rapetisse le formulaire
* Load : charge en mémoire et ouvre le formulaire
* Show : affiche le formulaire
* Change : permet de déclencher des actions sur changement intervenu sur le formulaire
* Initialize : permet de déclencher des actions sur chargement du formulaire
* Activate : permet de déclencher des actions sur activation du formulaire
* Close : permet de déclencher des actions sur fermeture du formulaire

## Création de l'interface
### Accès à l'éditeur Visual Basic

Avant de créer l'interface de notre formulaire, l'utilisateur devra, en se positionnant sur l'onglet développeur du fichier EXCEL sur lequel il se trouve, 'ouvrir la fenêtre VBA'. Il pourra également utiliser le raccourci Alt + F11.

### Insertion du formulaire

Une fois la fenêtre VBA ouverte, l'utilisateur pourra créer un userform (formulaire), via insertion puis user form.
Il récupère alors un 'Userform vierge' qui apparait qu’il va personnaliser en fonction de ce qu’il veut effectuer avec ce formulaire (saisie de données, contrôles des données, proposition à l’utilisateur…). Cette personnalisation va notamment s’effectuer via 'les propriétés' et 'la boite à outils'.

### Les propriétés

Grâce aux propriétés du formulaire, il est possible de modifier un certain nombre de choses. Par souci de simplicité, nous n’abordons que quelques propriétés du formulaire dans cette leçon mais sachez qu’il en existe beaucoup d’autres. Nous aborderons les propriétés les plus courantes telles que :
* Name
* Caption
* Font
* Backcolor – Bordercolor - Border style
* Picture

#### Pour afficher les propriétés

Pour 'afficher les propriétés', dans la même logique qu’avec Excel ou Windows, je place mon curseur sur le UserForm, j’effectue un clic droit et je vais afficher les propriétés.La fenêtre de propriété du UserForm s’affiche à droite en dessous de notre fenêtre projet, une multitude de propriété apparait.
Par souci de simplicité, nous ne présentons que quelques illustrations de l’utilisation des propriétés les plus utilisées permettant d’apporter plus d’esthétique (police, couleur…), mais également plus d'interactivité avec l'utilisateur.

#### Name

La propriété name correspond au nom de l’objet, c’est ce nom que l’on va utiliser dans notre code pour appeler l’objet.
De manière générale, et par souci d’efficacité, il est recommandé de nommer les objets en expliquant à quoi ils servent. Dans l’exemple que nous avons choisi, le formulaire va permettre à l’utilisateur l’allocation d’une charge de travail de chaque acteur en fonction du projet sur lequel il travaille. Il est donc recommandé de renommer le UserForm1 de base par UserFormProjet. Ce simple nommage permettra à l’utilisateur de s’y retrouver beaucoup plus facilement dans son code par la suite, de gagner du temps et d’éviter de nombreuses erreurs d’inattention.
La propriété Name peut aussi s'appliquer sur la propriété Parent de l'objet. Par exemple dans Excel :

#### Caption

La propriété caption permet à l’utilisateur de modifier le titre de son formulaire. Là encore, il est fortement recommandé à l’utilisateur de respecter une certaine cohérence. Toujours avec notre même exemple de formulaire pour la saisie de projet :

#### Font

Cette propriété va permettre à l’utilisateur de modifier la police de la caption que nous avons abordée précédemment. L’utilisateur va ainsi avoir la possibilité de choisir un type de police particulier, sa taille, si cette police sera en italique, en gras … Il suffit de se positionner sur font dans les propriétés, puis d’appuyer sur le bouton qui apparait à l’extrémité droite de la ligne.
Une fois cette étape effectuée, une boite de dialogue « police » apparait, il vous suffit ensuite de choisir la police qui vous convient.

#### Backcolor – Bordercolor - Border style

Ces trois propriétés vont permettre à l’utilisateur de modifier à sa guise la couleur de fond du formulaire, la couleur de la bordure mais également le style de la bordure. Ces trois propriétés sont très utiles quand vous voulez donner une esthétique recherchée à votre formulaire. Ces propriétés fonctionnent de la même façon que la propriété Font, en effet, il suffit de se placer sur la ligne de ces propriétés, cliquer sur le bouton qui apparait à l’extrémité droite, puis une liste de choix apparait.
La taille 0 correspond à une bordure invisible alors que la taille 1 correspond à une bordure simple.

#### Picture

Pour aller encore plus loin dans l’esthétisme, vous avez également la possibilité de placer une photo en image de fond de votre formulaire. Il suffit de se placer dans le propriété Picture, cliquer sur le bouton placé à l'extrémité de la ligne.
Une fois cette manipulation effectuée, une boite de dialogue charger une image apparaitra, il vous suffira alors d’aller chercher dans vos dossiers l’image que vous souhaitez sélectionner en image de fond pour votre formulaire.
Voilà à quoi ressemble votre formulaire une fois que vous avez effectué toutes ces modifications, simplement en ayant modifié quelques propriétés.

#### ControlSource

Cela permet de lier un champ du formulaire à une cellule d'une feuille qui existe dans le classeur. Le champ affichera donc la valeur de la cellule, puis sur libération il lui donnera sa nouvelle valeur (synchronisation).
Ex : Feuil1!A1.
* Si la cellule contient une formule, le champ du formulaire la remplacera par sa valeur.

#### SpecialEffect

Ce champ définit le look de l’objet (formulaire, TextBox...), il peut prendre cinq valeurs différentes :
* 0-frmSpecialEffectFlat : rendu 2D. C'est celui par défaut des formulaires.
* 1-fmSpecialEffectRaised : rendu 3D où l’objet est surélevé (mis en avant).
* 2-frmSpecialEffectSunken : rendu 3D où l’objet est abaissé (mis en arrière). C'est celui par défaut des TextBox et CheckBox.
* 3-fromSpecialEffectEtched : 2D avec une bordure.
* 4-frmSpecialEffectBump : 3D avec une bordure.

### Les contrôles de la boîte à outils

Pour afficher la boite à outils, si elle ne s’affiche pas automatiquement, il faut se rendre dans affichage et sélectionner « boite à outils ».
Comme pour les propriétés, nous allons vous présenter un certain nombre de contrôles qui vous seront utiles pour créer votre formulaire personnalisé. Vous allez sélectionner certains contrôles de la boite à outils, les insérer dans votre formulaire, puis régler les propriétés de ces contrôles et enfin dynamiser ces contrôles en programmant leurs réactions aux événements (Clic, Saisie, Déplacement, Ouverture, ...).
De plus, vous pourrez ajouter des contrôles supplémentaires et personnaliser ainsi votre boite à outils. Vous trouverez également un certain nombre de contrôles ActiveX sur internet et il vous sera même possible, une fois que vous serez à l’aise avec la programmation, de créer vous-même vos contrôles.

#### Le label

Le contrôle label permet généralement de placer un intitulé (libellé) à côté d’un contrôle ne procédant pas cet attribut, à côté d’une zone de texte par exemple, afin de permettre à l’utilisateur d’en identifier le contenu.
À partir de là, vous pouvez utiliser l’ensemble des propriétés que nous avons vu précédemment notamment renommer votre label afin d’aider l’utilisateur dans la compréhension du formulaire. Et voici ce à quoi votre formulaire pourrait ressembler si vous ajoutez 18 labels que vous renommez.

#### Le TextBox

Le contrôle TextBox permet de placer des zones de saisie de texte sur la feuille, dans laquelle l’utilisateur pourra renseigner des informations. Les propriétés d’un contrôle TextBox permettent de contrôler le nombre de caractères maximum que pourra entrer l’utilisateur, l’affichage sur plusieurs lignes du texte ou encore le type d’alignement du texte dans la zone de texte...
Voici le formulaire obtenu une fois ajoutées 12 x 6 = 72 TextBox pour la saisie des utilisateurs. Afin que l’utilisateur ait l’impression de saisir ses informations dans un tableau, nous avons modifié l’une des propriétés des TextBox, la propriété BackStyle, en appliquant BackStyleOpaque.

#### La ComboBox

Le contrôle ComboBox, ou la zone de liste modifiable, est une zone de texte permettant à l’utilisateur de saisir une valeur manuellement ou de la sélectionner dans la liste qui se déroule lorsqu’il clique sur le bouton prévu à cet effet. Un contrôle ComboBox peut permettre à l’utilisateur de saisir une valeur ne figurant pas dans la liste, ou n’autoriser qu’une des valeurs de la liste.
Ce contrôle n’inclut pas d’intitulé, par conséquent il est recommandé d’ajouter un Label pour que l’utilisateur s’y retrouve dans le formulaire.
Les alternatives sont la ListBox (liste défilante), et dans Excel la cellule liste (Données, Validation des données, Autoriser = Liste).

#### Le CommandButton

Il est possible d’ajouter à votre formulaire un bouton permettant à l’utilisateur d’effectuer diverses actions. Il peut par exemple servir à valider les informations entrées dans la feuille (bouton OK) afin de passer à l’étape suivante du programme, ou au contraire d’interrompre le programme (bouton Annuler).
Il est important de garder à l’esprit lorsque que vous manipulez les contrôles ActiveX, que chaque ActiveX dispose de ses propres propriétés que vous pouvez manipuler à votre guise.

### Finaliser la présentation du formulaire

La taille d'un formulaire est fixe ; il ne s'adapte donc pas automatiquement à la taille ou à la résolution de l'écran. Si le formulaire est utilisé sur un autre PC, en fonction des dimensions de ce dernier, il y aura certaines différences.
Il est possible de redimensionner le formulaire ainsi que tous les contrôles par code VBA mais ce n’est pas évident. Dans ce cas, il vaut mieux réaliser de petits formulaires afin d’anticiper l’usage d’un écran de plus petite taille que celui initialement utilisé.
Il est important de savoir que les contrôles onglet et surtout multi-pages permettent de répartir les différents contrôles sur plusieurs pages successives : c’est une bonne méthode pour permettre de saisir de façon plus simple un nombre conséquent de données.

#### Initialiser une boite de texte

Il est également possible de pré remplir une boîte de texte avec un texte que l'utilisateur effacera pour faire sa saisie. Cela se fait au moment de l'initialisation du formulaire, par code VBA, ou bien dans la fenêtre propriété en remplissant la propriété "Text".

#### Modifier les couleurs

Il est possible de choisir les couleurs de fond des formulaires ainsi que des différents contrôles utilisés. Pour cela, il y a deux possibilités :
* Utiliser une des couleurs prédéfinies de la palette en cliquant sur la flèche en face de backcolor puis sur palette.
* Définir sa propre couleur : clic droit sur la palette puis sur définissez votre couleur et enfin cliquer sur le bouton ajouter.

#### Aligner les contrôles

Aligner les contrôles permet d’avoir un meilleur visuel quant à la disposition des contrôles dans un formulaire. Pour cela, il faut :
* Sélectionner les contrôles voulus avec la touche Ctrl
* Les aligner : Menu format puis Aligner de l'éditeur VBA.
Il est également possible de les répartir ou encore d’ajuster leurs tailles de façon à avoir des dimensions uniformes et des espacements équidistants.

#### Définir l’ordre de saisie des contrôles

Afin de faciliter la saisie, il paraît plus pratique d’user de la touche tabulation pour se déplacer dans un formulaire. Il est possible de définir l’ordre dans lequel les contrôles seront sélectionnés, pour cela :
* Ouvrir le menu affichage
* Sélectionner ordre de tabulation
* Faire monter ou descendre les différents contrôles qui apparaissent dans la liste jusqu'à ce que l’ordre convienne.

#### Afficher des messages d'aide

Insérer des messages de façon à indiquer à l’utilisateur comment entrer une donnée est utile dans bien des cas. En effet, cela permet d’informer l’utilisateur et lui éviter de saisir plusieurs fois une information car le format n’étant pas adapté, l’information ne sera pas prise en compte : par exemple, indiquer que la date doit être saisie sous format jj/mm/aaaa. C’est la propriété controlTipText qui permet cela.
Exemple : renseignez "numéro à 10 chiffres sans espaces" dans le ControlTypeText de la textbox concernée

### Tester l’apparence

Il est possible de visualiser le formulaire à tout moment afin de vérifier comment le formulaire apparaîtra à l'utilisateur et de pouvoir ainsi corriger les éventuels indésirables. Pour cela, il suffit d’appuyer sur la touche F5 ; elle permet de lancer le formulaire.

## Initialisation du formulaire : transfert de données de la feuille vers le formulaire

Dans cette partie, il s’agit de montrer comment procéder pour l’intégration des données issues d’un tableau Excel dans un formulaire dynamique. Il est à noter que ce n’est pas systématiquement un besoin. En effet, en fonction de l’exercice et des exigences, cela sera demandé ou non.

### Le module VBA du formulaire

Dans un premier temps, il s’agit de d’accéder à l’Userform ou formulaire. Pour cela, il faut :
* Aller dans l’éditeur VBA
* Faire un clic droit sur le nom du formulaire pour visualiser le code associé.
Le formulaire s’ouvre alors ainsi que la fenêtre qui permet de visualiser tous les contrôles associés au formulaire.

### Remplir les listes

Pour que les différents choix possibles s'affichent dans les listes, il y a plusieurs solutions. Celles-ci s'appliquent que ce soit une ListBox ou une ComboBox.
* La méthode AddItem : cette option consiste à taper un code VBA en utilisant l’instruction AddItem
* La propriété RowSource : cette option consiste à afficher la fenêtre propriété du contrôle et la paramétrer afin de sélectionner une plage de données bien précise. Elle peut être remplie en mode graphique avec un tableau (ex : Feuille1!C22:C28)
* La propriété List : cette option consiste également à afficher la fenêtre propriété du contrôle et la paramétrer afin de sélectionner une plage de données bien précise
Concernant les propriétés RowSource et List, il s’agit de compléter manuellement dans la fenêtre propriétés du contrôle ou par VBA.

#### Via VBA

Il s’agit de la méthode AddItem qui consiste en l’affectation d’une propriété à la plage de donnée voulue.
La méthode AddItem ajoute les éléments les uns après les autres. Pour cela, la macro doit être écrite dans le UserForm ‘UserForm Initialize’. Pour cette première méthode, il y a différentes étapes à suivre :
* Tout d’abord, il s’agit dans un premier temps de sélectionner la ComboBox ou ListBox concernée et vérifier que la propriété RowSource est vide.
* Ensuite, il faut double cliquer sur le userform créé pour accéder au code
* Enfin, il s’agit de composer le code avec l’instruction AddItem
* Après cela, il faut exécuter le programme afin de le tester.
Illustration :
Pour un exemple où il s'agit d'intégrer différentes projets, il faut agir comme suit :
Ou
On peut également remplir une liste à partir d'une plage de données sélectionnées : c’est conseillé et surtout utile lorsque on souhaite par exemple sélectionner uniquement les projets commençant par un caractère bien précis.
Illustration :
Il est à noter qu’il existe également la méthode RemoveItem mais celle-ci fait exactement l'inverse de la méthode AddItem : elle permet de supprimer un élément de la ComboBox ou ListBox.

#### Via la fenêtre propriétés et VBA

Cela concerne principalement la propriété RowSource : elle permet d’affecter une référence à une plage de données ; elle attend un champ vertical. Pour cette seconde méthode, il y a différentes étapes à suivre :
* On inscrit d’abord les données qui nous intéressent pour cette manipulation dans une feuille Excel
* Poser un label sur le UserForm
* Poser une zone de liste modifiable sur le UserForm
* Rechercher la propriété RowSource de la ComboBox et entrer simplement :
** 1ère option : les références de la feuille Excel comme ceci : Feuil1!A1:A3 – Il s’agit tout simplement de la source des données affichées dans la ComBox / l'adresse de la plage contenant les données ou,
** 2e option : un nom défini (onglet formules/définir un nom) faisant référence à la plage souhaitée ou,
** 3e option : la référence à une colonne d'un tableau Excel : par exemple Projet [Nucléaire] si le tableau s’appelle Projet et le titre de la colonne est Nucléaire. Pour cela il faut que les données source soient sous forme de tableau.
( Cette option présente un avantage comparé aux précédentes : elle permet d’intégrer automatiquement dans la liste sur le formulaire s’il y a ajout de données dans la colonne en question. )
Attention ! Il faut respecter les majuscules et minuscules dans les noms des tables et colonnes.
* Rechercher la propriété Value et lui donner comme valeur ‘Choisir’
* Poser un bouton de commande et entrer le code suivant :
* Enfin, exécuter le programme pour s’assurer de son bon fonctionnement
Instruction Array
Par ailleurs, on peut utiliser un array ou tableau interne pour remplir une liste ou une combobox.
C’est utile dans le sens où cela évite de devoir créer un tableau avec les données nécessaires dans un classeur Excel. C'est donc pratique uniquement s’il n’y que quelques éléments à ajouter dans la liste de choix. L’utilisation des array présente un autre intérêt non négligeable. En effet, l’utilisateur peut avoir besoin de construire une liste à partir d'éléments qui auront été sélectionnés auparavant suivant des critères complexes. Le résultat de ce tri peut être stocké dans un array qui sera ensuite réinjecté dans la liste en question.
L’un des grands avantages des tableaux est leur très grande rapidité d'exécution : travailler avec les tableaux est beaucoup plus rapide que de travailler en faisant des boucles sur des plages de données de la feuille.
Illustration :
C’est utile dans le sens où cela évite de devoir créer un tableau avec les données nécessaires dans un classeur excel. C'est donc pratique uniquement s’il n’y que quelques éléments connus d'avance à ajouter dans la liste de choix.
Il existe également la propriété List qui elle est remplie par un tableau vertical ou horizontal.

### Afficher par défaut un élément de la liste ou une case vide

C’est l’instruction listIndex qui permet d’afficher par défaut un élément de la liste.
Il est possible de forcer l’affichage du premier choix (ou d'un autre) élément de la liste en ajoutant l'instruction suivante :
Pour forcer l’affichage d'une case vide dans une ComBox, il faut utiliser l'instruction suivante :

### Les listes multi colonnes

Il est envisageable de vouloir afficher non pas une mais deux voire deux, trois ou même quatre colonnes dans une seule liste.
La propriété ColumnCount est particulièrement utile dans ce cas là : elle permet d’indiquer le nombre de colonnes qu’il faudra par la suite compléter.
Il est plus simple de le faire à partir des données de la feuille.
Dans ce cas, il faut utiliser la propriété List: pour une ListBox ou une ComboBox multi colonnes, la propriété List attend un array à 2 dimensions afin de prendre en compte les lignes et les colonnes. Pour afficher une liste de 3 colonnes et de 7 lignes dans la ComboBox nommée Projet, il faudra agir comme suit :
Illustration :
La propriété list attend un array de valeurs. Il est donc parfaitement possible de remplir la liste multi-colonnes avec un array créé en VBA à partir d'autres données (feuille, autre array...).
C'est utile si l’on souhaite par exemple récupérer les données de la feuille puis les trier par ordre alphabétique ou ne conserver que les valeurs répondant à un critère particulier.
Par défaut, la propriété par défaut Value d'une ListBox ou d'une ComboBox renvoie la valeur de la première colonne. Si vous voulez que ce soit par défaut la valeur de la 2e colonne ou autre, il faut le préciser en utilisant la propriété BoundColumn
Illustration :

### Les listes à choix multiples

Les listes à choix multiples permettent de sélectionner plusieurs réponses. Ce n’est pas le cas des ComboBox.
Par défaut, un seul choix est possible mais il est possible d’autoriser le choix multiple par l’intermédiaire de l’instruction MultiSelect.
Illustration :
Il faut ajouter cette ligne dans le UserFor_Initialise :

### Les boutons d'option et les cases à cocher

Il est possible de proposer un choix par défaut à l'utilisateur quand le formulaire s'affiche comme par exemple répondre "Monsieur" à la demande d’État Civil.
La propriété par défaut d'un bouton d'option ou d'une case à cocher est la propriété value : elle n'admet que deux valeurs : true ou false (vrai ou faux) et cela même si vous affichez "Monsieur" ou "Madame" sur vos options. On pourra bien entendu récupérer le genre par la suite quand le formulaire sera validé.
Pour initialiser le formulaire avec l'option "Monsieur" pré cochée, il suffit d'ajouter une ligne dans le code UserForm_Initialize.
Dans le cas où le bouton s’appelle OptF, on procède comme suit :
Illustration :
La propriété value étant la propriété par défaut il n’est pas nécessaire de le préciser ainsi, les deux écritures sont équivalentes.
Il faut noter que les boutons d'option sont exclusifs ainsi si l’on écrit : OptM=true et OptF=true, seul le bouton OptF sera coché.
Pour ce qui est des cases à cocher, il en est tout autrement : il est possible de cocher plusieurs cases.

### Les boîtes de texte et les labels

Il est possible d’afficher, sur le formulaire, une information qui n’a pas à être modifié par l’utilisateur comme par exemple la date ou le contenu d’une cellule.
Illustration :
Pour afficher la date du jour dans l'étiquette nommée LblDate :
Il faut noter que ‘Date’ est une instruction de VBA qui affiche la date du jour.
Autrement, pour afficher le contenu de la cellule D2 de la feuille Data :
Attention ! : Il n’est pas possible d’afficher une plage de données dans une étiquette ; Excel renvoie une erreur d'incompatibilité.
Il est également possible de pré remplir une boîte de texte, que ce soit pour mettre un texte indiquant à l'utilisateur ce qu’il doit remplir, ou pour proposer une réponse.
Illustration :

### Tester votre formulaire

Il est possible de tester le formulaire à tout moment pendant l’écriture du code dans le UserForm_Initialize en appuyant sur la touche F5 avec le curseur placé n’importe où dans le code, ou sur le formulaire dans l'éditeur VBA. À ce stade du cours, l’on a un formulaire avec des listes pré remplies, des options pré côchées et des boites de texte vides ou pré remplies. Cependant, l'appui sur les boutons ou le choix dans une liste ne déclenche rien. Nous allons voir dans le paragraphe suivant comment activer les boutons et récupérer les informations saisies par l'utilisateur.

## Afficher et masquer un formulaire
### Comment afficher un formulaire grâce à un bouton ?

Pour pouvoir afficher un formulaire, nous pouvons utiliser deux méthodes : afficher le formulaire à l'ouverture du classeur ou à l'aide d'un bouton. Nous allons voir dans un premier temps la méthode du bouton placé sur la feuille
Bouton formulaire ou bouton activeX ?
Ouvrir Excel et placer un bouton sur la feuille Excel à l'endroit souhaité : pour effectuer cette manœuvre les étapes à suivre sont les suivantes :
* Aller dans l'onglet développeur
* Cliquer sur insérer
Excel nous propose d'insérer deux types de contrôles sur votre feuille : Des contrôles de type formulaire. Des contrôles de type ActiveX.
Un contrôle formulaire permet de faciliter l’organisation et la modification des informations. Les contrôles formulaires sont issus des versions antérieures d'excel, ils sont conservés pour des raisons de compatibilité d'excel. Les contrôles Activex étaient connus sous le nom de contrôles OLE ou de contrôles OCX, en insérant dans une page Web ou autre programme des contrôles ActiveX d'autres utilisateurs pourront réutiliser les fonctionnalités insérées.
Nous allons nous intéresser aux UserForm VBA incluant des objets ActiveX.
* Pour insérer un contrôle, sélectionnez le dans la boite à outils et faites le glisser dans le formulaire. Au moment du dépôt dans le formulaire, certains assistants se déclenchent (boutons, options, ...), puis entrez ses propriétés et nommez le grâce à la fenêtre propriétés.
* Pour programmer un contrôle, double-cliquer dessus et renseigner le code VBA à lui associer
Afficher le formulaire avec un bouton placé dans la feuille
Nous allons voir les différents boutons proposés par l'onglet "Développeur"
Placer le bouton de votre choix sur la feuille excel. Dans l'onglet Développeur et cliquez dans propriétés.
Voici un bouton placé sur feuille Excel
La mise en forme du bouton peut être modifiable voici les actions pouvant être menées :
* Contrôler l’affichage définitif du formulaire
* Sélectionner et de désélectionner les contrôles afin de procéder à des modification supplémentaires.
* Modification du texte dans un contrôle, telle que la légende ou l’étiquette.
* Grouper, copier, déplacer et aligner les contrôles afin d’organiser la disposition du formulaire de feuille de calcul.
* Redimensionner les contrôles afin d’obtenir l’affichage souhaité.
* Positionner ou dimensionner un contrôle avec une cellule.
* Protéger les contrôles et les cellules en fonction de vos besoins de protection
* Activer ou désactiver l’impression des contrôles lors de l’impression du formulaire de feuille de calcul.
* Supprimer des contrôles qui sont inutiles.
Il faut créer un bouton dans la feuille (partie développeur → insérer → bouton - > cliquer sur la cellule choisie) et lui affecter la macro suivante.Une fois le bouton installé vous devez inscrire une instruction qui lance l’affichage d'un formulaire en appelant par son nom :
Cette instruction lance l’affichage du formulaire en commençant par la macro UserFormprojet.Show. Si Excel vous affiche un message d'erreur à ce stade, lancez votre formulaire en mode pas à pas : mettez vous dans l'éditeur VBA cliquez dans le formulaire et appuyez sur la touche F8 de façon répétée. Le code défile et vous verrez où se situe votre erreur.

### Masquer un formulaire

L'instruction qui vous permettre de masquer le formulaire est la suivante :
Mais si vous voulez faire réapparaître un formulaire dans l'état où il était lorsque vous l'avez masqué, utiliser l'instruction suivante :

### Modification du formulaire en cours de saisie et validation des données
#### Modifier les couleurs d'un bouton

Cliquer sur le bouton "CommandButton1", puis affichage ⇒ Fenêtre Propriétés
http://bdiemert.free.fr/wikiversity/VBA/IDEFenetrePropriete.jpg
Dans la liste des Propriétés ⇒ Affichage "Par catégorie" ⇒ Menu "Apparence" ⇒ Propriété "BackColor" pour la couleur du fond (ou Propriété "ForeColor" Pour la couleur du texte) ⇒ Dans la liste déroulante à droite ⇒ Affichage "Palette" et sélection de la couleur
http://bdiemert.free.fr/wikiversity/VBA/IDEFenetrePaletteCouleurs.jpg

#### Modifier le texte et la police du bouton

Dans la liste des Propriétés ⇒ Affichage "Par catégorie" ⇒ Menu "Apparence" ⇒ Propriété "Caption" ⇒ Entrer le libellé : "Quitter"
Pour modifier la police ⇒ Menu "Police" ⇒ Propriété "Font" et sélectionner la police, le style et la taille
http://bdiemert.free.fr/wikiversity/VBA/IDEFenetrePolice.jpg
Résultat sur le formulaire
http://bdiemert.free.fr/wikiversity/VBA/FRMBoutonQuitter.jpg

#### Utiliser un intitulé (Label) et une zone de texte (TextBox)

Pour cet exemple nous allons créer 2 zones de texte, une pour le nom l'autre pour le prénom, 2 intitulés et un bouton "Valider".
* Placer 2 intitulés sur le formulaire, (le contrôle avec un « A ») l'une à côté de l'autre, dans la propriété "Caption" de la première taper : « Nom », dans la deuxième : « Prénom », puis utiliser les propriétes "BackColor, ForeColor, Font ou autres pour la mise en forme ⇒ http://bdiemert.free.fr/wikiversity/VBA/IDEBoiteOutilsLabel.jpg
* Sous chaque intitulé nous placerons 2 zones de texte (le contrôle avec « ab| ») ⇒ http://bdiemert.free.fr/wikiversity/VBA/IDEBoiteOutilsTexte.jpg
* Faire un double-clic sur la première (pour afficher le code) et taper le code suivant :
Ceci affiche dans la cellule A1 le texte tapé de la zone de texte 1 (TextBox1)
* Idem pour la deuxième mais avec ce code ci ⇒ http://bdiemert.free.fr/wikiversity/VBA/FRMNomPrenom.jpg
** Change est un des évènements prédéfinis qui surviennent lors des manipulations de zone de texte, comme les suivants
** Click
** Initialize
** BeforeUpdate
** AfterUpdate

#### Bouton "Valider"

Maintenant nous allons concaténer le nom et le prénom dans la cellule C1. Pour cela, nous allons créer un bouton, et rentrer dans la propriété "Caption", y écrire "Valider", puis dans la propriété ⇒ Apparence ⇒ (Name) le nommer : "Bt_Valider", Double-cliquer sur ce bouton et taper ce code :
Maintenant, nous allons afficher le formulaire, taper le nom dans la zone de texte 1 et le prénom dans la 2 puis cliquer sur le bouton « Valider » ⇒ http://bdiemert.free.fr/wikiversity/VBA/IDENomPrenomValider.jpg

### Programmer une zone de liste (ComboBox)

Pour cet exemple nous allons créer un intitulé « Où habites-tu? » et une zone de liste « Les villes ».

#### Intitulé

Placer un intitulé sur l'UserForm, rentrer dans la propriété "Caption" : « Où habites-tu ? » puis utiliser les propriétés de mise en forme « BackColor, ForeColor, Font » etc.

#### Zone de liste (ComboBox)

Dans les cellules A1 à A15 de la feuille 2 (Feuil2) du classeur entrer des noms de ville. '11e image' « http://imageshack.com/a/img89/4760/5wnz.jpg » . Consulté le 2017-07-23
Revenir à l'éditeur Visual Basic (« Alt » + « F11 »), sélectionner le formulaire, y placer une zone de liste modifiable ⇒ '12e image' « http://imageshack.com/a/img23/6808/nwxn.jpg » . Consulté le 2017-07-23
Dans les propriétés ⇒ Données ⇒ RowSource, rentrer la zone ciblée : Feuil2!A1:A15 ⇒ '13e image' « http://imageshack.com/a/img801/245/3pfh.jpg » . Consulté le 2017-07-23
Double-cliquer sur la zone de liste (ComboBox) et rentrer ce code:

### Utiliser un bouton Option

* Pour cet exemple nous allons créer 2 boutons d'option pour choisir entre : « Fille » ou « Garçon », il faut placer avant tout chose un cadre (Frame) sur l'UserForm. Propriété ⇒ Caption : « Fille ou garçon » ⇒ '14e image' « http://imageshack.com/a/img20/8900/4bvh.jpg » . Consulté le 2017-07-23
* Il faut ensuite placer sur ce cadre 2 boutons d'option, nommer le 1er : « fille », le 2e : « garçon », se servir des propriétés « BackColor, ForeColor, Font etc » pour la mise en forme ⇒ '15e image' « http://imageshack.com/a/img4/6462/anbj.jpg » . Consulté le 2017-07-23
* Double-cliquer sur le premier bouton (Fille) et entrer ce code:
Ce qui écrira dans la cellule C4 "Vous êtes une fille" lorsque ce bouton sera coché
* Double-cliquer sur le deuxième bouton (Garçon) et saisir le code :
Cela écrira dans la cellule C4 "Vous êtes un garçon" lorsque ce bouton sera coché ⇒ '16e image' « http://imageshack.com/a/img191/7605/nwl1.jpg » . Consulté le 2017-07-23

### Contrôler une saisie dans une TextBox

Nous allons vérifier maintenant la saisie d’une TextBox à l’aide d’un nouvel exemple :
* Placer un label en haut du formulaire, Propriété ⇒ Caption : Indiquez votre prénom
* Placer une TextBox dessous
* Le bouton de commande tout en bas, Propriété ⇒ Caption : Valider ⇒ '17e image' « http://imageshack.com/a/img41/4899/bcy4.jpg » . Consulté le 2017-07-23
* Programmer le bouton "Valider" via un double-clic et la saisie du code suivant :
Tant qu'au moins une lettre du prénom ne sera pas saisie, le focus replacé sur la TextBox1, sinon le prénom s'affichera en A1 ⇒ '18e image' « http://imageshack.com/a/img51/1829/2z3r.jpg » . Consulté le 2017-07-23

## Transfert de données du formulaire dans la feuille
### Boîtes de texte

De base, la propriété d’une zone de texte par défaut est le texte. Pour mettre le contenu de cette boîte de texte dans une cellule de la feuille de calcul, écrivez :
Il y a bien sûr la possibilité d’effectuer une boucle afin d’affecter une valeur aux TextBox de façon automatique. (Voir exercice associé à cette leçon).
Exercice :
'On peut aussi affecter cette valeur à une variable :'

### ComboBox

Concernant la propriété d'une ComboBox, par défaut c’est .Value. Contrairement aux TextBox qui ne renvoient que du texte qu’il faut ensuite éventuellement transtyper (changer le Type texte en nombre, date...), Excel reconnait le type de donnée renvoyé par une liste. Dim Activité as String 'à modifier si la liste contient une date ou un nombre ! Activité= ListActivité Range("F2")=Activité ou bien directement Range("F2")=ListActivité
Exercice :

## Exercices
### Exemple d'initialisation d'un formulaire

Le code suivant initialise le formulaire en masquant et minimisant Excel, en réglant taille, hauteur, largeur et position

### Exemple de code associé à un contrôle

Pour commencer à associer du code à un contrôle, il est pratique de double cliquer dessus car cela crée automatiquement l'en-tête de la fonction.
Le code suivant rend visible un bouton quand on coche une case, et le masque quand on la décoche

### Exemple de création d'un formulaire personnalisé

Ci-dessous, le lien pour l'exercice de création de formulaire personnalisé :
* Macros-commandes VBA/Exercices/Création de formulaire personnalisé

## Les formulaires Access et Excel
### Description

Qu'est ce qu'un formulaire ?
Un formulaire est un document conçu avec une structure et un format standards qui permettent de faciliter la capture, l’organisation et la modification des informations.
Les formulaires imprimés contiennent des instructions, des mises en forme, des étiquettes et des espaces vides pour écrire ou taper des données. Vous pouvez utiliser Excel et les modèles Excel pour créer des formulaires imprimés.
Types de formulaires Excel
Vous pouvez créer plusieurs types de formulaires dans Excel : formulaires de données, feuilles de calcul contenant des contrôles de formulaire et des contrôles ActiveX, et formulaires utilisateurs VBA (Visual Basic Applications). Vous pouvez utiliser chaque type de formulaire de manière autonome, ou les combiner de différentes façons pour créer une solution qui vous convienne. Nous allons dans ce chapitre les formulaires utilisateurs VBA.
Un peu de vocabulaire avant de commencer
Dans les modules Userforms (formulaire), toutes les procédures sont des actions répondant aux contrôles ActiveX (formulaire, bouton, boite de texte, case à cocher, …) inclus dans le formulaire.
Propriétés du formulaire
Name : permet de définir le nom du formulaire
Caption : permet de définir le titre du formulaire
Méthodes du formulaire
Minimize : rapetisse le formulaire
Load : charge en mémoire et ouvre le formulaire
Show : affiche le formulaire
Événements du formulaire
Change : permet de déclencher des actions sur changement du formulaire
Initialize : permet de déclencher des actions sur chargement du formulaire
Activate : permet de déclencher des actions sur activation du formulaire
Close : permet de déclencher des actions sur fermeture du formulaire
Comment créer son formulaire simple ?
Avant toute chose, une fois votre fichier Excel ouvert, allez dans Fichier, Option et cochez Afficher l'onglet développeur dans le ruban. Une fois cette option activée, placez-vous sur l'onglet développeur et cliquez sur Visual Basic à gauche du ruban. Une nouvelle fenêtre VBA s'affiche. Cliquez maintenant sur Insertion : UserForm. La base de votre formulaire est créée qui s’appelle userform1. À ce stade, diverses fenêtres se sont affichées :
Fenêtre projet
Affiche tous les conteneurs de code VBA (modules, formulaires, …)
Fenêtre code
Affiche tous les codes VBA (modules, formulaires, …), dans le cas des formulaires, affiche aussi le design de la fenêtre
Fenêtre propriété
Affiche toutes les propriétés des objets sélectionnés (modules, formulaires, listes, …)
Une boite à outils est également apparue; elle vous servira à construire votre formulaire.
Vous pouvez modifier le nom de votre formulaire userform 1 dans la fenêtre propriété, name.
Les principaux contrôles de la boite à outils
Intitulé : texte simple non modifiable par l'utilisateur : titre, étiquette accompagnant une zone de texte
Zone de texte : champ texte accessible en saisie
Zone de liste modifiable : permet de sélectionner 1 à plusieurs valeurs dans une liste prédéfinie
Zone de liste : permet de sélectionner 1 à plusieurs valeurs dans une liste prédéfinie
Case à cocher : permet de sélectionner 0 ou plusieurs options parmi celles proposées
Bouton d'option : permet de sélectionner une option parmi plusieurs proposées
Bouton bascule : bouton prenant deux états : appuyé ou relâché
Cadre : contient d'autres contrôles
Bouton de commande : permet d'exécuter une action en cliquant dessus (ouvrir un formulaire, calculer, etc.)
Contrôle d'onglet : permet de définir différents onglets contenant des informations différentes
Image : permet d'insérer une image dans le formulaire
Les Assistants : uniquement pour certains contrôles simples (boutons, options, etc.)
Sélectionnez un contrôle de la boite à outils afin de déterminer la forme et, en restant appuyé dessus, faites le glisser dans userform1.
Tapez vos données à l'intérieur et nommez le dans la fenêtre propriétés.
Recommencez autant de fois que nécessaire.

### Création

Access et Excel permettent l’utilisation de formulaires, en plus de leurs bases de données et feuilles de calcul.
Pour créer un userform dans Excel, il faut passer en vision du code : ALT + F11. Ensuite dans l'arborescence à gauche, le clic droit permet la création de trois type d'objets : feuille, userform et module.
* Si les modules ne peuvent contenir que du Visual Basic, les feuilles et userform peuvent en comporter également.
Pour qu'un userform se lance automatiquement au démarrage, ajouter le code suivant dans une feuille :
* On désigne donc le formulaire par son nom (MonFormulaire1 ci-dessus). Mais dans le code du formulaire, on peut utiliser Me à la place.
* Supprimer la mention vbModeless ci-dessus entraine l'impossibilité d'ouvrir d'autres fichiers Excel pendant l’utilisation du formulaire.
Le code suivant initialise le userform qui le contient, en effet le nom de cette fonction est connu et la lance automatiquement au lancement :
Ensuite, en mode création la boite à outil permet d'ajouter des objets dans le userform (boutons, champs...). Nommer ces objets dans leur propriété permet de le appeler ensuite :

## Les principaux contrôles et leurs propriétés
### Frame

Cadre permettant de subdiviser le formulaire en plusieurs sous-parties.

### Button

* Name
* Backcolor
* Enabled
* Location
* Size
* TabIndex
* TabStop
* Tag
* Text
* Textalign
* Visible

### Label

Intitulé.

### LinkLabel

Hyperlien.

### TextBox

Champ pouvant être complété par l'utilisateur.

### CheckBox

Case à cocher pour questionnaire à choix multiple.

### OptionButton

Le bouton d'option (ou bouton radio) permet de ne choisir qu'une seule réponse dans une liste.
Pour définir le groupe de boutons dans lequel une seule case pourra être cochée (égale à True), il faut préciser son nom dans la propriété GroupName de chaque bouton.

### ListBox

Menu déroulant. La différence avec ComboBox est qu'elle n’est pas modifiable.

### Explorateur de fichiers

* Une fois tous les objets placés à leurs emplacements définitifs dans le formulaire, il faut ordonner leur paramètre Tab_Index (en commençant à 0) pour que l'utilisateur puisse les parcourir normalement en appuyant sur TAB.

## Exemple de code associé à un contrôle

Pour commencer à associer du code à un contrôle, il est pratique de double cliquer dessus car cela crée automatiquement l'en-tête de la fonction.
Celle ci-dessous affiche un bouton quand on coche une case, et le masque quand on la décoche :

## Inventaire des composantes d'un formulaire

Pour lister tous les objets que contient un formulaire :

## Compiler un exécutable

Pour créer une application .exe standard avec Visual Basic, il faut réer un nouveau projet ActiveX EXE.
Les applications MDI permettent l’utilisation de sous-fenêtres, par opposition aux SDI (une seule fenêtre) aux TDI (plusieurs onglets).