31
Un premier formulaire (userform) pas à pas Vous pouvez télécharger un exemple associé à ce tutoriel. Introduction Un premier userform ultrasimple Un exemple plus élaboré Créer l'interface Initialisation du userform Validation de données Transfert de données du userform vers la feuille Transfert de données de la feuille vers le formulaire Introduction Beaucoup d'utilisateurs d'excel pensent spontanément que leur "niveau en informatique" n'est pas assez bon pour se lancer dans un langage de programmation et de ce fait laissent tomber les merveilleux outils que sont les macros (langage VBA) et les userforms. Au tout début de ce pas à pas, je leur propose de créer un userform ultrasimple juste pour démontrer que ce n'est vraiment pas insurmontable. Cependant, la création d'un userform nécessite quelques notions de base en langage macro ou VBA. La lecture du pas à pas sur ces notions est donc vivement recommandée à ceux qui n'ont jamais écrit une ligne de code. Mon premier userform ultrasimple Mettons directement les mains dans le cambouis ! Ouvre un nouveau classeur excel et affiche l'éditeur VBA (alt+F11). Tu vois à gauche VBA project (classeur1). Fais un clic droit sur ce mot, insertion/userform. Tu vois apparaître : à gauche, un classeur nommé feuilles avec dedans un userform1 ; à droite un carré gris tristounet et une boite à outil. Si celle ci n'apparaissait pas, regarde dans le menu affichage/boite à outils. Dans cette boite se trouvent différents objets ou "contrôles" que l'on peut placer sur un userform. Chacun de ces contrôles permet d'effectuer

diagramas.diagramasde.comdiagramas.diagramasde.com/otros/FORMULAIRE EN EXELL FR.docx · Web viewCependant, la création d'un userform nécessite quelques notions de base en langage

  • Upload
    lythu

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Un premier formulaire (userform) pas à pasVous pouvez télécharger un exemple associé à ce tutoriel.

Introduction

Un premier userform ultrasimple

Un exemple plus élaboré

Créer l'interface

Initialisation du userform

Validation de données

Transfert de données du userform vers la feuille

Transfert de données de la feuille vers le formulaire

Introduction

Beaucoup d'utilisateurs d'excel pensent spontanément que leur "niveau en informatique" n'est pas assez

bon pour se lancer dans un langage de programmation et de ce fait laissent tomber les merveilleux outils

que sont les macros (langage VBA) et les userforms.

Au tout début de ce pas à pas, je leur propose de créer un userform ultrasimple juste pour démontrer

que ce n'est vraiment pas insurmontable. Cependant, la création d'un userform nécessite quelques

notions de base en langage macro ou VBA. La lecture du pas à pas sur ces notions est donc

vivement recommandée à ceux qui n'ont jamais écrit une ligne de code.

Mon premier userform ultrasimple

Mettons directement les mains dans le cambouis !

Ouvre un nouveau classeur excel et affiche l'éditeur VBA (alt+F11). Tu vois à gauche VBA project

(classeur1). Fais un clic droit sur ce mot, insertion/userform. Tu vois apparaître : à gauche, un classeur

nommé feuilles avec dedans un userform1 ; à droite un carré gris tristounet et une boite à outil. Si celle ci

n'apparaissait pas, regarde dans le menu affichage/boite à outils. Dans cette boite se trouvent différents

objets ou "contrôles" que l'on peut placer sur un userform. Chacun de ces contrôles permet d'effectuer

un type d'opération. Les étiquettes (labels) permettent d'afficher du texte, les boites de texte (textbox) de

faire entrer du texte à un utilisateur, les listes (listbox et combobox) de choisir un item dans une liste pré

remplie, modifiable ou non, les boutons permettent de déclencher une action comme par exemple une

validation de saisie. Il y a bien d'autres contrôles disponibles. Certains sont affichés par défaut mais en

faisant un clic droit sur cette boite à outils tu peux accéder à d'autres contrôles. Pour le moment, nous

allons juste placer un textbox et un bouton.

Pour voir ce que l'utilisateur aura en face de lui, appuie sur la touche F5. A ce stade tu as un textbox

avec le curseur placé dedans, et un bouton. Tu peux saisir du texte dans ton textbox mais si tu cliques

sur le bouton, il ne se passe... RIEN. Pour qu'il se passe quelque chose, il faut associer des instructions

à ce userform. Ferme le userform avec la croix rouge et reviens dans l'éditeur VBA. Clique sur le bouton

du userform pour le sélectionner. A gauche tu vois apparaître la fenêtre propriétés (si ce n'est pas le cas,

affichage, fenêtre propriétés ou touche F4). Cette fenêtre liste les propriétés associées à l'objet

sélectionné. Par défaut, excel appelle CommandButton les boutons. Tu peux changer ce nom (name)

pour que ce soit plus parlant. Mais attention, pas d'espace et pas certains caractères particuliers dans le

nom. Mais cela ne change pas le texte du bouton. Pour ça il faut modifier la propriété caption. Mets OK

dedans par exemple. Les propriétés peuvent être modifiées de cette façon, mais également par

programmation (à voir plus tard !). Nous allons maintenant faire en sorte que lorsque l'utilisateur appuie

sur le bouton, le texte saisi dans le textbox soit entré dans la cellule A1 de la feuille 1. Si je double clique

dans l'éditeur VBA sur le bouton, une nouvelle fenêtre s'ouvre avec dans la partie centrale ceci :

Private Sub CommandButton1_Click()

End Sub

Les instructions associées au clic sur ce bouton seront insérées entre ces deux lignes.

La fenêtre qui s'est ouverte comporte en haut deux menus déroulants. Celui de droite comporte des

actions. On parle plutôt d'événements. Chaque type de contrôle dispose d'une série d'événements qui lui

sont associés. Sur un bouton, on peut cliquer, double cliquer, passer la souris dessus... Le menu de

