最佳实践
UserForm 是具有设计器和默认实例的类模块。的设计者可以通过按被访问 Shift + F7 在观看代码隐藏,并且隐藏代码可以按被访问 F7,同时观看的设计者。
每次都使用新实例
作为一个类模块,一个形式因此是蓝图用于对象。因为表单可以保存状态和数据,所以使用类的新实例而不是默认/全局实例更好的做法 :
With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        '...
    End If
End With
代替:
UserForm1.Show vbModal
If Not UserForm1.IsCancelled Then
    '...
End If
当使用红色 X 按钮关闭表单和/或在代码隐藏中使用 Unload Me 时,使用默认实例可能会导致细微错误。
在其他地方实施逻辑
表单应该只关注表示 :一个连接到数据库并根据用户输入运行参数化查询的按钮 Click 处理程序正在做太多事情。
相反,在代码中实现应用程序逻辑,该代码负责在专用模块和过程中显示表单,甚至更好。
编写代码的方式使得 UserForm 只负责知道如何显示和收集数据:数据来自何处,或之后数据发生的情况,都不是它的问题。
来电者不应该受到控制的困扰
为要使用的表单创建一个定义良好的模型,可以在其自己的专用类模块中,也可以封装在表单的代码隐藏本身中 - 使用 Property Get 过程公开模型,并让客户端代码使用这些:这使得形成对控件及其细节的抽象,仅将相关数据暴露给客户端代码。
这意味着代码如下所示:
With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .Message, vbInformation
    End If
End With
而不是这个:
With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .txtMessage.Text, vbInformation
    End If
End With
处理 QueryClose 事件
表单通常有一个 Close 按钮,提示/对话框 Ok 和 Cancel 按钮; 用户可以使用表单的控件框 (红色的 X 按钮) 关闭表单,默认情况下会破坏表单实例( 每次都使用新实例的另一个好理由 )。
With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then 'if QueryClose isn't handled, this can raise a runtime error.
        '...
    End With
End With
处理 QueryClose 事件的最简单方法是将 Cancel 参数设置为 True,然后隐藏表单而不是关闭它:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    Me.Hide
End Sub
这样,X 按钮永远不会破坏实例,并且调用者可以安全地访问所有公共成员。
隐藏,不要关闭
创建对象的代码应该负责销毁它:卸载和终止自身不是表单的责任。
避免在表单的代码隐藏中使用 Unload Me。改为调用 Me.Hide,这样调用代码仍然可以使用窗体关闭时创建的对象。
命名的东西
使用属性 toolwindow( F4 )仔细命名表单上的每个控件。控件的名称在代码隐藏中使用,因此,除非你使用可以处理此问题的重构工具,否则重命名控件将破坏代码 - 因此,首先要做的事情要比尝试更容易,而不是尝试准确地解决了 TextBox12 代表的 20 个文本框中的哪一个。
传统上,UserForm 控件以匈牙利风格的前缀命名:
- lblUserName用于指示用户名的- Label控件。
- txtUserName用于- TextBox控件,用户可以在其中输入用户名。
- cboUserName用于- ComboBox控件,用户可以在其中输入或选择用户名。
- lstUserName用于- ListBox控件,用户可以在其中选择用户名。
- btnOk或- cmdOk用于标记为- Ok的- Button控件。
问题是,当如用户界面被重新设计和 ComboBox 变为 ListBox,名称需要改变以反映新的控制型:这是最好的名字控制他们代表什么,而不是他们的控制类型之后 -对分离的来自 UI 的代码尽可能多。
- UserNameLabel用于指示用户名的只读标签。
- UserNameInput用于控件,用户可以在其中输入或选择用户名。
- OkButton用于标有- Ok的命令按钮。
无论选择哪种风格,任何事情都比将所有控件保留为默认名称更好。命名风格的一致性也是理想的。