VBA - Come creare un form utente in un modulo di classe

Creare un form utente contenente un numero dinamico di controlli e assicurarsi che vengano attivati ​​da determinati eventi. Per ottenere questo risultato, utilizzeremo un modulo UserForm e un modulo di classe e assegneremo qualsiasi controllo creato dinamicamente nel modulo utente al modulo di classe. Infine lo scopo di questo tutorial è anche quello di ottenere un singolo modulo e rendere la funzione di chiamata il più semplice possibile (limitata a 2-3 righe di codice).

  • Prerequisiti
  • Il codice
    • Il modulo di classe
  • La funzione chiamante

Prerequisiti

Passare a Opzioni di Excel > Gestione attendibilità > Impostazioni macro e assicurarsi che la seguente opzione sia abilitata: accesso sicuro al modello di oggetto del progetto VBA .

Il codice richiede inoltre i riferimenti riportati di seguito, ovvero la libreria di oggetti di Microsoft Forms 2.0 e l' estensibilità di Microsoft Visual Basic 5.3 . È possibile abilitarli facendo clic sul menu Strumenti dell'editor VBA e quindi su Riferimenti .

Il codice

In questo esempio, creeremo un userform contenente due pulsanti. Facendo clic su questo pulsante, la loro didascalia verrà visualizzata nel codice della funzione chiamante.

Il modulo di classe

Crea un modulo di classe nel tuo progetto VBA, chiamalo come PremierExemple (proprietà ClassName) e inserisci questo codice:

 Opzione esplicita

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

'Abilita i seguenti riferimenti (Strumenti> Riferimenti)

'Libreria oggetti di Microsoft Forms 2.0

'Microsoft Visual Basic per l'estensibilità delle applicazioni 5.3

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

Forma utente pubblica maform come oggetto '

Public WithEvents Bouton As Pulsante MSForms.CommandButton '

Dico pubblico come oggetto 'Objet Dictionnary = Raccolta oggetti

Private Nom As String 'Nom => crea o cancella userform

Private Sub Class_Initialize ()

'creare classe

Imposta Dico = CreateObject ("Scripting.dictionary")

End Sub

Valore di funzione pubblica ()

'Il metodo Value de notre Classe consente la creazione della forma utente

'e restituisce un valore

NewUsf "Mon premier UserForm" 'creazione di userform

NewBouton "toto", "TOTO", 120, 30, 5, 5 'crea il pulsante TOTO

NewBouton "titi", "TITI", 120, 30, 5, 35 'crea il pulsante TITI

maForm.Show 'mostra userform

On Error GoTo fin

Valore = maForm.Tag 'assegna il valore contenuto nel Tag della userform alla nostra funzione.

Scarica maForm

Esci dalla funzione

fIN:

Fine Funzione

Sottotitoli privati ​​NewUsf (monCaption As String)

'Creazione di userform

Imposta maForm = ThisWorkbook.VBProject.VBComponents.Add (3)

Nom = maForm.Name

VBA.UserForms.Add (Nom)

Imposta maForm = UserForms (UserForms.Count - 1)

Con maForm

.Caption = monCaption

. Larghezza = 150

. Altezza = 100

Fine con

End Sub

Public Sub NewBouton (Name As String, Caption As String, Width As Double, Height As Double, Left As Double, Top As Double)

'Creazione di un pulsante di controllo

Dim obj

Imposta Obj = maForm.Controls.Add ("forms.CommandButton.1")

Se Obj = True, quindi Esci da Sub

Dim cls Come nuovo PremierExemple

Imposta cls.maForm = maForm

Imposta cls.Bouton = Obj

Con cls.Bouton

. Nome = Nome

.Caption = Didascalia

.Move a sinistra, in alto, in larghezza, in altezza

Fine con

Dico.Add Name, cls

Imposta cls = Nothing

End Sub

Private Sub Bouton_Click ()

'procedura evento per il clic del pulsante

maForm.Tag = Bouton.Caption

maForm.Hide

End Sub

Private Sub Class_Terminate ()

'cancellazione della classe

Dim VBComp As VBComponent

Imposta Dico = Nothing 'cancella tutte le istanze della nostra classe => tutti i pulsanti

Se Nom "" Then "se è il userform (l'unica istanza con la proprietà" Nom "riempita)

Impostare la ricerca VBComp = ThisWorkbook.VBProject.VBComponents (Nom)

ThisWorkbook.VBProject.VBComponents.Rimuovi l'eliminazione di VBComp

Finisci se

End Sub

La funzione chiamante

La procedura per la funzione di chiamata è notevolmente semplificata ... grazie al modulo di classe, hai accesso a un userform e un metodo Value. Viene restituito in un modo semplice, utilizzando il seguente codice di chiamata:

 Sottotest ()

Dim MyForm Come nuovo PremierExemple

MsgBox MyForm.Value

Imposta MyForm = Nothing

End Sub

Articolo Precedente Articolo Successivo

I Migliori Consigli