gauche permet de sélectionner les différents contrôles du userform ou le userform lui même. En jouant

avec ces deux menus on a donc accès à l'ensemble des opérations que l'on peut piloter avec les

contrôles présents sur le userform. On peut également accéder à cette fenêtre de programmation en

faisant un clic droit sur le mot userform1 dans l'explorateur de projet puis afficher le code.

Pour s'y retrouver dans les différentes propriétés et méthodes ou événements associés à un contrôle,

lorsque l'on programme, on associe les deux comme on le fait en bon français en mettant un nom et un

adjectif qualificatif. Pour que ce soit encore plus simple, on met un point entre les deux :

CommandButton1.Caption permet de manipuler le texte affiché sur le bouton. Chaque objet a une

propriété par défaut. Par exemple pour un textbox c'est value. Cette propriété peut être omise mais

personnellement, je préfère à des fins de clarté la mettre systématiquement même si c'est plus lourd. Si

l'utilisateur entre coucou dans le textbox1, la valeur du textbox (value) est coucou. Je peux récupérer

cette valeur et la mettre dans la feuille de calcul. Ça donne :

Sheets("Feuil1").Range("A1").Value=TextBox1.Value

Il me suffit de placer cette ligne de code dans la macro associée au bouton et lorsque l'utilisateur

cliquera sur ce bouton, cette ligne de code sera effectuée ce qui mettra coucou en A1.

Private Sub CommandButton1_Click()

Sheets("Feuil1").Range("A1").Value=TextBox1.Value

End Sub

Et voilà ! Lance le userform (F5) et vérifie que tout fonctionne. C'est bon ? Alors tu es paré pour passer à

la suite !

On va juste ajouter une petite chose pratique dans ce userform : comment l'afficher et comment le

masquer ?

Pour le masquer c'est très simple. Dans le code de ton bouton, il te suffit de rajouter l'instruction

userform1.hide. Tu peux aussi, pour le cas ou la feuille 1 n'aurait pas été la feuille active au moment ou

le userform a été lancé, faire afficher cette page :

Sheets("Feuil1").Activate.

Pour permettre à l'utilisateur de lancer le userform, tu peux aussi ajouter un bouton sur la page avec les

barres d'outils contrôles ou formulaires et mettre dans le code de ce bouton l'instruction userform1.show.

Voilà. Si tu as compris ça, le reste n'est que variation autour du même principe. Un contrôle, des

propriétés, des événements et un peu de code pour lier tout ça. Après on peut mettre de la couleur,

soigner la présentation, optimiser le code pour faire pro et qu'il soit rapide mais fondamentalement il n'y

a rien de bien plus sorcier.

L'exemple qui suit est un peu plus complexe. Il reprend aussi plus en détail les différents notions

rapidement abordées dans ce premier exemple.

Un userform plus élaboré

Vous voulez gérer avec excel une petite base de données, pour collecter par exemple vos recettes de

cuisine préférées. En effet, outre la recette à proprement parler, vous voulez pouvoir trier vos recettes

par type de plat (viande, dessert..) ou par niveau de difficulté.

Bien sur vous pouvez faire un simple tableau dans excel avec des colonnes pour chaque rubrique (titre,

type de plat, difficulté, temps de préparation...).

Mais l'interface n'est guère sympathique, que ce soit pour faire la saisie ou pour visualiser vos recettes,

voire les imprimer.

Les userforms (nom anglophone) ou formulaires sont justement faits pour cela. Le terme de formulaire

faisant très administratif en français est je trouve très mal choisi pour cette interface qui peut être très

soignée et réussie. Vous trouverez quelques exemples à télécharger sur excelabo, notamment de Michel

Pierron, qui vous en convaincront aisément ! Une petite remarque : bien que l'interface Visual basic

(l'éditeur) soit francisée, le VBA (le code) nécessaire pour utiliser les userforms reste en anglais. Du

coup les outils sont désignés dans l'interface par le nom français, dans le code par le nom anglais et

dans l'aide en ligne tantôt par l'un tantôt par l'autre. Bien qu'aimant la langue de Molière, je ferai (hélas)

de même dans ce texte. Le terme de "contrôle" est synonyme d'outils.

Le classeur exemple à télécharger peut vous sembler très complexe au premier abord. Cependant

chaque notion peut être étudiée séparément. La première partie, associée au userform UsfNew est la

plus simple. Les userforms UsfSelection et UsfSelect2 vous montrent comment faire choisir des critères

à un utilisateur. Enfin le USfAffichage vous montre comment afficher dans un formulaire des données de

la feuille excel.

Pour suivre la démarche nécessaire à la création de notre premier userform, je vais honteusement

pomper des recettes sur http://recettes-de-sylvie.fr/, le site de mon amie Sylvie, site que je vous

recommande plus que chaleureusement, non seulement parce que c'est mon amie, mais aussi (et

surtout pour vous qui ne la connaissez pas) parce que ses recettes sont délicieuses, qu'elle les a toutes

testées chez elle et que, pour en avoir goûté un certain nombre, je sais de quoi je parle ! En prime,

Sylvie est diététicienne alors on peut se laisser aller à la gourmandise presque sans complexe !

Prenons une recette simple, celle du gâteau de T'cil. Celle-ci je la connais bien, T'cil c'est ma fille et la

