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