在我之前的问题中,如何为 VBA 中在运行时提供属性名称的属性赋值?,我学会了在运行时使用 CallByName 在类中设置属性。
然而,这一次,我试图弄清楚如何在运行时从字符串中获取对象。
例如,假设我有一个包含以下数据的字符串:Worksheets("RAW DATA").Range("A1").QueryTable.
这是我可能会尝试做的事情,上面的数据是strParam下面的输入:
Function GetObject(strParam As String) As Object
    GetObject = SomeFunction(strParam)
End Function
在这种情况下,GetObject 在对 进行评估时应该返回一个 QueryTable Worksheets("RAW DATA").Range("A1").QueryTable。VBA 中有什么东西可以代替SomeFunction上面的例子吗?
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
如果您使用的是 64 位 Office,此答案可能会帮助您开始ScriptControl工作。
| 归档时间: | 
 | 
| 查看次数: | 7912 次 | 
| 最近记录: |