在用户表单中,我将其放在顶部:
Public DelMonth As Variant
DelMonth的值是从ComboBox读取的,我可以从该用户窗体中的不同子例程中调用它。但是当我从一个单独的模块中调用它时,它并没有读取它。它甚至不会抛出错误。如果我做MsgBox DelMonth
,它就不会做任何事情。
答案 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
。总是