Suche…
Best Practices
Eine UserForm
ist ein Klassenmodul mit einem Designer und einer Standardinstanz . Auf den Designer kann durch Drücken von UMSCHALT + F7 zugegriffen werden, während der hintere Code angezeigt wird. Auf den nachfolgenden Code kann durch Drücken von F7 zugegriffen werden, während der Designer angezeigt wird .
Jedes Mal mit einer neuen Instanz arbeiten.
Ein Formular ist daher als Klassenmodul ein Entwurf für ein Objekt . Da ein Formular Status und Daten enthalten kann, empfiehlt es sich, mit einer neuen Instanz der Klasse zu arbeiten, anstatt mit der standardmäßigen / globalen Instanz :
With New UserForm1
.Show vbModal
If Not .IsCancelled Then
'...
End If
End With
Anstatt:
UserForm1.Show vbModal
If Not UserForm1.IsCancelled Then
'...
End If
Das Arbeiten mit der Standardinstanz kann zu subtilen Fehlern führen, wenn das Formular mit der roten "X" -Taste geschlossen wird und / oder wenn Unload Me
im Code- Unload Me
verwendet wird.
Implementieren Sie die Logik an anderer Stelle.
Ein Formular sollte sich nur mit der Darstellung befassen: Ein Click
Handler, der eine Verbindung zu einer Datenbank herstellt und eine parametrisierte Abfrage basierend auf Benutzereingaben ausführt, führt zu viele Aufgaben aus .
Implementieren Sie stattdessen die anwendbare Logik in dem Code, der für die Anzeige des Formulars oder besser in dedizierten Modulen und Prozeduren verantwortlich ist.
Schreiben Sie den Code so, dass die UserForm nur dafür verantwortlich ist, zu wissen, wie Daten angezeigt und erfasst werden sollen: woher die Daten kommen oder was mit den Daten danach passiert, ist nicht von Belang.
Der Anrufer sollte sich nicht mit den Bedienelementen beschäftigen.
Erstellen Sie ein gut definiertes Modell, mit dem das Formular arbeiten kann, entweder in einem eigenen dedizierten Klassenmodul oder gekapselt im Code-Behind des Formulars. Setzen Sie das Modell mit den Property Get
Prozeduren zur Verfügung, und lassen Sie den Client-Code damit arbeiten Sie bilden eine Abstraktion über die Steuerelemente und ihre winzigen Details, wobei nur die relevanten Daten dem Clientcode angezeigt werden.
Dies bedeutet Code, der so aussieht:
With New UserForm1
.Show vbModal
If Not .IsCancelled Then
MsgBox .Message, vbInformation
End If
End With
An Stelle von:
With New UserForm1
.Show vbModal
If Not .IsCancelled Then
MsgBox .txtMessage.Text, vbInformation
End If
End With
Behandeln Sie das QueryClose-Ereignis.
Formulare haben in der Regel die Schaltfläche Schließen und Eingabeaufforderungen / Dialogfelder die Schaltflächen OK und Abbrechen . Der Benutzer kann das Formular mithilfe des Kontrollkästchens des Formulars schließen (die rote Schaltfläche "X"), wodurch standardmäßig die Formularinstanz zerstört wird (ein weiterer guter Grund, jedes Mal mit einer neuen Instanz zu arbeiten ).
With New UserForm1
.Show vbModal
If Not .IsCancelled Then 'if QueryClose isn't handled, this can raise a runtime error.
'...
End With
End With
Die einfachste Möglichkeit, das QueryClose
Ereignis zu behandeln, besteht darin, den Parameter Cancel
auf True
und dann das Formular auszublenden , anstatt es zu schließen :
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = True
Me.Hide
End Sub
Auf diese Weise wird die Instanz niemals durch die Schaltfläche "X" zerstört, und der Anrufer kann sicher auf alle öffentlichen Mitglieder zugreifen.
Verstecken, nicht schließen.
Der Code, der ein Objekt erstellt, sollte für die Zerstörung verantwortlich sein. Es ist nicht die Aufgabe des Formulars, sich selbst zu entladen und zu beenden.
Vermeiden Sie die Verwendung von Unload Me
im Code- Unload Me
eines Formulars. Rufen Me.Hide
stattdessen Me.Hide
, damit der aufrufende Code das Objekt, das er erstellt hat, beim Schließen des Formulars weiterhin verwenden kann.
Nennen Sie die Dinge.
Verwenden Sie das Eigenschaftenwerkzeugfenster ( F4 ), um jedes Steuerelement in einem Formular sorgfältig zu benennen. Der Name eines Steuerelements wird im Code-Behind verwendet. Wenn Sie also kein Refactoring-Tool verwenden, das damit umgehen kann, wird das Umbenennen eines Steuerelements den Code beschädigen. Daher ist es viel einfacher, Dinge richtig zu machen, als zu versuchen um herauszufinden, für welches der 20 TextBox12
steht.
Normalerweise werden UserForm-Steuerelemente mit ungarischen Präfixen benannt:
-
lblUserName
für einLabel
Steuerelement, das einen Benutzernamen angibt. -
txtUserName
für einTextBox
Steuerelement, in das der Benutzer einen Benutzernamen eingeben kann. -
cboUserName
für einComboBox
Steuerelement, in dem der Benutzer einen Benutzernamen eingeben oder auswählen kann. -
lstUserName
für einListBox
Steuerelement, bei dem der Benutzer einen Benutzernamen auswählen kann. -
btnOk
odercmdOk
für einButton
Steuerelement mit der Bezeichnung "Ok".
Das Problem ist, dass, wenn beispielsweise die Benutzeroberfläche umgestaltet wird und eine ComboBox
in eine ListBox
, der Name geändert werden muss, um den neuen Steuerelementtyp widerzuspiegeln: Es ist besser, Steuerelemente für das, was sie repräsentieren, zu benennen, als nach ihrem Steuerelementtyp - um sie zu entkoppeln Code von der Benutzeroberfläche so viel wie möglich.
-
UserNameLabel
für ein schreibgeschütztes Label, das einen Benutzernamen angibt. -
UserNameInput
für ein Steuerelement, bei dem der Benutzer einen Benutzernamen eingeben oder auswählen kann. -
OkButton
für eine Befehlsschaltfläche mit der Bezeichnung "Ok".
Unabhängig davon, welcher Stil gewählt wird, ist alles besser, als alle Steuerelemente ihren Standardnamen zu belassen. Ideal ist auch die Konsistenz im Benennungsstil.
Umgang mit QueryClose
Das QueryClose
Ereignis wird immer dann QueryClose
, wenn ein Formular geschlossen wird, entweder über Benutzeraktionen oder programmgesteuert. Der Parameter CloseMode
enthält einen VbQueryClose
, der angibt, wie das Formular geschlossen wurde:
Konstante | Beschreibung | Wert |
---|---|---|
vbFormControlMenu | Das Formular wird als Reaktion auf eine Benutzeraktion geschlossen | 0 |
vbFormCode | Das Formular wird als Antwort auf eine Unload Anweisung geschlossen | 1 |
vbAppWindows | Windows-Sitzung wird beendet | 2 |
vbAppTaskManager | Windows Task Manager schließt die Hostanwendung | 3 |
vbFormMDIForm | Wird in VBA nicht unterstützt | 4 |
Für eine bessere Lesbarkeit empfiehlt es sich, diese Konstanten zu verwenden, anstatt deren Werte direkt zu verwenden.
Eine stornierbare UserForm
Ein Formular mit einer Abbrechen- Schaltfläche erhalten
Der Code-Behind des Formulars könnte folgendermaßen aussehen:
Option Explicit
Private Type TView
IsCancelled As Boolean
SomeOtherSetting As Boolean
'other properties skipped for brievety
End Type
Private this As TView
Public Property Get IsCancelled() As Boolean
IsCancelled = this.IsCancelled
End Property
Public Property Get SomeOtherSetting() As Boolean
SomeOtherSetting = this.SomeOtherSetting
End Property
'...more properties...
Private Sub SomeOtherSettingInput_Change()
this.SomeOtherSetting = CBool(SomeOtherSettingInput.Value)
End Sub
Private Sub OkButton_Click()
Me.Hide
End Sub
Private Sub CancelButton_Click()
this.IsCancelled = True
Me.Hide
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = VbQueryClose.vbFormControlMenu Then
Cancel = True
this.IsCancelled = True
Me.Hide
End If
End Sub
Der aufrufende Code könnte dann das Formular anzeigen und wissen, ob es storniert wurde:
Public Sub DoSomething()
With New UserForm1
.Show vbModal
If .IsCancelled Then Exit Sub
If .SomeOtherSetting Then
'setting is enabled
Else
'setting is disabled
End If
End With
End Sub
Die IsCancelled
Eigenschaft gibt True
wenn auf die Schaltfläche Cancel geklickt wird oder wenn der Benutzer das Formular mithilfe des Steuerelements schließt.