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 ein Label Steuerelement, das einen Benutzernamen angibt.
  • txtUserName für ein TextBox Steuerelement, in das der Benutzer einen Benutzernamen eingeben kann.
  • cboUserName für ein ComboBox Steuerelement, in dem der Benutzer einen Benutzernamen eingeben oder auswählen kann.
  • lstUserName für ein ListBox Steuerelement, bei dem der Benutzer einen Benutzernamen auswählen kann.
  • btnOk oder cmdOk für ein Button 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

irgendein Musterformular

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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow