模块variables无法通过CodeModule.InsertLines调用

我正在试图在运行时将一个button添加到我的工作表。 这个button应该只显示在运行期间也创build的不同的工作表。 我添加了这样的button:

Dim btnShowTable Set btnShowTable = ActiveSheet.Buttons.Add(rowRange.Left + 10, rowRange.Top + 10, rowRange.Width - 20, rowRange.Height - 20) btnShowTable.Caption = "Show table data" btnShowTable.OnAction = AddClickHandler_ShowSheet("ClickModule", "TableView", tableSheet) Function AddClickHandler_ShowSheet(ByVal moduleName As String, ByVal btnName As String, ws As Worksheet) Dim methodName As String methodName = btnName & "_" & AddClickHandler_GetId() & "_Click" Dim LineNum As Long Dim VBCodeMod As CodeModule Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(moduleName).CodeModule With VBCodeMod LineNum = .CountOfLines + 1 .InsertLines LineNum, _ "Sub " & methodName & "()" & Chr(13) & _ " " & ws.CodeName & ".Select" & Chr(13) & _ "End Sub" End With AddClickHandler_ShowSheet = moduleName & "." & methodName End Function 

创buildbutton的函数在一个模块中,而AddClickHandler_ShowSheet在另一个模块中。

这个想法是,我将有单独的模块,将包含所有这些点击处理程序,以便我可以轻松地删除所有这些。 这工作正常。 处理程序已创build,button按预期工作。 我的问题是,当这个InsertLines方法被调用时,包含button创buildfunction的模块中的所有模块variables都将丢失。 我有4个模块variables

 Dim xmldoc As New MSXML2.DOMDocument Dim xmlDataMap() As DataNode Dim xmlDataMapLast As Integer Dim xmlTables As Collection 

在调用InsertLine之后,除了包含正确值为14的xmlDataMapLast之外,它们全部变为空的。

如果我尝试debugging此方法,当我跨过InserLines调用时出现错误“无法在此时进入中断模式”。 而我不能debugging任何东西,直到我的function结束。 如果我注释掉了AddClickHandler_ShowSheet的调用,我的variables保持不变,所以它必须是与那个调用相关的东西。

我想要做到不可能,还是只是做错了?

模块重置并不奇怪。
事实上,我也希望价值types也可以重置。 他们幸存下来有些惊讶。

为什么你需要将variables存储在用于代码生成的模块中?
将它们存储在一个单独的模块中,并仅使用该模块生成代码。


说了这么多,你为什么要dynamic地添加代码呢?
OnAction支持参数:

 Sub asdff() Worksheets(1).Buttons(1).OnAction = "'Module1.ParametrizedHandler 5, ""Hi there""'" End Sub Public Sub ParametrizedHandler(ByVal foo As Long, ByVal bar As String) MsgBox foo, vbInformation, bar End Sub 

请注意调用string中没有括号,以及其中的单引号。