Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何在VBA中将字符串作为命令运行_Excel_Vba_Variables_Command_Eval - Fatal编程技术网

Excel 如何在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“作业完成!”一样运行,并只打印: 工作完成了 简单的回答是,你不能那样做(你不应该那样做),但是。。。阅读以下内容,找出原因并了解解

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

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”函数吗?@iesusson
eval
不是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