从userform调用公共变量

时间:2017-08-22 14:45:32

标签: vba excel-vba excel

在用户表单中,我将其放在顶部:

Public DelMonth As Variant

DelMonth的值是从ComboBox读取的,我可以从该用户窗体中的不同子例程中调用它。但是当我从一个单独的模块中调用它时,它并没有读取它。它甚至不会抛出错误。如果我做MsgBox DelMonth,它就不会做任何事情。

1 个答案:

答案 0 :(得分:3)

表单是对象;对象模块中的公共字段属于该对象的实例。 UserForms只是具有默认实例(即VB_PredeclaredId = True属性)和设计者的类模块。

如果你正在使用表单的默认实例(一个相当糟糕的主意),那么你可以这样做:

MsgBox UserForm1.DelMonth

请注意,在全局对象中存储状态容易出错,并且最终导致问题。

如果您将表格视为完整的课程,那么您将拥有以下内容:

With New UserForm1
    .Show
    MsgBox .DelMonth
End With

请注意,字段为Public表示任何人,可以随时。您的意思是表单确定其值,调用者能够读取该值。您可以通过使用Property Get成员封装字段来完成此操作 - 首先创建字段Private

Option Explicit
Private DelMonth As Variant ' wouldn't Integer or Long be more appropriate?

Public Property Get DeliveryMonth() As Long
    DeliveryMonth = DelMonth
End Property

现在,来电者无法看到私人DelMonth,他们可以对DeliveryMonth所做的就是调用Get访问者,这不会让他们篡改封装值。

  

它甚至不会抛出错误。

这令人担忧。你允许VBA愉快地编译拼写错误和非法代码。在每个模块的顶部指定Option Explicit。总是