如何评估一个string到VBA中的对象?

在我之前的问题中, 我如何为VBA中的运行时提供属性名称的属性赋值? ,我学会了在运行时使用CallByName在类中设置一个属性。

然而,这一次,我试图找出如何从string运行时获得一个对象。

例如,假设我有一个包含以下数据的string: Worksheets("RAW DATA").Range("A1").QueryTable

以下是我可能试图做的地方,上面的数据是strParam的input:

 Function GetObject(strParam As String) As Object GetObject = SomeFunction(strParam) End Function 

在这种情况下,GetObject在对Worksheets("RAW DATA").Range("A1").QueryTable进行求值时应该返回一个QueryTable, Worksheets("RAW DATA").Range("A1").QueryTable 。 从上面的例子中,有什么可以代替SomeFunction VBA吗?

这次你倒霉了。 没有VBA相当于eval (不在Excel中,无论如何…在Access VBA中)。

(Application.Evaluate()将string评估为Excelexpression式,而不是VBA代码。)

活动脚本引擎可以帮助你。 实例化ScriptControl ActiveX,使用.AddObject()方法.AddObject() Excel的Application对象的引用添加到脚本控件的执行环境中,将第三个参数设置为True以使所有Application成员都可访问。 然后,只需使用.Eval()方法来评估任何属性或方法,这是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正常工作。

有“评估”方法(或[]括号)。 我不认为它会做到你所期望的 – 就像在string中find运行的VBA代码一样。 您可以在VBA帮助菜单中查找它。