remarque humoristique pour dire qu'il ne faut pas oublier la farine m'est destinée personnellement (je

confirme, si vous n'oubliez pas la farine, ce gâteau est vraiment délicieux et très facile à faire !).

Une recette comporte un certain nombre de types de données : le titre, l'auteur, les ingrédients, la

recette elle même, le type de plat, la date d'ajout, le temps de préparation, le temps de cuisson, le

nombre de personnes et des commentaires ou compléments. On pourrait aussi ajouter la difficulté et le

coût et mettre une photo pour rendre le tout plus alléchant.

Nous allons créer un userform qui reprenne ces différentes rubriques, ce qui nous permettra de voir les

différents outils que l'on peut utiliser comme des listes déroulantes, des boites de texte, des cases à

cocher...

Créer l'interface

Avant d'écrire une seule ligne de code, il faut commencer par oublier excel et se mettre dans la peau de

l'utilisateur final. Idéalement un userform doit être utilisable par quelqu'un qui n'a jamais manipulé excel

et n'a aucune envie d'apprendre autre chose de plus compliqué que de lancer l'application et de se

mettre à ses fourneaux. On commence donc par réfléchir aux infos qui doivent être affichées et aux

outils permettant d'accélérer la saisie de données. Il est plus facile par exemple de choisir le type de plat

dans une liste plutôt que de le saisir en toutes lettres.

Ouvrez un nouveau classeur Excel. Et ouvrez directement l'Editeur visual basic (Alt+F11). Dans le projet

associé au classeur vous n'avez que trois feuilles (si votre classeur en comporte 3) et une autre, notée

ThisWorkbook. Dans le menu insertion, cliquez sur userform. Un carré plutôt triste s'ouvre, avec marqué

"userform1". Nous allons le rendre plus gai !

Fenêtre propriétés

Commençons par nommer notre premier userform. Si la fenêtre propriétés n'est pas visible, affichez la

(touche F4). Cliquez n'importe ou dans le userform.

La fenêtre propriétés affiche comme son nom l'indique toutes les propriétés qui sont modifiables pour un

contrôle. Elle varie donc en fonction de l'élément actif. La zone de gauche indique le nom des propriétés

et la zone de droite leur valeur. Certaines sont vides, vous pouvez par exemple entrer un texte, d'autres

contiennent une liste des valeurs possibles. Si vous sélectionnez le nom d'une propriété et que vous

tapez F1, vous ouvrez l'aide de visual basic associée à cette propriété. Usez et abusez de cette aide !

Cette fenêtre propriétés comporte deux onglets, listant les propriétés soit par ordre alphabétique soit par

catégorie (apparence, comportement, position...).

Il y a bien trop de propriétés pour pouvoir toutes les décrire ici. Nous n'en verrons qu'une toute petite

partie mais l'outil est puissant !

Dans la fenetre propriétés du userform, à côté de (name), tapez UsfNew. Il y a beaucoup de types de

contrôles possibles. Pour s'y retrouver facilement, je vous conseille de faire toujours commencer le nom

du contrôle (ici le userform lui même) par des lettres vous permettant d'identifier immédiatement dans

votre code de quoi vous parlez. Mes userforms commencent tous par Usf. Un truc très pratique d'excel

c'est qu'il reconnaît le nom des objets quand vous les tapez dans le code. Si vous avez créé un userform

UsfNew (attention aux majucules), quand vous taperez usfnew dans votre code, excel mettra

immédiatement les majuscules au bon endroit. Vous saurez ainsi que excel et vous, vous parlez bien de

la même chose.

Le fait d'avoir changé le nom du userform n'a cependant pas changé ce qui s'inscrit en haut à gauche du

formulaire lui même. Pour cela, il faut modifier la propriété "caption". Mettez "Ajouter une nouvelle

recette".

On peut tout de suite modifier la taille du userform avec les poignées pour l'agrandir. Et tant qu'on y est

lui mettre un joli fond coloré. Pour cela, allez dans la fenêtre propriétés et changez le background.

Ouvrez l'onglet palette. Vous pouvez utiliser une des couleurs proposées par défaut ou créer la vôtre :

faites un clic droit sur la palette, choisissez votre couleur puis ajoutez la à la palette.

Vous pouvez mettre une image en fond de formulaire. Si vous voulez faire ça, cliquez sur la propriété

Picture (le bouton avec les 3 petits points) pour choisir l'image voulue, il faudra ensuite modifier l'aspect

de cette image par la propriété PictureSizeMode.

Boîte à outils

Si la boite à outils n'est pas affichée, faites le (menu affichage).

En promenant la souris sur les contrôles, leur nom français apparaît. C'est bien de les avoir traduits,

mais comme le code VBA qui leur est associé reste en anglais, il est plus pratique de les désigner par

leurs noms anglais, ce que je ferai dans la suite de ce texte, en indiquant au début la correspondance.

D'ailleurs quand vous utilisez un de ces outils, par défaut, excel lui donne le nom anglais. Dans la boîte à

outils standard, seuls les outils les plus courants sont présents. En faisant un clic droit sur la boîte, vous

faites apparaître une liste vous permettant d'en ajouter d'autres, comme des contrôles calendrier ou

image.

Labels

Vous ne pouvez pas écrire directement dans le userform. Il faut utiliser des labels ("intitulés"). Cliquez

sur l'outil label dans la boîte à outils puis dans le userform. Une zone sélectionnée apparaît avec "label1"

dedans. Mettez le curseur dans cette boîte, effacez ce texte et remplacez le par le votre. par exemple

"Titre". Remarquez que la propriété caption de ce contôle s'est modifiée toute seule. En fait vous pouvez

soit écrire dans le label soit écrire dans la zone en face de caption dans la fenêtre propriété, soit aussi,

mais nous le verrons plus tard, utiliser VBA pour modifier ce texte. Dans la fenêtre propriétés, vous

pouvez modifier la police (font) d'affichage, sa taille et sa couleur et la couleur de fond du label.

TextBox

Cliquez maintenant sur "zone de texte" dans la boîte à outil et ajoutez un textbox dans le userform. Le

nom par défaut est TxtBox1. Changez le pour TxtTitre. L'utilisateur (le "user" du form..ulaire) tapera son

texte dans cette boite. Comme précedemment, vous pouvez modifier la couleur de fond et les propriétés

d'affichage.

Combobox et list box

Pour une fois, le nom français de combobox est nettement plus clair : les "zones de listes modifiables"

vous permettent de choisir dans un liste déterminée mais que vous pouvez modifier en tapant dedans.

Les listboxes ne sont elles pas modifiables. La différence est aussi d'ordre esthétique : la listbox montre

d'emblée les éléments de la liste (si ça ne tient pas dans la zone affichée, un ascenseur apparaît), la

combo vous propose une flèche et un menu déroulant. La listbox permet de faire des sélections

multiples ce qui n'est pas le cas avec la combo.

Boutons

Outils indispensables, ce sont eux que vous utiliserez par exemple pour valider le userform et entrer les

données dans la page excel.

CheckBox, OptionButton et frames

Les CheckBoxes sont des cases à cocher. Vous pouvez proposer plusieurs choix et permettre à

l'utilisateur d'en sélectionner aucun ou plusieurs. Si vous voulez qu'un seul choix soit possible (oui ou

non mais pas les deux), il faut utiliser un bouton d'option. Lorsque vous cochez un bouton d'option, excel

