全局variables在添加带有代码的命令button时重置

我有这段简短的代码

Public n As Integer Public Sub Foo() For i = 0 To 4 MyModule.n = MyModule.n + 1 Next i End Sub 

它是在名为MyModule的模块中定义的。 此代码正常工作:第一次执行后,'MyModule.n'的值为5.执行第二次后,它的值为10,依此类推。

当我扩展代码时,添加一个CommandButton并将其放在工作表上,全局variablesMyModule.n在每次新的Foo调用时都失去它的值:

 Public n As Integer Public Sub Foo() Dim btn As OLEObject For i = 0 To 4 Set btn = Worksheets("Aufträge").OLEObjects.Add(ClassType:="Forms.CommandButton.1", _ Left:=122, Top:=321, Width:=30, Height:=30) MyModule.n = MyModule.n + 1 Next i End Sub 

该代码似乎工作,因为命令button被创build并正确放置。 为什么执行第二个代码片段时全局variables复位?

此外,我不能在第二个代码片段的For循环之后或之内放置一个断点。 我收到消息此时Can't enter break mode at this time

基于search我做了我的结论是,你不能dynamic地添加控件到工作表并保留variables的状态。

这是为什么:添加button将强制工作表转到devise模式,从而重置variables。

支持链接

  1. http://www.pcreview.co.uk/forums/dynamically-adding-activex-controls-via-vba-kills-global-vba-heap-t3763287p2.html

  2. http://support.microsoft.com/kb/231089

第一个例子你不需要使用下一个循环。 你为什么不这样做:

 Public n As Integer Public Sub Foo() MyModule.n = 5 End Sub 

这将在一个操作中做到这一点。

在第二个例子中,你不需要添加一个button,你可以添加5个button。 检查“For Next”的帮助。