我正在尝试将我的代码模块重新用于循环运行(这将在不同的循环中更改一些数据);但是,我意识到从第二个循环开始,宏仍在运行旧脚本。知道如何确保宏运行更新后的脚本(我将始终在每个循环中删除并重新创建脚本)吗?
实际的笔迹很长,为简化起见,我只提取我所指的区域。我没有错误地运行它,只是从第二个循环开始,我检查了我重新创建的模块是否具有更新的脚本,但是宏仍在运行第一个循环脚本,这对我来说很奇怪。
要写入模块的脚本存储在excel sheet3中,并且在每个新循环开始后都会更改
Sub write_module()
For i = 1 To 2
Dim VBProj As VBIDE.VBProject
Dim VBComp, comp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Set VBProj = ActiveWorkbook.VBProject
Set VBComp = VBProj.VBComponents("ZC553_MS")
Set CodeMod = VBComp.CodeModule
script_lr = Sheet3.Cells(Rows.Count, 8).End(xlUp).Row
LineNum = 2
With ActiveWorkbook.VBProject.VBComponents("ZC553_MS").CodeModule
' .DeleteLines 2, VBComp.CodeModule.CountOfLines - 2
For j = 1 To script_lr
.InsertLines LineNum, Sheet3.Cells(j, 8)
LineNum = LineNum + 1
Next j
End With
zc553_master
Next i
End Sub
答案 0 :(得分:1)
尝试使用
Application.Run "zc553_master"
代替
zc553_master
用于调用动态编写的过程
这对我来说很好:
Sub Tester()
Dim i As Long, cm As CodeModule
For i = 1 To 5
Set cm = ActiveWorkbook.VBProject.VBComponents("ZC553_MS").CodeModule
With cm
.DeleteLines 2, 3
.InsertLines 2, "Sub zc553_master()"
.InsertLines 3, " Debug.Print ""Version " & i & """"
.InsertLines 4, "End Sub"
End With
DoEvents
Debug.Print "calling", i
Application.Run "zc553_master"
'zc553_master
Next i
End Sub
输出:
calling 1
Version 1
calling 2
Version 2
calling 3
Version 3
calling 4
Version 4
calling 5
Version 5
...但是直接调用zc553_master
只是崩溃崩溃或似乎什么也没发生。
不过,您尝试使用此方法解决的实际问题是什么?很难想象使用静态过程和传递参数无法模仿的东西。
答案 1 :(得分:0)
我需要清除代码模块的全部内容,包括[Sub()]和[End Sub],以便vba在第一次循环运行后识别代码模块中的更新代码。当您需要重用相同的代码模块名称,但是每次循环运行后都要更改内容时,蒂姆提供了一个很好的例子和正确的做法,所有功劳都归功于他:)