假设我要在Excel VBA中制作一个自行车设计器程序。我有一个具有一些默认设置的类对象(cBike)。现在,我想制作一张表格(如图中的表格),该表格可以用来更改这些设置,然后再将自行车存储到数据库中。用于存储的方法(子)位于cBike中。

vba - 保留类模块形式-LMLPHP

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

Public objBike As cBike
Public Sub StoreBikeToDatabase()
 'database storing code goes here
End Sub

尽管这行得通,但我已经看到很多人反对使用公共(public)(全局)变量。我不是很确定为什么,除了事实是,如果您有太多的全局变量,您的代码将是一团糟。

或者,我可以忘记对象,而使用来自不同表单控件的值,而不是使用Class Module cBike的属性。但是,这似乎是一个笨拙的解决方案。

我的问题是:以上哪种解决方案是最好的(如果有的话)?如果都不用,那我应该怎么做呢?

更新:
我强烈建议您阅读已接受的答案,再读一遍。这两个答案都有不错的主意,而Dee的帖子还包含了一些综合的代码示例,这些示例可用于其他与我的问题类似的代码。

最佳答案

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

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

'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

您可以通过声明cBike的属性,如下所示有效地在表单控件和您的类之间创建动态链接:
Private WithEvents mTextBox1 As MSForms.TextBox

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

    Set mTextBox1 = obj

End Property

这意味着,如果文本框发生更改,则无需继续将文本框的值传递给该类。您将需要对Microsoft Forms 2.0 Object Library的引用集

关于vba - 保留类模块形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41822761/

10-10 09:17