我有下面这段简单的VBA代码,但是我不知道为什么它不起作用。
Sub Run()
test = "MsgBox" & """" & "Job Done!" & """"
Application.Run test
End Sub
我想做的是将VBA命令作为文本放入变量中并作为命令运行。 在这种情况下,我想运行类似于 MsgBox“Job Done!”
的命令并只打印出:
Job Done!
Job Done!
您可能会想要添加自己的字符串"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
如果您需要一种不需要特殊权限的解决方案,并且比硬编码代码具有更高的功能性,我维护了一个库,名为stdLambda
,源自stdVBA
,可用于此类情况:
'Ensure module name is "mainModule"
Public Sub Main()
Call stdLambda.bindGlobal("msgbox", stdCallback.CreateFromModule("mainModule","msgbox"))
x = stdLambda.Create("msgbox(""hello world"")").Run()
End Sub
Public Function msgbox(ByVal sMessage as string) as long
msgbox = VBA.msgbox(sMessage)
End Function
stdLambda
语法类似于 VBA,但它是一种完全嵌入式的编程语言。有关更多详细信息,请参见 文档。
简短回答是,你不能这样做(你不应该这样做),但是……请阅读以下内容以了解原因并找到解决方法!
如您所知,您正在编写编译器代码。您想要运行可读的文本行作为命令,这是不可能的。当您运行程序时,所有内容都被编译成机器语言。当您将该文本行传递给它时,它无法将其识别为命令,您最终会收到错误。您可以传递参数给它:
Sub Run()
test = "Job Done"
MsgBox(test)
End Sub
宏
中编写可执行文件并运行,该文件可以被写成文本文件,然后在同一Sub
中运行(需要注意扩展名)。test
),则需要采取另一种方法。我建议提取可以传递给函数的参数并使用该参数。类似下面这样的东西;Sub Run()
test = "MsgBox" & """" & "Job Done!" & """"
extest = Right(test, Len(test) - 7)
MsgBox (extest)
End Sub
我相信在 Stack Overflow 上有一个相同的问题,但我找不到它。如果找到了,我会把它作为参考。
P.S. 这两篇文章可能有助于找到答案:
另一种解决方案
这需要信任 VB 项目。引用 ExcelForum 并参考 Visual Basic 项目的编程访问未受信任 - Excel
引用:
将你的启用宏的工作簿放在你可以指定为宏友好的文件夹中。
然后打开工作簿。
点击Office按钮 -> Excel选项 -> 信任中心 -> 信任中心设置 -> 可信位置。
然后将存放Excel宏工作簿的文件夹添加为可信位置。
此外,您还需要执行以下步骤:
文件 -> 选项 -> 信任中心 -> 信任中心设置 -> 宏设置 ->
勾选“信任对VBA项目对象模型的访问”旁边的框
关闭并重新打开工作簿。
使用您的宏的人应该执行相同的步骤。
引用完毕。
然后,您可以使用此内容,该内容来自VBA -在Excel中执行字符串作为命令(未经测试)
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的回答实现了上一个解决方案的意图。我在此包含它以完整性为考虑。您可以参考原始答案并点赞。
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
test = "MsgBox" & """" & "Job Done!" & """"
。 - ECodeeval
不是 Excel 函数(Access 有它)。Excel VBA 有 Application.Evaluate
,但不能胜任此任务。这很不幸,但事实就是如此。实际上,我开始回答这个问题的原因是看到了 javascript
标签。Java 有 eval
,你知道的。 - M--
MsgBox
的工作原理。它需要在括号中提供一个参数。 - M--"Job Done!"
吗?我知道这只是伪代码,我想问的是你实际拥有的字符串。你能将参数从中提取出来并传递给函数吗? - M--