下面有一个简单的VBA代码,我不知道为什么不能工作。
Sub Run()
test = "MsgBox" & """" & "Job Done!" & """"
Application.Run test
End Sub
我想要做的是将VBA命令作为文本放到变量中,并作为命令运行它。在这种情况下,我想像MsgBox "Job Done!"
一样运行并打印:
工作完成了!
发布于 2017-04-04 21:18:39
您可能会通过添加自己的字符串“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
发布于 2017-04-04 20:01:31
简短的回答是,你不能那样做(你不应该那样做),但是.阅读下面的内容,找出原因,并看到周围的工作!
如您所知,您正在用编译器编写代码。您想要做的是以命令的形式运行可读的文本行,这是不可能的。当您运行程序时,所有这些都被编译成机器语言。当您将这一行文本传递给它时,它无法将其识别为命令,最终将得到一个错误。您所能做的就是向它传递参数:
Sub Run()
test = "Job Done"
MsgBox(test)
End Sub
您还可以运行一个可执行文件,该可执行文件可以写成macro
中的文本文件,然后在同一个Sub
中运行(需要处理扩展名)。
如果不能更改变量(即test
),则需要对其采取另一种方法。我建议提取可以传递给函数的参数并使用它。像下面这样的东西;
Sub Run()
test = "MsgBox" & """" & "Job Done!" & """"
extest = Right(test, Len(test) - 7)
MsgBox (extest)
End Sub
我想也有同样的问题,但我找不到。如果找到了,我会把它作为参考。
这两篇文章可能有助于找到一个答案:
另一个解决方案
这需要信任VB项目。引用ExcelForum和引用对Visual项目的编程访问不受信任- Excel
引用:
将启用宏的工作簿放在可以指定为宏友好的文件夹中。
然后打开工作簿。
Click on the Office Button -> Excel Options -> Trust Center -> Trust Center Setting -> Trusted Locations.
然后,将文件夹(其中有启用Excel宏的工作簿)添加为受信任的位置。
此外,您还需要这样做:
File -> Options -> Trust Center -> Trust Center Setting -> Macro Setting -> Check the box beside "Trust access to the VBA project object model"
关闭并重新打开您的工作簿。
那些使用您的宏的人应该经历同样的步骤。
取消报价。
然后您可以使用我从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
发布于 2022-02-01 18:29:37
我遇到了类似的变化:宏名在“控制规范”工作表中。在parameter中添加了一个带有“onAction”参数的自定义带状。' tag‘名称返回到Ribbon回调宏中,然后用于查找基于XML标记名运行的宏名。到目前为止是有意义的!我已经在现有的代码Module=m0_RibbonCallBack中使用了处理subs。在m0_RibbonCallBack模块中,当我用tagName=Reset2CellA2单击丝带按钮时,我想运行子name=mResetToCellA2。在“控制规范”工作表中,我在tagname=Reset2CellA2上执行了一个tagname=Reset2CellA2()操作,并从第3列(onAction) ="mResetToCellA2“返回字符串值。现在我需要在VBA端运行宏字符串(macroName)名称!最后,我用以下简单的一行来解决这个挑战: Application.Run "m0_RibbonCallBack.“& macroName
干杯!
https://stackoverflow.com/questions/43216390
复制相似问题