UserForm pour Dessiner
Il en a été question lors de la présentation du VBA pour AutoCAD, un de ses grands intérêts est de pourvoir créer facilement des cases de dialogue qui permettent une meilleure lisibilité du programme pour l'utilisateur, mais surtout de contrôler aisément les données à entrer par ce dernier.
En cadrant bien les choses, il ne devrait plus y avoir d'erreur de saisie, puisque dans la case de dialogue on vérifiera tout ce qui est entré pour s'assurer de la validité.
L'exemple que je vais développer va réaliser ce que ce qui se voit dans cette vidéo :
Je vais donc utiliser une UserForm, c’est-à-dire une "feuille" sur laquelle des outils seront insérés et qui interagiront avec le code se trouvant dans un module.
Pour l'utilisateur, ce sera totalement transparent, car le tout est enregistré dans un seul et même fichier DVB, la case de dialogue, le ou les modules, tout dans un seul fichier.
Lui (l'utilisateur) n'aura qu'à "lancer" une macro et le logiciel s'occupera de chercher ses éléments là où il faut et quand il faut.
Si vous êtes curieux et que vous êtes déjà allés glaner des informations sur le Web vous avez sans doute trouvé des gens qui vous proposent d'apprendre en deux minutes et qui déposent du code de dessin DANS la UserForm, ça fonctionne, mais je ne suis pas convaincu (euphémisme) que ce soit une bonne pratique aussi je vais être un peu plus rigoureux que ces autoproclamés gourous et scinder explicitement la partie case de dialogue et la partie module.
Dans la UserForm on gère la case de dialogue et dans le module on gère le code de programmation ce qui respecte le principe de ne pas mélanger les choux et les carottes, même si pour faire une soupe tout va dans la même gamelle, pour certaines recettes les bons cuisiniers traitent les divers aliments isolément (fin de la digression)
Assurément ça fonctionne sans toute cette rigueur, et de ce fait, vous restez entièrement libre de faire comme vous voulez.
Pour ma part, je préfère faire ainsi, étant persuadé du bien-fondé de cette pratique, je vous expliquerai en tenant compte de cette particularité. Allez ! C'est parti
L'idée est de faire une SUB qui va ouvrir la FORM (feuille de case de dialogue) et dans cette case de dialogue on va y trouver un bouton qui va lancer une SUB qui contiendra le code de dessin, mais aussi quelques outils Label (zone de texte informatif).
De cette façon, c'est propre et bien rangé, pas de code de dessin dans la Form, vous constaterez que ce n'est pas la méthode simpliste proposée partout ailleurs, je suis convaincu de l'utilité de cette façon de faire, surtout si à terme vous voulez migrer vers Visual Studio.
Voici le rendu en vidéo :
Dans un premier, il va falloir créer la FORM. Dans le menu choisir Insertion puis UserForm.
Dans l'arborescence du projet sous la catégorie "Feuilles" une UserForm1 se trouve créée.
Pour la renommer appelez les propriétés (si elles ne sont actives c'est la touche F4).
Attention : Dans ces Propriétés ne pas confondre Name et Caption.
Name est le nom de la feuille par lequel on peut l'appeler par le code VBA pour interagir avec elle, comme remplir un Label ou désactiver un bouton.
Caption est le nom qui s'affiche dans la barre de titre de la feuille.
Donc dans notre cas :
le Name sera "Feuille_Dess_Cercle" et le Caption sera "Dessin de Cercle [da-code]". C'est le "titre" de la case, ne rien mettre en Caption est une possibilité.
Une "boîte à outils" apparait lorsqu'une feuille est créée, vous pouvez sélectionner l'outil choisi, on commence par un BUTTON (bouton commande) en le sélectionnant dans la boîte à outils et par "glisser-déposer" le mettre en place dans la feuille.
Attention avec les configurations à deux écrans, si l'IDE VBA n'est pas sur l'écran principal il est possible que la boîte à outils apparaisse sur l'écran principal, c'est un peu déroutant, mais on peut la glisser pour la rapprocher de la feuille.
Une fois que le bouton est arrivé sur la feuille, on peut le déplacer, le changer de largeur, de hauteur, tout ça avec les outils de sélection à la souris.
On va tout de suite le renommer (même mise en garde pour NAME et CAPTION) en mettant "Bouton_Choix_Centre" dans NAME et "Choisir le Centre" dans CAPTION.
On dépose tout de suite un autre bouton qui va avoir "Bouton_Quitter" en NAME et "Quitter" en CAPTION.
La position sur la feuille n'a pas d'importante, ce n'est que du "visuel" c'est par le NAME (nom) qu'on va interagir.
Ensuite insérer un label qui recevra en CAPTION :
"La superficie du Cercle est de : "
Pas besoin de lui donner un NAME car il restera inactif lors du programme, ça restera une simple indication.
Puis insérer un autre label positionné à la fin du premier qui restera en "Label2" en CAPTION mais qui aura "Label_Surf" en NAME
Création d'une SUB principale qui va lancer la UserForm (case de dialoque).
La Userform est affichée grâce à la méthode SHOW.
Ensuite on va diriger les actions de chaque bouton vers le module et la "sub" dédiée.
Le bouton Choix du centre lance la "sub" du dessin du cercle, la première chose que fait cette "sub" est de cacher la "Feuille" grâce à la méthode HIDE.
Tout de suite on sélectionne à l'écran le point de centre puis la distance de rayon et le cercle se dessine.
Une fois que le cercle est dessiné on extrait de ses propriétés la superficie de l'objet créé et on l'injecte dans le Label2 de la Userform.
Il ne reste plus qu'à faire revenir (toujours la méthode SHOW) la UserForm et on a le renseignement de superficie formaté en deux décimales concaténé avec le texte "m²" qui a remplacé le texte (Label2) qui contenait "en attente".
Voici une vidéo de dix minutes qui "décortique" l'ensemble des opérations.
Création le 11 mai 2021