Excel 如何在VBA中将字符串作为命令运行
我有下面这个简单的VBA代码,我不知道为什么它不工作Excel 如何在VBA中将字符串作为命令运行,excel,vba,variables,command,eval,Excel,Vba,Variables,Command,Eval,我有下面这个简单的VBA代码,我不知道为什么它不工作 Sub Run() test = "MsgBox" & """" & "Job Done!" & """" Application.Run test End Sub 我要做的是将VBA命令作为文本放入变量中,并作为命令运行它。在这种情况下,我希望像MsgBox“作业完成!”一样运行,并只打印: 工作完成了 简单的回答是,你不能那样做(你不应该那样做),但是。。。阅读以下内容,找出原因并了解解
Sub Run()
test = "MsgBox" & """" & "Job Done!" & """"
Application.Run test
End Sub
我要做的是将VBA命令作为文本放入变量中,并作为命令运行它。在这种情况下,我希望像MsgBox“作业完成!”
一样运行,并只打印:
工作完成了
简单的回答是,你不能那样做(你不应该那样做),但是。。。阅读以下内容,找出原因并了解解决方法 正如您所知,您正在编译器中编写代码。您要做的是以命令的形式运行人类可读的文本行,这是不可能的。当你运行程序时,所有的程序都被编译成机器语言。当您将该行文本传递给它时,它无法将其识别为命令,您将最终得到一个错误。您可以做的是向它传递参数:
Sub Run()
test = "Job Done"
MsgBox(test)
End Sub
您还可以运行一个可执行文件,该文件可以作为文本文件写入宏
,然后在同一子
中运行(需要注意扩展名)
如果无法更改变量(即测试
),则需要采取另一种方法。我建议提取可以传递给函数的参数并使用它。像下面这样
Sub Run()
test = "MsgBox" & """" & "Job Done!" & """"
extest = Right(test, Len(test) - 7)
MsgBox (extest)
End Sub
我相信有一个相同的问题,所以,但我找不到它。我会把它作为参考,如果发现它
另外,这两篇文章可能有助于找到答案:
另一种解决方案
这需要信任VB项目。引用和引用
引述:
将启用宏的工作簿放在可以指定的文件夹中
对宏友好
然后打开工作簿
单击Office按钮->Excel选项->
信任中心->信任中心设置->受信任位置。
然后将文件夹(启用Excel宏的工作簿)添加为
受信任的位置
您还需要执行以下操作:
文件->选项->信任中心->信任中心设置->宏设置->
选中“信任访问VBA项目对象模型”旁边的框
关闭并重新打开工作簿
使用您的宏的用户应该执行相同的步骤
取消报价
然后,您可以使用我从获得的信息(该信息未经测试)
@A.S.H answer完成了最后一个解决方案想要实现的事情。为了完整起见,我把它包括在这里。你可以参考原始答案并投票表决
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
您可能会尝试添加自己的字符串“Executer”:
如果您需要一个不需要特殊权限的解决方案,并且比硬编码代码具有更大的功能,我会从以下位置使用
stdLambda
:
stdLambda
语法类似于vba,但它本身就是一种完全嵌入的编程语言。有关更多详细信息,请参阅。您可能需要编写代码来执行命令。您需要在希望发生这种情况的任何excel实例上手动启用对VBA项目的信任。请澄清您正在尝试做什么?您想直接从Excel单元格运行VBA代码吗?@freginold我想直接从test
变量运行VBA代码。首先,检查MsgBox
的工作方式。它需要一个括号中的参数。@Masoud'MsgBox'的工作原理与我在上面的帖子中所写的一样MsgBox“完成了工作!”
并打印“完成了工作!”。但问题是我不能更改test
变量我知道这一点,但在我的情况下,我不能更改变量,所以它仍然像test=“MsgBox”和“&”Job Done!”&“
没有像其他许多语言一样的“eval”函数吗?@iesussoneval
不是excel函数(Access确实有它)。Excel VBA有应用程序。请评估与作业无关的。这很不幸,但事实就是这样。实际上,我开始回答这个问题的原因是javascript
标记。Java有eval
,其余的你都知道。@Masoud不幸的是,不知道,当你运行第二个子程序时,你只跳过前7个字符,而不是作为命令运行MsgBox。我很感激你的详细回答。重要的是,我同意这种“游戏”通常不被推荐,除非“真的”需要。我发布了一个答案,只是因为我觉得它有点“有趣”,并且显示了VBA的一些反射功能。@ASH我有编译错误:用户定义的类型不是defined@ECode添加对Microsoft Visual Basic For Applications Extensibility x的引用。y@ECode或者可以使用后期绑定。我修改了代码以使用后期绑定,不需要添加任何引用。@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
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
Public Sub Main()
stdLambda.bindGlobal("msgbox", stdCallback.CreateFromModule("mainModule","msgbox"))
stdLambda.Create("msgbox(""hello world"")").Run()
End Sub
Public Function msgbox(ByVal sMessage as string) as long
msgbox = VBA.msgbox(sMessage)
End Function