【问题标题】:Executing VBA code from a string in another workbook从另一个工作簿中的字符串执行 VBA 代码
【发布时间】: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 &amp; "!foo

标签: vba excel


【解决方案1】:

Application.Run 将在创建新工作簿的工作簿中查找模块。尝试(未完全测试)这些方面的东西:

application.run newwb.name & "!foo"

【讨论】:

  • 谢谢。你和我同时发帖!如果您在答案中加上引号,我会接受。
  • @Chris 引用已添加。
【解决方案2】:

您会相信吗?在 18 小时内摸不着头脑后,我发布了一个 SO 问题,然后在 5 分钟内我自己意识到了答案。

问题出在 Application.Run 的语法上。显然,在调用工作簿中运行过程时,可以使用 [ModuleName].[ProcedureName] 格式;但要指定另一个工作簿,语法应为 [WorkbookName]![ProcedureName]。

所以我所要做的就是将行更改为:

Application.Run NewWB.Name & "!foo"

我认为与其删除我的问题,不如直接回答:)

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多