Dans VBA, un objet UserForm est simplement une classe personnalisée (avec certains événements et propriétés) et une interface utilisateur intégrée. Moi aussi, j'aimerais créer une classe personnalisée avec une interface utilisateur intégrée, mais ce n'est pas la même que celle utilisée par userforms.
Par exemple, supposons que je souhaite créer une interface utilisateur pour calculatrice. J'aurai besoin d'éléments d'image pour l'arrière-plan de la calculatrice et les boutons, d'une zone de texte pour l'écran, puis de certains éléments pour écouter les clics de l'utilisateur. Je les lie ensuite d’une manière ou d’une autre à une classe qui contient tous les écouteurs d’événement et le code d’initialisation / fermeture pour faire apparaître l’interface graphique.
Ma question est de savoir par où commencer si je veux concevoir quelque chose comme ça?
Méthode
Une façon dont je peux penser est la suivante (dans Excel):
- Concevoir le look de l'interface dans un éditeur d'image
- Exportez les différents éléments sous forme de fichiers image individuels et enregistrez-les dans un emplacement / sur une feuille de calcul masquée
- Créez une classe dans VBA qui a du code pour assembler les différents éléments d'image, c'est-à-dire pour les placer dans un emplacement prédéterminé les uns par rapport aux autres
- Cobblez ensemble les éléments interactifs restants (boutons, zone de texte de sortie, etc.) à l'aide de contrôles activeX, qui sont invisibles et positionnés sur leurs éléments d'image respectifs.
- Initialiser ces contrôles avec les écouteurs d'événements de ma classe
Que je peux relativement facilement faire. Mais il a les principales limitations suivantes auxquelles je peux penser:
Problèmes*
- En termes d'événements, je suis contraint à tout ce que le contrôle activeX a par défaut
Du fait que mon approche construit l'interface à partir d'éléments d'image, du point de vue de VBA , il s'agirait d' Shape
objets (pour prendre en charge la transparence - bords arrondis -, car les contrôles d'image activeX ne le prennent pas en charge). Celles-ci ne déclenchent aucun événement. Par conséquent, si je veux détecter, par exemple, lorsque l'utilisateur survole le cadre de la calculatrice, je le recouvrirai avec des étiquettes invisible ActiveX ou passerai des appels d'API pour voir ce que fait la souris. Le premier est irréalisable pour les formes complexes, le dernier ajoute une charge supplémentaire de complexité supplémentaire. Dans l’idéal, je voudrais pouvoir spécifier quels éléments soulèvent quels événements à partir d’une liste de ceux qui m’ont été proposés.
- Redimensionnement / conception en cours d'exécution
Si mon interface est construite à partir d'éléments d'image, je ne peux pas modifier facilement la conception au moment de l'exécution. Si, disons, je veux redimensionner l'élément frame de mon interface graphique, les images au format raster standard (png, jpeg, etc.) deviendront floues, les images vectorielles (pour lesquelles Excel ne prend plus en charge actuellement) n'ont pas par défaut les règles suivantes: If the frame height is changed, stretch the sides but do not stretch the toolbar at the top
. Je souhaite également prendre en charge le changement de couleur des éléments, mais il est très difficile d’utiliser des images. recolor
C’est une option, mais uniquement disponible pour MSPublisher.
- Mémoire / taille de fichier
La majorité des éléments graphiques de mon interface seraient probablement des conceptions assez simples. De plus, cela se prête mieux à un format d’image vectorielle qu’à un format raster, mais les contrôles activeX ne la prennent pas en charge en tant qu’arrière-plan. Donc, la taille du fichier augmente, et probablement un certain retard a été introduit, par rapport à un simple bouton ajouté à un formulaire utilisateur.
* nb ceux-ci ne sont que pour le contexte, donc peut être ignoré si vous le souhaitez, ou je peux élaborer davantage sur eux si besoin est
Conclusion
Je ne veux pas utiliser les userforms car ils ont déjà une partie de l'interface définie de manière concrète - le cadre, la forme rectangulaire, les écouteurs d'événements spécifiques pour des éléments spécifiques. Je pourrais éventuellement concevoir ce que je veux dans un userform, mais je voudrais une toile vierge en termes d’apparence. Je suis sûr qu'il doit exister un meilleur moyen de concevoir des interfaces personnalisées pouvant être contrôlées avec la classe VBA, comme le ferait un utilisateur.
J'ai une vague idée que Visual Studio pourrait être utile, mais je ne sais même pas quels tutoriels rechercher. Je ne peux trouver que des instructions sur Windows Forms (ce que je ne veux pas pour les mêmes raisons que je ne veux pas de userform), ou sur les compléments Excel (qui interagissent avec Excel mais ne semblent pas avoir leur propre interface personnalisable ). Ce n'est pas vraiment ce que je recherche, alors je pense que je dois commencer par un être humain pour comprendre le problème et me diriger dans la bonne direction.