公共变量是不是真的在公众中的VBA窗体(Public variables are not REALL

2019-08-22 02:40发布

下面是一个问题,我会回答我自己,但它造成的挫折很大,我和我有很多的麻烦在网络上寻找它,所以我在这里张贴在节省其他一些时间和精力的希望,也许我自己,如果我在未来忘记这一点:

对于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与这种变化的思维,但缺乏一致性是一个巨大的吮吸效率,学习idiosyncracies喜欢这些,这都记录如此糟糕,2013年谷歌搜索的东西,可能已经存在了十年或更长时间如此具有挑战性的搜索。

Answer 1:

华富首评:

用户窗体和表模块是对象模块:他们不循规蹈矩的方式作为常规模块相同。 但是,您可以参考变量在一个窗体以类似的方式你如何引用一个类属性。 在您的例子参照fMyForm.bYesNo会正常工作。 如果你不声明bYesNo为Public它不会是可见的代码的形式之外,所以当你把它公开它确实是来自非公有制不同。 蒂姆 - 威廉姆斯4月11日在'13 21:39

实际上是一个正确的答案...



Answer 2:

作为一个快速的附加答案社区的答案,只是抬头:

当你实例化表单,您可以使用窗体对象本身,或者您可以通过使用新的和把它放在一个变量创建表单对象的新实例。 后一种方法是更清洁IMO,因为这使得使用较少单肥胖型。

然而,当您的用户窗体调用卸载(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

溶液I中使用,以防止这一点,并且它是为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


文章来源: Public variables are not REALLY public in VBA in Forms
标签: vba scope