Excel VBA代码模块在运行期间未更新

时间:2018-07-26 04:16:46

标签: excel-vba module

我正在尝试将我的代码模块重新用于循环运行(这将在不同的循环中更改一些数据);但是,我意识到从第二个循环开始,宏仍在运行旧脚本。知道如何确保宏运行更新后的脚本(我将始终在每个循环中删除并重新创建脚本)吗?

实际的笔迹很长,为简化起见,我只提取我所指的区域。我没有错误地运行它,只是从第二个循环开始,我检查了我重新创建的模块是否具有更新的脚本,但是宏仍在运行第一个循环脚本,这对我来说很奇怪。

要写入模块的脚本存储在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

2 个答案:

答案 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在第一次循环运行后识别代码模块中的更新代码。当您需要重用相同的代码模块名称,但是每次循环运行后都要更改内容时,蒂姆提供了一个很好的例子和正确的做法,所有功劳都归功于他:)