VBA在运行时更改excel代码并执行它



我想更改Excel中的VBA代码模块并执行新代码。启动程序前:

SUB1()
msgbox "O L D"
ENDSUB
Main program:
Delete_SUB1
Create_NewSUB1
CALL SUB1
Remark: Create_SUB1 creates the follow code:
SUB1()
msgbox "N E W"
ENDSUB

问题:代码已更改,但Excel仍执行旧版本。我试过:

  • A(.ActiveCodePane
  • B( 在两个工作簿之间切换
  • C( 打开/关闭解决了问题,但花费的时间太长。(对于一个人工智能应用程序,我需要它循环1000次(

有什么想法吗?

我本来打算写这是不可能的,但经过反复尝试,我找到了一种方法来做你想做的事。

其基本思想是将动态部分放在一个单独的工作簿中,并通过Application.Run调用它。这样做,编译器似乎完成了它的工作,但只针对具有动态代码的工作簿。

如果代码在同一工作簿中,并且您找到了编译代码的方法,它将重置全局变量,从而丢失继续执行的信息,并且迟早会自动停止执行或崩溃。

我不是说这是个好主意,也不是说这在长时间跑步时会起作用(我认为神经元网络经常运行,直到它们得到结果(。特别是你需要确保动态代码永远不会有任何语法错误,否则整个过程将被一个";语法错误";消息,并且这不能用任何On Error...处理程序来处理,因为它不是运行时错误。

这是我用来测试的代码:

Global GlobalCount As Long ' Using a global to prove that it is not reset by compiler
Sub test()
Dim i As Integer
For i = 1 To 100
CreateAndRunProc
Next
End Sub
Sub CreateAndRunProc()
GlobalCount = GlobalCount + 1

Dim code(1 To 3) As String
code(1) = "Sub testOnTheFly()"
code(2) = "    Debug.print " & """Hello " & GlobalCount & " at " & Time & """"
code(3) = "End Sub"

' Write the Sub "testOnTheFly" into module "modTest" of Workbook "OnTheFlyChild.xlsm"
WriteSub Workbooks("OnTheFlyChild.xlsm"), "modTest", code
' Call the newly created Sub
Application.Run "'OnTheFlyChild.xlsm'!testOnTheFly"
End Sub
' Replace the complete code of module with the provided code
Sub WriteSub(CodeWB As Workbook, moduleName As String, code As Variant)
Dim project As VBProject, component As VBComponent
Set project = CodeWB.VBProject
Set component = project.VBComponents(moduleName)

component.CodeModule.DeleteLines 1, component.CodeModule.CountOfLines
Dim i As Integer
For i = LBound(code) To UBound(code)
component.CodeModule.InsertLines i, code(i)
Next
End Sub

玩得开心!

最新更新