首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在VBA中以命令形式运行字符串

如何在VBA中以命令形式运行字符串
EN

Stack Overflow用户
提问于 2017-04-04 19:48:12
回答 3查看 16.2K关注 0票数 10

下面有一个简单的VBA代码,我不知道为什么不能工作。

代码语言:javascript
运行
复制
Sub Run()
    test = "MsgBox" & """" & "Job Done!" & """"
    Application.Run test     
End Sub

我想要做的是将VBA命令作为文本放到变量中,并作为命令运行它。在这种情况下,我想像MsgBox "Job Done!"一样运行并打印:

工作完成了!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-04 21:18:39

您可能会通过添加自己的字符串“Executer”而受到诱惑:

代码语言:javascript
运行
复制
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 Testing()
    StringExecute "MsgBox" & """" & "Job Done!" & """"
End Sub
票数 9
EN

Stack Overflow用户

发布于 2017-04-04 20:01:31

简短的回答是,你不能那样做(你不应该那样做),但是.阅读下面的内容,找出原因,并看到周围的工作!

如您所知,您正在用编译器编写代码。您想要做的是以命令的形式运行可读的文本行,这是不可能的。当您运行程序时,所有这些都被编译成机器语言。当您将这一行文本传递给它时,它无法将其识别为命令,最终将得到一个错误。您所能做的就是向它传递参数:

代码语言:javascript
运行
复制
Sub Run()
 test = "Job Done" 
 MsgBox(test)
End Sub

您还可以运行一个可执行文件,该可执行文件可以写成macro中的文本文件,然后在同一个Sub中运行(需要处理扩展名)。

如果不能更改变量(即test),则需要对其采取另一种方法。我建议提取可以传递给函数的参数并使用它。像下面这样的东西;

代码语言:javascript
运行
复制
Sub Run()

 test = "MsgBox" & """" & "Job Done!" & """"

 extest = Right(test, Len(test) - 7)

 MsgBox (extest)

End Sub

我想也有同样的问题,但我找不到。如果找到了,我会把它作为参考。

这两篇文章可能有助于找到一个答案:

使用字符串参数访问VBA -求值函数

Excel VBA -如何将字符串作为一行代码运行

另一个解决方案

这需要信任VB项目。引用ExcelForum和引用对Visual项目的编程访问不受信任- Excel

引用:

将启用宏的工作簿放在可以指定为宏友好的文件夹中。

然后打开工作簿。

Click on the Office Button -> Excel Options -> Trust Center -> Trust Center Setting -> Trusted Locations.

然后,将文件夹(其中有启用Excel宏的工作簿)添加为受信任的位置。

此外,您还需要这样做:

File -> Options -> Trust Center -> Trust Center Setting -> Macro Setting -> Check the box beside "Trust access to the VBA project object model"

关闭并重新打开您的工作簿。

那些使用您的宏的人应该经历同样的步骤。

取消报价。

然后您可以使用我从VBA -在Excel中以命令形式执行字符串 (这没有测试)获得的

代码语言:javascript
运行
复制
Sub test()
 Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
 VBComp.Name = "NewModule"
 Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("NewModule").CodeModule

 Dim test As String
 test = "MsgBox " & """" & "Job Done!" & """"

 With VBCodeMod
    LineNum = .CountOfLines + 1
    .InsertLines LineNum, _
    "Sub MyNewProcedure()" & Chr(13) & test & Chr(13) & "End Sub"
 End With
 'run the new module
 Application.Run "MyNewProcedure"
 UserForm1.Show
 'Delete the created module
 ThisWorkbook.VBProject.VBComponents.Remove VBComp
End Sub

@A.S.H答案做最后一个解决方案打算实现的事情。为了完整起见,我把它包括在这里。你可以参考原来的答案并投赞成票。

代码语言:javascript
运行
复制
Public 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 Testing()
    StringExecute "MsgBox" & """" & "Job Done!" & """"
End Sub
票数 1
EN

Stack Overflow用户

发布于 2022-02-01 18:29:37

我遇到了类似的变化:宏名在“控制规范”工作表中。在parameter中添加了一个带有“onAction”参数的自定义带状。' tag‘名称返回到Ribbon回调宏中,然后用于查找基于XML标记名运行的宏名。到目前为止是有意义的!我已经在现有的代码Module=m0_RibbonCallBack中使用了处理subs。在m0_RibbonCallBack模块中,当我用tagName=Reset2CellA2单击丝带按钮时,我想运行子name=mResetToCellA2。在“控制规范”工作表中,我在tagname=Reset2CellA2上执行了一个tagname=Reset2CellA2()操作,并从第3列(onAction) ="mResetToCellA2“返回字符串值。现在我需要在VBA端运行宏字符串(macroName)名称!最后,我用以下简单的一行来解决这个挑战: Application.Run "m0_RibbonCallBack.“& macroName

干杯!

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43216390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档