vba - 公共(public)变量在表单中的 VBA 中并不是真正公共(public)的

标签 vba scope

下面是一个我自己回答的问题,但是它给我带来了很大的挫败感,我在网上搜索它时遇到了很多麻烦,所以我在这里发帖希望为其他人节省一些时间和精力,如果我将来忘记这一点,也许对我自己来说:

对于 VBA(在我的例子中是 MS Excel), Public声明应该使该模块中的其他函数或子例程以及任何其他模块中的变量(或函数)全局可访问。

事实证明这不是真的,在 Forms 的情况下
, 我也怀疑 Sheets ,但我没有验证后者。

简而言之,以下不会创建公共(public)的、可访问的变量 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 年的谷歌搜索可能已经存在一段时间了十年或更长时间的搜索是如此具有挑战性。

最佳答案

第一条评论:

Userform 和 Sheet 模块是 Object 模块:它们的行为方式与常规模块不同。但是,您可以以与引用类属性类似的方式引用用户窗体中的变量。在您提到 fMyForm.bYesNo 的示例中可以正常工作。如果您没有将bYesNo 声明为Public,那么表单外部的代码将看不到它,因此当您将其设为Public 时,它确实与非Public 不同。 ——蒂姆·威廉姆斯 2013 年 4 月 11 日 21:39

其实是正确答案...

关于vba - 公共(public)变量在表单中的 VBA 中并不是真正公共(public)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15959018/

相关文章:

reference - 为什么在 AppleScript 中,不能声明对处理程序本地变量的引用?

c++ - 在 C 和 C++ 文件之间共享一个全局变量

Excel VBA Application.Speech.Speak 方法 : reading numbers as thousands

java - 这样做的正确方法是什么?

javascript - 具有 block 作用域的语言?

VBA从excel选项卡名称中删除前缀

ruby - 了解 Ruby 中的作用域

excel - 在所有工作表中应用按钮+宏

vba - 将 Outlook VBA 宏与功能区上的自定义按钮打包

excel - 将水平线延伸到图表区域的边缘