下面是一个我自己回答的问题,但是它给我带来了很大的挫败感,我在网上搜索它时遇到了很多麻烦,所以我在这里发帖希望为其他人节省一些时间和精力,如果我将来忘记这一点,也许对我自己来说:
对于 VBA(在我的情况下,MS Excel),Public
声明应该使该模块中的其他函数或子例程以及在任何其他模块。
事实证明这不是真的,在 , 的情况下Forms
,我也怀疑在Sheets
,但我没有验证后者。
简而言之,以下内容在创建时不会创建公共的、可访问的变量Form
,因此会崩溃,说 bYesNo 和 dRate 变量在 mModule1 中未定义:
(inside fMyForm)
Public bYesNo As Boolean`
Public dRate As Double
Private Sub SetVals()
bYesNo = Me.cbShouldIHaveADrink.value
dRate = CDec(Me.tbHowManyPerHour.value)
End Sub
(Presume the textbox & checkbox are defined in the form)
(inside mModule1)
Private Sub PrintVals()
Debug.Print CStr(bYesNo)
Debug.Print CStr(dRate)
End Sub
但是,如果您在下面进行轻微更改,一切都会正常工作:
(inside fMyForm)
Private Sub SetVals()
bYesNo = Me.cbShouldIHaveADrink.value
dRate = CDec(Me.tbHowManyPerHour.value)
End Sub
(Presume the textbox & checkbox are defined in the form)
(inside mModule1)
Public bYesNo As Boolean`
Public dRate As Double
Private Sub PrintVals()
Debug.Print CStr(bYesNo)
Debug.Print CStr(dRate)
End Sub
mModule1
将工作得很好,并且假设总是首先调用 fMyForm,然后在PrintVals
运行例程时,将正确捕获表单中文本框和复选框的值。
老实说,我无法理解 MS 对这种变化的想法,但缺乏一致性会极大地降低效率,学习这样的特质,这些特质的记录非常差,以至于 2013 年的谷歌搜索可能已经存在一段时间了十年或更长时间的搜索是如此具有挑战性。