在窗体模块中使用全局集合



为了实现表单更改的撤消功能,我尝试使用"全局"集合。 因此,我在表单模块的顶部有:

Option Compare Database
Public ChgeStack As collection

Private Sub Form_Open(Cancel As Integer)
Set ChgeStack = New collection
End Sub

但是,在窗体空闲的任何时刻,签入即时窗口 (?ChgeStack.count( 都会给出一个错误(需要对象(,指示不再分配集合。 (在form_open结束时中断会产生正确的零计数,因此已分配(
这里有什么问题?

"...在即时窗口 (?ChgeStack.count( 中检入会给出一个错误(需要对象(,指示集合不再 分配。

否,在"即时"窗口中,ChgeStack在窗体的上下文之外。 在这种情况下,ChgeStack是一个空变量,而不是窗体中的集合对象,并且没有.Count方法。

如果要从"即时"窗口检查集合的计数,请告知 Access 你想要ChgeStack哪个是窗体的成员:

? Forms("YourFormNameHere").ChgeStack.Count

或者,您可以在窗体的代码中添加一个断点,触发它,然后在中断模式下尝试在"即时"窗口中尝试原始方法 (? ChgeStack.count(。 在这种情况下,ChgeStack将作为表单的成员进行评估。

谢谢。我已经尝试了所有这些,结果相同:在代码中的某个断点处检查时,集合存在,但在任何代码完成运行后不再存在(它似乎无法生存(。 但是,当我将集合声明性作为全局模块放置在直接模块(而不是表单的模块(中时,一切都按我的预期工作。 所以,问题解决了。 (顺便说一下,VBA 不接受表单模块中的全局变量......——可能是因为它实际上是一个类?(

我建议在代码模块中声明您的集合,然后它可以在任何地方访问,并将继续存在于您的表单之外。

如果在整个项目中可见是一个问题,请重命名它,以便您或其他任何人知道它的用法。

Public colChgeStack_YourFormNameHere As New Collection

最新更新