如何评估一个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帮助菜单中查找它。