décoche les autres. Cependant vous pouvez avoir besoin de poser plusieurs questions différentes

nécessitant des boutons d'options sur un formulaire. Pour qu'excel comprenne ceux qui sont liés, il faut

les regrouper dans un cadre ou frame. Commencez par poser un contrôle cadre puis ajoutez dedans les

boutons d'option.

Contrôle image

Ce contrôle vous permet d'ajouter une image contenue sur votre disque dur ou tout élément contenu sur

votre feuille excel que vous copiez sous forme d'image, y compris des graphiques (voir sur la page

grahiques).

Autres contrôles

Il y a bien entendu d'autres contrôles disponibles, vous trouverez des astuces les concernant sur les

pages contrôles et userforms de ce site. Parmi les plus utiles, citons les contrôles multipages, très

pratiques lorsqu'il y a beaucoup de données à saisir ou lorsqu'une partie des données doit être validée

avant de passer à la suite par exemple. Les boutons à bascule, les toupies, le "Refedit", permettant à

l'utilisateur de spécifier une plage de données...

Avant de passer au code

Mais nous avons déjà de quoi nous amuser ! Placez ces outils harmonieusement sur votre userform,

alignez les correctement (vous avez des outils pour cela dans le menu format). Pour sélectionner

plusieurs contrôles, utilisez la touche Ctrl. Vous pouvez mettre en forme plusieurs contrôles d'un coup,

tant qu'ils ont une propriété commune (comme Font). Parfois dans la fenêtre propriété, la rubrique est

vide alors qu'elle ne le devrait pas. En cliquant dans Font justement, apparait un bouon qui ouvre le

menu adéquat. Vous pouvez aussi pour conserver le même aspect à tous les contrôles du même type

les dupliquer. Sélectionnez le contrôle, et tout en le déplaçant à la souris, maintenez la touche Ctrl

