下面是一个我将自己回答的问题,但它给我带来了极大的挫败感,我在网上搜索它时遇到了很多麻烦,所以我在这里发帖是希望为别人节省一些时间和精力,如果我将来忘记这一点,也许对我自己:
对于VBA(在我的情况下,MS Excel),Public声明应该使变量(或函数)可以被该模块中的其他函数或子例程全局访问,以及任何其他模块.
原来这不是真的,在Forms我的情况下,我也怀疑Sheets,但我还没有验证后者.
简而言之,以下内容在a中创建时不会创建公共的可访问变量Form,因此会崩溃,并说明在mModule1中未定义bYesNo和dRate变量:
(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
Run Code Online (Sandbox Code Playgroud)
但是,如果您进行下面的轻微更改,则一切正常:
(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
Run Code Online (Sandbox Code Playgroud)
mModule1将完美地工作,假设fMyForm始终首先被调用,那么在PrintVals例程运行时,将正确捕获表单中文本框和复选框的值.
老实说,我无法理解MS正在考虑这种变化,但缺乏一致性是对效率的巨大挫折,学习像这样的特质,这些记录很差,以至于谷歌在2013年搜索了一些可能存在的东西.十年或更长时间搜索是如此具有挑战性.
小智 6
第一条评论:
\n\n用户表单和工作表模块是对象模块:它们的行为方式与常规模块不同。但是,您可以以与引用类属性类似的方式引用用户窗体中的变量。在您的示例中,引用 fMyForm.bYesNo 可以正常工作。如果您没有将 bYesNo 声明为 Public,那么表单外部的代码将看不到它,因此当您将其设为 Public 时,它确实与非 Public 不同。\xe2\x80\x93 蒂姆·威廉姆斯 2013-04-11 21:39
\n\n实际上是一个正确的答案...
\n作为社区答案的快速附加答案,仅供注意:
实例化表单时,可以使用表单对象本身,也可以使用 New 创建表单对象的新实例并将其放入变量中。在我看来,后一种方法更干净,因为这使得使用不那么单例。
但是,当您在用户表单中调用 Unload(Me) 时,所有公共成员都将被清除。所以,如果你的代码是这样的:
Dim oForm as frmWhatever
Set oForm = New frmWhatever
Call oForm.Show(vbModal)
If Not oForm.bCancelled Then ' <- poof - bCancelled is wiped clean at this point
Run Code Online (Sandbox Code Playgroud)
我用来防止这种情况的解决方案,对于OP来说也是一个很好的替代解决方案,是将所有带有表单的IO(即所有公共成员)捕获到一个单独的类中,并使用该类的实例来与表格。所以,例如
Dim oFormResult As CWhateverResult
Set oFormResult = New CWhateverResult
Dim oForm as frmWhatever
Set oForm = New frmWhatever
Call oForm.Initialize(oFormResult)
Call oForm.Show(vbModal)
If Not oFormResult.bCancelled Then ' <- safe
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36714 次 |
| 最近记录: |