保留表单中的类模块

Noc*_*ceo 7 excel vba excel-vba userform

假设我想在Excel VBA中制作一个自行车设计师程序.我有一个Class Object(cBike),它有一些默认设置.现在我想在将自行车存放到数据库之前制作一个可用于更改这些设置的表单(如图中的那个).用于存储的方法(子)位于cBike.

用于设计自行车的用户形式的示例.

我可以将对象保存为表单代码中的公共变量,如下所示:

Public objBike As cBike 
Public Sub StoreBikeToDatabase()   
 'database storing code goes here 
End Sub
Run Code Online (Sandbox Code Playgroud)

虽然这样可行,但我看到很多人反对使用公共(全局)变量.我不太清楚为什么,除了如果你有太多的全局变量,你的代码将是一个烂摊子.

或者,我可以忘记该对象,并使用来自不同表单控件的值,而不是类模块的属性cBike.然而,这似乎是一个笨拙的解决方案.

我的问题是:如果有的话,上述哪种解决方案最好?如果没有,那么我该怎么做呢?

更新: 我强烈建议您同时阅读接受的答案,然后再深入了解答案.这两个答案都有一些很棒的想法,而且他们的帖子附加了一些全面的代码示例,可以用于其他类似我的问题.

Jim*_*ket 4

表单本质上本身就是一个类,因此我建议在表单中创建一个私有属性来保存您的 Bike 对象。然后,您可以通过属性集例程将现有的 Bike 对象传递到表单/类中。

如果需要通过表单中的多个例程访问 Bike 成员/属性,则在表单级别声明 Bike 成员/属性没有问题。仅当对象需要被整个项目使用时才应使用全局/公共变量(在模块中声明)。

'Private Member of this Form/Class
Private mBike As cBike

'Pass the existing object into this Form/Class
Public Property Let Bike(ByVal obj As cBike)

    Set mBike = obj

End Property
Run Code Online (Sandbox Code Playgroud)

您可以通过如下声明 cBike 的属性来有效地在表单控件和您的类之间创建动态链接:

Private WithEvents mTextBox1 As MSForms.TextBox

Public Property Set TextBox1(ByVal obj As MSForms.TextBox)

    Set mTextBox1 = obj

End Property
Run Code Online (Sandbox Code Playgroud)

这意味着如果文本框的值发生变化,您将不需要继续将其传递给类。您将需要 Microsoft Forms 2.0 对象库的参考集