enfoncée, ceci le dupliquera (c'est vrai dans de nombreuses applications Office). Votre userform pourrait

donner quelque chose comme cela :

Pour voir son aspect "en vrai", dans la fenêtre de l'éditeur, appuyez sur la touche F5. Le userform se

charge mais vous ne pouvez pas faire grand chose à ce stade, rien n'étant fonctionnel.

Avant d'écrire le code, encore quelques manips sur le userform lui même : prenez maintenant la peine

de nommer tous vos contrôles (y compris les cadres ou frames) avec un code facile à comprendre.

Evitez les noms à rallonge, pas d'espace ni de caractère spécial.

Soyez sobres mais clairs ! N'oubliez pas que vous aurez peut-être à remettre le nez dans votre code d'ici

2 ans et qu'il sera plus facile d'interpreter TxtTitre que control45...

Dans le même ordre d'idées, n'hésitez pas à mettre dans votre code des tas de commentaires.

Mieux vaut en mettre trop au début, quitte à faire du ménage un jour.

Pour faciliter la saisie, il est pratique d'utiliser la touche de tabulation pour passer d'une zone de saisie à

une autre. Dans le menu affichage de VBE, il y a une rubrique tabulation qui vous permet de définir

l'ordre. A vous de jouer avec les flèches. Comme vous ne cliquerez jamais dans un label, vous pouvez

les mettre tous en bas. De même par flemme je ne change généralement pas le nom par défaut des

labels, sauf ceux que je prévois de modifier par VBA pour afficher une info par exemple. Si vous voulez

qu'un texte apparaisse sur un contrôle lors du survol avec la souris, pour rappeller ce qu'il faut entrer ou

le format de saisie, mettez ce texte dans la propriété "controlTipText".

Il faut encore modifier certaines propriétés des contrôles dans la fenêtre propriétés. Par exemple, pour

autoriser les retours chariot et l'écriture sur plusieurs lignes dans les textbox, il faut mettre les propriétés

multiline et EnterKeyBehavior à True. Si vous voulez pouvoir utiliser la touche de tabulation dans une

textbox, mettez à True la propriété TabKeyBehavior mais cela vous interdit de passer d'un contrôle à

l'autre avec cette touche.

Préparez les éléments nécessaires pour remplir vos zones de liste : dans une des feuilles du classeur

nommée ici "code", inscrivez colonne par colonne les différentes listes (type de plat, nombre de

convives, occasions...).

Je vous donne tout de suite un truc qui parait un peu complexe mais qui facilite grandement la

maintenance de votre userform : nommez vos listes en utilisant la fonction décaler. Cette façon de faire

permet d'ajouter des éléments à la liste sans avoir à redéfinir la source de celle -ci. Pour l'instant, suivez

juste le guide ! écrivez les éléments composant la liste les uns en dessous des autres, SANS vide, une

seule liste par colonne (très important, il ne doit RIEN y avoir d'autre dans ces colonnes). Donnez un titre

à la liste dans la première ligne. Par exemple en A1 vous écrivez type de plat, en A2, entrées et

veloutés, en A3 terrines... Sélectionnez la cellule A1 puis dans le menu Insertion/nom/définir, recopiez ce

qui est écrit ci dessous :

=DECALER(code!$A$2;;;NBVAL(code!$A:$A)-1)

Une fois cette formule magique entrée, cliquez sur ajouter. En recliquant dans la formule, un cadre

pointillé sélectionne le valeurs prises en compte dans le nom TypePlat. Celles ci vont de A2 (en excluant

donc le titre) jusqu'à la première cellule vide non incluse de la colonne A.

Il y a d'autres façons de faire pour remplir les listes mais celle-ci est à mon goût l'une des plus rapides

par la suite. Si vraiment ça vous parait trop complexe pour le moment, sélectionnez juste la zone A2:A10

et nommez cette plage TypePlat par insertion/nom/définir.

Initialisation du userform

Lorsqu'on va lancer le userform, il faut que les listes soient remplies. On peut également afficher par

défaut des informations dans les TextBoxes comme la date du jour et précocher certaines CheckBoxes

ou OptionButtons le cas échéant. A chaque userform est associé un événement d'initialisation et les

instructions à effectuer doivent être placées dans une macro particulière nomme userform_initialize.

Pour créer cette macro, commencez par ouvrir la feuille de code associée à votre formulaire en faisant

un clic droit sur son nom dans l'explorateur à gauche. Il se peut qu'il y ait déjà des bouts de macros;

sans code; de type private sub label1_clic() dans cette feuille. Effacez les tous. Ils se créent quand par

erreur ou volontairement vous double cliquez sur un contrôle au moment de la mise en forme de votre

userform.

Dans la fenêtre qui s'est ouverte, dans le menu de gauche vous voyez (général). En déroulant ce menu

vous retrouvez le nom de tous les contrôles que vous avez créé plus le nom générique "userform"

(même si vous avez renommé celui-ci). Sélectionnez le. Le menu de droite propose maintenant les

différents événements associés au userform (ce qui doit se passer quand on clique dessus, qu'on

l'active...). Sélectionnez initialize.

Une nouvelle macro Private Sub UserForm_Initialize() est prête à recevoir nos instructions.

Remplir les listes

Les ListBoxes et les ComboBoxes se remplissent de la même manière, en utilisant par exemple la

propriété RowSource.

D'autres méthodes sont possibles, notamment item par item. Regardez dans l'aide d'Excel et sur la page

listes d'Excelabo.

Pour utiliser une propriété, on la fait précéder du nom du controle.

En tapant son nom en minuscule, on vérifie qu'Excel reconnait le contrôle.

Si c'est le cas, au moment du changement de ligne lors de l'écriture du code, Excel applique la bonne

orthographe.

Sinon, vérifiez le nom du contrôle. Si toutefois vous êtes sur de vous et qu'Excel persiste à ne pas

prendre en compte un contrôle que vous venez d'ajouter (ça se produit parfois), enregistrez votre

classeur, fermez-le et rouvrez-le.

Voici le code du userform_initialize :

Private Sub UserForm_Initialize()

CboType.RowSource = ("code!TypePlat") 'remplit la combo

CboType.ListIndex = -1 'une ligne vide s'affiche au lancement

ListOccasion.RowSource = ("code!Occasion")

ListOccasion.ListIndex = -1 ' aucun item de la liste n'est sélectionné

'autorise la sélection multiple

ListOccasion.MultiSelect = fmMultiSelectExtended

CboNbConvives.RowSource = ("code!NbConvives")

CboNbConvives.ListIndex = -1

'met sous format français la date du jour dans le textbox date.

TxtDate.Value = Format(Now(), "dd/mmm/yyyy")

End Sub

Comme un même plat peut être servi en différentes occasions, j'ai choisi de proposer les choix dans une

listbox et non une combo et d'autoriser la sélection multiple.

par défaut, il est probable que la date qui sera utilisée sera celle du jour. Celle ci est donc préinscrite. La

gestion des dates dans VBA est assez complexe pour un français. Ceci fait l'objet de plusieurs astuces

dans les pages Dates et Contrôles.

Prévoir la sortie

Il faut toujours prévoir que l'utilisateur veuille annuler la saisie en cours. Le bouton Annuler sert à cela.

On peut au choix décharger ou seulement cacher le userform. Décharger (unload UsfNew )signifie qu'au

prochain appel, la procédure userform_initialize sera effectuée, ce qui n'est pas le cas si on se contente

de le cacher (UsfNew.hide).

Affichez dans VBE le userform et double-cliquez sur le bouton Annuler. Le code sera à inscrire dans le

Private Sub CmdAnnuler_Click()

Choix de la photo et affichage : la propriété "visible"

En créant le userform, on prévoit un bouton qui permettra de choisir le chemin du fichier contenant la

photot à afficher. Celle ci sera ensuite affichée dans un contrôle image pour vérification. Pour éviter

d'encombrer le formulaire, on va basculer l'affichage entre le bouton et celui de la photo.

Validation de données

Un des gros intérêts d'une interface utilisateur c'est de pouvoir vérifier les données qui sont entrées.

Si on veut par exemple trier sur la date, il faut que celle ci soit entrée correctement.

Si on tape directement dans la feuille Excel, on peut faire des erreurs. En passant par le formulaire, on

va vérifier chaque donnée avant de la rentrer dans le classeur.

Cette validation peut être faite à trois moments : en cours de frappe, lorsque l'on"sort" du contrôle ou

lorsque l'on a fini de rentrer toutes les données dans le formulaire.

Validation en cours de frappe

Il est pratique dans certains cas d'interdire la saisie de certains caractères. Par exemple, si vous avez

une textbox demandant sous quel nom un fichier doit être enregistré, il vaut mieux signaler tout de suite

à l'utilisateur que truc/machin.xls est un nom invalide. Les procédures de validation seront dans ce cas

placées dans l'événement "change" du contrôle puisqu'il se déclenche à chaque changement comme

son nom l'indique.

Validation à la sortie du contrôle

Dans d'autres cas, il faut attendre que l'utilisateur ait fini sa saisie avant de la contrôler. Par exemple, s'il

doit saisir un code de type H4-1. Dans ce cas, la procédure de valisation sera écrite dans l'événement

exit du contrôle. Quand, à l'aide des menus déroulants dans l'éditeur VBA, vous sélectionnez à gauche

le nom du contrôle et à droite l'événement, vous voyez qu'Excel écrit tout de suite quelque chose comme

Private Sub TxtTpsCuisson_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Le Cancel permet d'empêcher de sortir du contrôle. Le curseur reste dedans et l'utilisateur doit modifier

la saisie jusqu'à ce qu'elle soit correcte. Pour que les choses soit plus faciles à comprendre pour lui

(mais pourquoi je ne peux pas faire sortir le curseur de ce truc ???), il est vivement recommandé d'une

part d'afficher un message pour rappeller quelle est la consigne de saisie et d'autre part de sélectionner

les données déjà saisies pour éviter à l'utilisateur de le faire. On pourrait d'ailleurs aussi les effacer. Les

instructions SelStart et SelLength sont là pour ça.

Validation en fin de saisie

Lorsque l'utilisateur pense avoir rempli le formulaire, il clique sur le bouton valider. C'est donc dans la

macro Private Sub CmdValider_Click() que nous écrirons le code de validation. On dit aussi qu'on

intercepte l'événement click du bouton Valider.

Le premier type d'erreur que peut faire l'utilisateur c'est d'oublier de remplir un champ obligatoire. Dans

ce cas, il faut réafficher le userform en laissant les données déjà entrées bien sur. Un signal visuel pour

indiquer les données manquantes (label en rouge par exemple) peut être une bonne stratégie. Dans

l'exemple choisi, il n'y a pas beaucoup de types d'erreurs possibles. Mais il est souvent nécessaire de

vérifier que la saisie dans une boite de texte correspond à un format attendu de données, comme un

numéro de téléphone qui ne doit comporter que des nombres et pas de lettre, un code produit

comportant 2 lettres et 4 chiffres... Vous trouverez des exemples sur la page contrôles.

Ici, on laisse à l'utilisateur la possibilité de changer la date inscrite par défaut. Il faut donc vérifier que ce

qu'il inscrit à la place correspond bien à une date valide. Ce cas est traité à part sur la page contrôles

avec un exemple à télécharger.

Il est également nécessaire de vérifier que des choix ont été effectués dans les listes. Suivant le cas, on

teste que l'index de la liste n'est plus à -1 et/ou qu'au moins un item a été choisi (listes à choix multiples).

Transfert des données du Userform vers la feuille Excel

Une fois que vous avez vérifié que toutes les données entrées sont valides, vous pouvez les transférer

dans la feuille Excel. Ceci se fait très simplement en récupérant les valeurs des différents contrôles et en

les inscrivant dans une cellule.

Par exemple si vous avez un textbox nommé TxtRecette, pour en transférer le contenu dans la cellule

B3 de la feuille "cuisine", il vous suffit d'inscrire :

Range("cuisine!B3").Value= TxtRecette.Value.

dans l'exemple joint, vous verrez comment faire en sorte que ces données s'inscrivent sur la première

ligne vierge de la page.

Transfert des données de la feuille vers le userform

Dans l'exemple à télécharger, vous verrez comment effectuer une sélection de certaines fiches sur la

base de données. L'objectif est ensuite d'afficher les fiches filtrées dans un userform. Il serait tout à fait

possible de prévoir d'imprimer ensuite ce userform.

Pour afficher des données de la feuille dans le userform, le principe est tout aussi simple que

précedemment :

TxtRecette.Value=Range("mafeuille!X1").Value.

Vous trouverez sur Excelabo, dans les tutos et dans les pages userforms et contrôles de nombreuses

autres astuces pour manipuler les différents éléments d'un userform, effectuer des tests de validation de

données et convertir des données popur les mettre dans un format adéquat. Je vous recommande en

particulier de porter attention aux problèmes spécifiques de la manipulation de dates avec VBA. La page

dates d'excelabo vous présente quelques uns de problèmes fréquemment rencontrés et les solutions

adaptées, en particulier ce qui concerne les problèmes de dates françaises/anglaises. Cet autre

exemple simple ou celui-ci sur différents types de contrôles sont adaptés aux débutants.

‹ Les userformshautUn second formulaire pas à pas ›

Mots clefs associés à cette page : combobox, formulaire, listbox

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Message d'erreur

Par copeau38, le mer 14/09/2011 - 17:07.

Bonjour

J'ai utilisé le fichier des recettes de cuisine que j'ai modifié pour mon utilisation pro car je suis enseignant

dans le technique et j'ai rajouté un planning . mais j'ai un message d'erreur 380 "impossible de définir la

propriété Rowsource" .comme je ne suis pas très fort je demande de l'aide

Merci d'avance

Copeau38

Vous devez vous identifier ou créer un compte pour écrire des commentaires

forum

Par Misange, le ven 16/09/2011 - 18:54.

Bonjour

si vous avez des questions sur un développement que vous essayez de faire merci de poser vos

questions sur un forum de discuassion et pas ici. PAr exemple le fourm microsoft answers ou celui

d'excel downloads.

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Problème rencontré

Par pakocity, le sam 21/08/2010 - 14:51.

Bonjour à tous

Je suis entrain de faire mes premiers pas dans l'outil VBA avec les User formes.

J'ai bien compris la démarche et je l'ai appliquée pas à pas sur l'exemple décrit jusqu'au niveau du

remplissage de la liste de sélection.

J'ai bien rempli ma liste dans une feuille nommée "code" et dans la premier colonne en mettant dans

A1(Type de Plat) dans A2(Entrée en veloutés)...

Mais seulement quand je sélection A1 comme indiqué (Sélectionnez la cellule A1 puis dans le menu

Insertion/nom/définir) dans le menu Insertion, je ne retrouve pas nom et définir pour arriver à la page

suivante permettant d'insérer la formule

(=DECALER(code!$A$2;;;NBVAL(code!$A:$A)-1)pour ajouter la liste.

et du coup je suis bloqué.

j'utilise Windows Vista.

Quelqu'un peut-il m'aider?

Merci d'avance.

Augustin DJIKANG

Vous devez vous identifier ou créer un compte pour écrire des commentaires

version excel

Par Misange, le dim 22/08/2010 - 17:07.

Bonjour

ce tutoriel a été réalisé avec une version 2003 ou antérieure d'excel. L'interface a changé avec 2007 et

+. Pour nommer une cellule avec une version 2007 ou + il faut aller dans l'onglet "formules/définir un

nom ou gestionnaire de nom". Pour le reste c'est pareil (même formule à entrer)

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Problème résolu.

Par pakocity, le dim 29/08/2010 - 21:01.

Bonsoir Misange.

Merci pour votre réponse. c'était vraiment un problème de version excel

Grâce à vous j'ai évolué considérablement avec mes Userforms.

Merci une fois de plus pour votre aide.

Augustin DJIKANG

Vous devez vous identifier ou créer un compte pour écrire des commentaires

merci

Par Misange, le mer 01/09/2010 - 07:31.

Merci du retour cela fait toujours très plaisir !

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Modifier valeur de transfert d'un USERFORM

Par CmzxNene, le dim 02/05/2010 - 05:00.

Bonjour,

Dans un TxtBox, j'ai mis le code suivant pour plus de facilité pour la saisie de l'opérateur :

Dim Terme As String

Terme = TxtTerme.Text

Select Case Len(Terme)

Case 2 ', 5, 8, 11

Terme = Terme & "+"

End Select

TxtTerme.Text = Terme

En revanche, je voudrais savoir, au moment de copier la valeur de ce champ dans mon tableau excel

par le bouton "VALIDER", comment changer le "+" en "," .

La colonne qui reçois ces données doit être un format numérique.

Merci de votre aide.

Cordialement

CmzxNene

Vous devez vous identifier ou créer un compte pour écrire des commentaires

forum

Par Misange, le lun 03/05/2010 - 12:23.

Bonjour CmzxNéné

Cet espace de commentaire est destiné à recueillir des questions et commentaires sur le contenu direct

de cette page et sur celui du classeur associé. Il n'est pas le lieu pour poser toutes les questions que tu

te poses sur les formulaires.

Tu peux poser ces questions sur le forum MPFE qui est fait exactement pour cela. S'y connecter est très

simple et gratuit et ne nécessite aucun enregistrement.

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Re transfert

Par CmzxNene, le mar 04/05/2010 - 06:42.

Bonjour Misange,

Ma question a un rapport avec un premier formulaire pas à pas puisque c'est le cas et je le suis grâce au

tuto ci-dessus.

Je pensais que tu aurais une solution à mon problème car je souhaiterais qu'au moment où je clique sur

mon bouton VALIDER, le "+" devienne une "," avant de coller la valeur dans une cellule définie.

Je suis bloqué sur ce pb.

Merci quand même.

Meilleures salutations.

CmzxNene

Vous devez vous identifier ou créer un compte pour écrire des commentaires

et re

Par Misange, le mer 05/05/2010 - 07:39.

CmzxNéné

Je reprends : cet endroit n'est PAS un forum de discussion. Ta question concerne certes les formulaires

mais il y a des milliers de questions sur ce sujet. Je te demande de poser ta question sur le forum MPFE.

tu y trouveras de nombreuses personnes pretes à t'aider, jour et nuit (je ne ments pas), très

compétentes. Tu pourras poser autant de questions que tu veux et c'est celui qui a le temps et les

compétences pour te répondre (parfois moi !) qui te répondra.

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Format d'un champ

Par CmzxNene, le jeu 22/04/2010 - 04:41.

Bonjour,

Avant toute chose, je tenais à vous féliciter pour ces tutoriels très complets.

Je suis débutant un UserForm et j'ai réussi à créer un applicatif très simple utilisé dans la Santé mais qui

n'est pas encore fonctionnel.

Il me reste les contrôles pour obliger la saisie obligatoire de certains champs et le motif de ma question :

comment fait-on pour définir le format d'un champ ?

Ex : j'ai un TxtBox dans lequel je dois mettre une heure sous la forme hh:ss

A quel endroit je dois paramétrer ce format ?

Egalement un TxtBox pour le Nom et je souhaiterais qu'il s'affiche en majuscule.

Je vous remercie de vos réponses.

Cordialement

CmzxNéné

CmzxNene

Vous devez vous identifier ou créer un compte pour écrire des commentaires

validation

Par Misange, le jeu 22/04/2010 - 11:56.

Bonjour

Les questions que tu poses sont abordées dans les astuces référencées dans cette page

http://www.excelabo.net/astuces/vba/controles/validation

Il faut distingue 2 choses :

- forcer l'utilisateur à entrer un certain type de données (par exemple un nombre). Cela se fait en utilisant

les événements associés au contrôle lui même. Quand on sort du textBox par exemple, excel vérifie que

ce qui est entré est un nombre. Si ce n'est pas le cas, il efface le contenu et affiche éventuellement un

message d'erreur. Un exemple ici

- mettre en forme le contenu d'un textbox (valide) à la sortie, par exemple une date. Un autre exemple

ici

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Champ date suite

Par CmzxNene, le sam 24/04/2010 - 23:49.

Merci Misange.

J'ai bien progressé sur mon application et ta réponse m'a permis de formater ce champ de manière à ce

que l'utilisateur soit bien orienté sur ce qu'il doit saisir.

J'aurais une nouvelle question à te poser :

j'ai un champ date paramétré de cette manière :

Private Sub TxtDate_Change()

Dim Valeur As Byte

TxtDate.MaxLength = 10 'nb caractères maxi autorisé dans le textbox

Valeur = Len(TxtDate)

If Valeur = 2 Or Valeur = 5 Then TxtDate = TxtDate & "/"

End Sub

Petit soucis : l'utilisateur saisi la date sur 8 chiffres et non 10 soit 25/04/10 et au transfert de ce champ

dans ma feuille, le résultat est considéré en texte et non en date.

Quelle est la syntaxe à utiliser pour obtenir un vrai champ date dans ma feuille excel ? (ps : ma colonne

est bien au format date)

Merci de ton aide.

Cordialement

CmzxNene

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Validation date

Par Misange, le dim 25/04/2010 - 10:22.

En tapant ces deux mots "validation date" dans la boîte de recherche du site, en haut à droite, tu

récupères plusieurs adresses traitant de ce problème, et en particulier celle-ci

http://www.excelabo.net/trucs/jjmmaa ... faut chercher un petit peu ;-)

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Champ Date

Par CmzxNene, le dim 25/04/2010 - 10:52.

Merci Misange.

Il fallait utiliser le contrôle Cdate.

Think You

A bientôt

CmzxNene

Vous devez vous identifier ou créer un compte pour écrire des commentaires

propriété RowSource et nom de champ

Par Olivier Lecointre, le dim 20/12/2009 - 16:21.

Bonjour,

dans l'application que j'écris, je cherche à utiliser une combobox alimentée par une liste sur une feuille,

comme dans votre exemple. J'ai créé un nom avec la fonction decaler et je l'ai déclaré comme argument

de Rowsource dans le code(même syntaxe que votre exemple) : je reçois systématiquement le même

message d'erreur : "Impossible de définir la propriété Rowsource. Valeur de propriété non valide" (je suis

sur Excel 2000). Je retourne le point dans tous les sens, rien n'y fait ! Merci de votre aide.

OL

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Dans l'exemple téléchargeable

Par Libellule.52, le jeu 23/07/2009 - 07:52.

Dans la version d'exemple, je reçois un message d'erreur quand je veux sélectionner une recette pour

l'afficher dans le userform, est-ce normal ?

D'autre part, est-ce qu'il existe une solution plus simple pour passer d'une fiche à l'autre avec des

boutons "suivant" "précédent" directement dans le formulaire, plutôt que d'imbriquer des formulaires les

uns dans les autres qui s'ouvrent et se referment ?

(sur le principe du formulaire de base dans excel)

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Bonjour j'utilise Excel 2007

Par Rachid, le mer 24/06/2009 - 16:06.

Bonjour

j'utilise Excel 2007 et quand j'écris cette formule "=DECALER(code!$A$2;;;NBVAL(code!$A:$A)-1)"

dans dans la zone"fait référence a" et quand je valide j'ai un message d'erreur "la formule tapée contient

une erreur "

merci de m'éclaircir un peu ce qui se passe

Vous devez vous identifier ou créer un compte pour écrire des commentaires

nom de la feuille

Par Misange, le mer 24/06/2009 - 20:57.

Bonjour

Est-ce que votre feuille s'appelle bien code ? code!$A$2 fait référence à la cellule A2 de la feuille code.

Pour le reste, il n'y a aucune différence entre 2007 et les versions antérieures.

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

bonjour

Par Rachid, le ven 26/06/2009 - 01:22.

Merci Misange pour votre réponse.

j'ai suivi exactement l'exemple mais je crois que la fonction contient une erreur

Vous devez vous identifier ou créer un compte pour écrire des commentaires

Bonjour

Par Rachid, le ven 26/06/2009 - 15:26.

j'ai fait plusieurs essais, et j'ai enfin trouver la correct formule :

=DECALER(Code!$A$2,,,NBVAL(Code!$A:$A)-1,)

merci pour ce site qui est très pédagogique

Vous devez vous identifier ou créer un compte pour écrire des commentaires

pas sur les versions françaises...

Par Misange, le ven 26/06/2009 - 15:55.

Si tu utilises la virgule comme séparateur d'instructions dans une formule, c'est peut être que tu n'es pas

sur une version française d'excel. Sur les versions anglophones, on utilise la virgule dans la feuille de

calcul comme dans VBA. Chez nous, on doit utiliser la virgule dans VBA mais le point virgule dans la

feuille de calcul. Qu'as tu comme séparateur de liste dans le panneau de config de windows ?

En tous cas si tu as rencontré ce problème ici, tu dois l'avoir avec toutes les formules que tu trouves sur

des sites web francophones et dans les forums !

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires

bonjour

Par Rachid, le ven 26/06/2009 - 16:11.

j'utilise un win vista version anglaise

mais vous avez oublié le point virgule ici

.....NBVAL($A:$A)-1;)

Vous devez vous identifier ou créer un compte pour écrire des commentaires

paramètre optionnel

Par Misange, le ven 26/06/2009 - 21:03.

Non je ne l'ai pas oublié. Dans la fonction décaler, les 3 premiers paramètres sont obligatoires. Le

premier doit être indiqué en dur. Si on ne précise pas les deux paramètres suivants (ici en ne mettant

rien entre les ; ou en écrivant 0, c'est comme on veut) ils prennent la valeur par défaut qui pour le

décalage latéral et vertical est de 0. Les deux derniers paramètres sont optionnels, ils représentent la

hauteur et la largeur de la plage. Pour t'en convaincre, écris des nombres dans une plage de quelques

cellules et teste des formules du genre

=somme(decaler($A$1;;2) ou

=somme(decaler($A$1;;;2) ou

=somme(decaler($A$1;;;;2) (remplace dans ton cas les ; par des ,)

Misange

Vous devez vous identifier ou créer un compte pour écrire des commentaires