如何将字符串评估为 VBA 中的对象?

Ben*_*ack 4 excel vba

在我之前的问题中,如何为 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上面的例子吗?

ome*_*pes 6

Active Scripting Engine 可以为您提供帮助。实例化ScriptControlActiveX,使用.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工作。