如何在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
- excel 2010 vba循环通过声明的variabels语法结果编译错误variables未定义
- Excel – VBA:从Sub传递variables到Userform
- ByRef参数与Excel中的VBA不匹配
- 如何为每个vba excel分配input框input到variables
- 我如何计算Excel中的单元格? 需要统计有多less说赢,有多less说失去
- 我怎么总是将当前的variables值传递给一个Python函数?
- SUMIF与可变范围
- Excel VBA – 如何使用名称中的variables来打开用户窗体
- 将Excel单元格作为variables读入Stata全局variables