如何在VBA中运行一个string作为命令

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

Sub Run() test = "MsgBox" & """" & "Job Done!" & """" Application.Run test End Sub 

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

任务完成!

你可能会join你自己的string“Executer”:

 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 

简单的答案是,你不能这样做(你不应该这样做),但是…阅读以下内容,找出原因并看到解决办法!

正如你所知道的,你正在编写代码。 你想要做的就是将一行可阅读的文本作为一个不可能的命令。 当你运行程序的时候,所有的东西都被编译成机器语言。 当你将这行文本传递给它时,它不能识别它作为一个命令,你最终会得到一个错误。 你可以做的是传递参数:

 Sub Run() test = "Job Done" MsgBox(test) End Sub 

你也可以运行一个可执行文件,这个可执行文件可以写成macro的文本文件,然后在同一个Sub运行(扩展需要照顾)。

如果你不能改变variables(即test ),那么你需要采取另一种方法。 我会build议像提取可以传递给函数的参数并使用它。 像下面的东西;

 Sub Run() test = "MsgBox" & """" & "Job Done!" & """" extest = Right(test, Len(test) - 7) MsgBox (extest) End Sub 

我相信也有同样的问题,但我找不到。 如果find它,我将把它作为参考。

PS这两个post可能有助于find答案:

访问VBA – 用string参数评估函数

Excel VBA – 如何以一行代码运行一个string

另一个解决scheme

这需要相信VB项目。 从ExcelForum引用和引用到Visual Basic项目的编程访问不受信任 – Excel

引用:

将您已启用macros的工作簿放在一个您可以指定为macros友好的文件夹中。

然后打开工作簿。

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

然后,将您的文件夹(您拥有启用Excelmacros的工作簿的位置)添加为受信任的位置。

你也需要这样做:

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

closures并重新打开您的工作簿。

那些使用你的macros应该通过相同的步骤。

引文结束。

那么你可以使用这个我从VBA得到的– 在Excel中执行string命令 (这是没有testing)

 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 

@ASH答案是最后一个解决scheme实施的东西。 为了完整起见,我在这里包括它。 你可以参考原来的答案,并把它投票。

 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