在我之前的问题中,如何为 VBA 中在运行时提供属性名称的属性赋值?,我学会了在运行时使用 CallByName 在类中设置属性。
然而,这一次,我试图弄清楚如何在运行时从字符串中获取对象。
例如,假设我有一个包含以下数据的字符串:Worksheets("RAW DATA").Range("A1").QueryTable
.
这是我可能会尝试做的事情,上面的数据是strParam
下面的输入:
Function GetObject(strParam As String) As Object
GetObject = SomeFunction(strParam)
End Function
Run Code Online (Sandbox Code Playgroud)
在这种情况下,GetObject 在对 进行评估时应该返回一个 QueryTable Worksheets("RAW DATA").Range("A1").QueryTable
。VBA 中有什么东西可以代替SomeFunction
上面的例子吗?
Active Scripting Engine 可以为您提供帮助。实例化ScriptControl
ActiveX,使用.AddObject()
方法将ExcelApplication
对象的引用添加到脚本控件的执行环境中,将第三个参数设置True
为也使所有Application
的成员都可以访问。然后只需使用.Eval()
method 来评估任何属性或方法,即Application
的成员。下面的示例显示了Worksheets()
属性的评估:
Sub TestQueryTable()
Dim objQueryTable As QueryTable
Dim strEvalContent As String
strEvalContent = "Worksheets(""RAW DATA"").Range(""A1"").QueryTable"
Set objQueryTable = EvalObject(strEvalContent)
objQueryTable.Refresh
MsgBox objQueryTable.Connection
End Sub
Function EvalObject(strEvalContent As String) As Object
With CreateObject("ScriptControl")
.Language = "VBScript"
.AddObject "app", Application, True
Set EvalObject = .Eval(strEvalContent)
End With
End Function
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 64 位 Office,此答案可能会帮助您开始ScriptControl
工作。