【发布时间】:2018-03-21 10:53:41
【问题描述】:
我想执行 VBA 代码,其中代码本身是在运行时从字符串构建的
我已经通过这个现有的 SO 答案找到了如何做到这一点: How to run a string as a command in VBA
为方便参考,解决方法如下:
Sub Testing()
StringExecute "MsgBox" & """" & "Job Done!" & """"
End Sub
Sub StringExecute(s As String)
Dim vbComp As Object
Set vbComp = ThisWorkbook.VBProject.VBComponents.Add(1)
vbComp.CodeModule.AddFromString "Sub foo()" & vbCrLf & s & vbCrLf & "End Sub"
Application.Run vbComp.Name & ".foo"
ThisWorkbook.VBProject.VBComponents.Remove vbComp
End Sub
简而言之,它在同一个工作簿中创建了一个新模块;根据指定的字符串写一个sub;执行子程序;然后删除模块 - 都在同一个运行时进程中。这很好用。
但是,如果我想对 ThisWorkbook 以外的任何其他工作簿执行操作怎么办?我正在尝试以下修改后的代码:
Option Explicit
Dim NewWB As Workbook
Sub Testing()
Set NewWB = Workbooks.Add
StringExecute "MsgBox" & """" & "Job Done!" & """"
End Sub
Sub StringExecute(s As String)
Dim vbComp As Object
Set vbComp = NewWB.VBProject.VBComponents.Add(1) ' Note the use of NewWB
vbComp.CodeModule.AddFromString "Sub foo()" & vbCrLf & s & vbCrLf & "End Sub"
Application.Run vbComp.Name & ".foo" ' <-- Error on this line
NewWB.VBProject.VBComponents.Remove vbComp
End Sub
如您所见,此代码是相同的,但用于将 ThisWorkbook 替换为 NewWB。但是它会在 Application.Run 行导致错误弹出:
运行时错误“1004”:无法运行宏“Module1.foo”。该工作簿中的宏可能不可用,或者所有宏都可能被禁用。
有谁知道为什么这不适用于新工作簿?我已经尝试在创建 NewWB 后通过代码添加对 VBA 可扩展性的引用(NewWB.VBProject.References.AddFromGuid "{0002E157-0000-0000-C000-000000000046}", 5, 0) - 但这没有帮助。
【问题讨论】:
-
Application.Run将在创建新工作簿的工作簿中查找模块。试试application.run newwb.name & "!foo