在我之前的问题How do I assign a value to a property where the property name is supplied at runtime in VBA?中,我学会了使用CallByName在运行时在类中设置属性。
但是,这一次,我试图弄清楚如何从字符串中获取运行时的对象。
例如,假设我有一个包含以下数据的字符串:Worksheets("RAW DATA").Range("A1").QueryTable
。
以下数据是下面strParam
的输入,我可能会尝试这样做:
Function GetObject(strParam As String) As Object
GetObject = SomeFunction(strParam)
End Function
在这种情况下,GetObject应在针对Worksheets("RAW DATA").Range("A1").QueryTable
进行评估时返回QueryTable。 VBA中有什么可以取代上面例子中的SomeFunction
吗?
答案 0 :(得分:3)
Active Scripting Engine可以为您提供帮助。实例化ScriptControl
ActiveX,使用.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
属性的评估:
ScriptControl
如果您使用的是64位Office,this answer可能会帮助您class JsonTable(models.Model):
data = JSONField()
type = models.IntegerField()
工作。
答案 1 :(得分:1)
这次你运气不好。没有相当于eval
的VBA(不管是在Excel中......还是在Access VBA中)。
(Application.Evaluate()将字符串计算为Excel表达式,而不是VBA代码。)
答案 2 :(得分:-1)
有“评估”方法(或[]括号)。我认为它不会完全符合您的预期 - 就像在字符串中找到的运行VBA代码一样。您可以在VBA帮助菜单中查找。