VBA - Comment créer un objet UserForm dans un module de classe

Créez un objet UserForm contenant un nombre dynamique de contrôles et assurez-vous qu'ils sont déclenchés par certains événements. Pour atteindre ce résultat, nous allons utiliser un objet UserForm et un module de classe, puis affecter tout contrôle créé dynamiquement dans le formulaire utilisateur au module de classe. Enfin, l'objectif de ce tutoriel est également d'obtenir un seul module et de rendre la fonction appelante aussi simple que possible (limitée à 2-3 lignes de code).

  • Conditions préalables
  • Le code
    • Le module de classe
  • La fonction appelante

Conditions préalables

Accédez à Options Excel > Gestion de la confiance > Paramètres de macro et assurez-vous que l'option suivante est activée: Confirmez l'accès au modèle d'objet de projet VBA .

Le code nécessite également les références ci-dessous, à savoir la bibliothèque d'objets Microsoft Forms 2.0 et Microsoft Visual Basic pour Applications Extensibility 5.3 . Vous pouvez les activer en cliquant sur le menu Outils de l' éditeur VBA, puis sur Références .

Le code

Dans cet exemple, nous allons créer un formulaire utilisateur contenant deux boutons. En cliquant sur ces boutons, leur légende sera affichée dans le code de la fonction appelante.

Le module de classe

Créez un module de classe dans votre projet VBA, nommez-le PremierExemple (propriété ClassName) et insérez le code suivant:

 Option explicite

'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!

'Activer les références suivantes (Outils> Références)

'Bibliothèque d'objets Microsoft Forms 2.0

'Microsoft Visual Basic pour Extensibility d'applications 5.3

'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!

MaForm publique comme objet 'Userform

Bouton public WithEvents en tant que bouton MSForms.CommandButton

Dico Public As Object 'Objet Dictionnary = Collection d'objets

Nom privé comme String 'Nom => créer ou supprimer un formulaire utilisateur

Private Sub Class_Initialize ()

'créer une classe

Set Dico = CreateObject ("Scripting.dictionary")

End Sub

Valeur de la fonction publique ()

'La méthode Value de notre Classe permet la création du formulaire utilisateur

'et retourne une valeur

NewUsf "Mon premier UserForm" 'creation of userform

NewBouton "toto", "TOTO", 120, 30, 5, 5 'crée le bouton TOTO.

NewBouton "titi", "TITI", 120, 30, 5, 35 'créer le bouton TITI

formulaire utilisateur d'affichage 'maForm.Show'

Sur erreur GoTo fin

Value = maForm.Tag 'assigne la valeur contenue dans la balise du userform à notre fonction.

Décharger maForm

Fonction de sortie

ailette:

Fonction de fin

Private Sub NewUsf (monCaption As String)

'Création de userform

Définir maForm = ThisWorkbook.VBProject.VBComponents.Add (3)

Nom = maForm.Name

VBA.UserForms.Add (Nom)

Définir maForm = UserForms (UserForms.Count - 1)

Avec maForm

.Caption = monCaption

.Largeur = 150

.Hauteur = 100

Terminer par

End Sub

Public Sub NewBouton (Nom en tant que chaîne, Légende en tant que chaîne, Largeur en tant que double, Hauteur en tant que double, Gauche en tant que double, Haut en tant que double)

'Création d'un bouton de commande

Dim Obj

Définissez Obj = maForm.Controls.Add ("forms.CommandButton.1")

Si Obj = True, puis quitter Sub

Dim Cls comme nouveau PremierExemple

Définir cls.maForm = maForm

Définir cls.Bouton = Obj

Avec cls.bouton

.Name = Nom

.Caption = Légende

Déplacer vers la gauche, le haut, la largeur, la hauteur

Terminer par

Dico.Add Nom, cls

Set cls = Nothing

End Sub

Sous Privé Bouton_Click ()

'procédure d'événement pour un clic sur un bouton

maForm.Tag = Bouton.Caption

maForm.Hide

End Sub

Private Sub Class_Terminate ()

'suppression de classe

Dim VBComp As VBComponent

Set Dico = Nothing 'supprimer toutes les occurrences de notre classe => tous les boutons

Si Nom "" Alors "s'il s'agit du formulaire utilisateur (l'instance unique ayant la propriété" Nom "renseignée)

Définir la recherche de VBComp = ThisWorkbook.VBProject.VBComponents (Nom)

ThisWorkbook.VBProject.VBComponents.Remove VBComp 'delete

Fin si

End Sub

La fonction appelante

La procédure pour la fonction d'appel est grandement simplifiée ... grâce au module de classe, vous avez accès à un userform et à une méthode Value. Il est renvoyé simplement en utilisant le code d'appel ci-dessous:

 Sous test ()

Dim MyForm comme nouveau PremierExemple

MsgBox MyForm.Value

Définir MyForm = Nothing

End Sub

Article Précédent Article Suivant

Les Meilleurs Conseils