如何在VBA中将字符串求值为对象?

如何在VBA中将字符串求值为对象?,vba,excel,Vba,Excel,在上一个问题中,我学习了在运行时使用CallByName在类中设置属性 然而,这一次,我试图弄清楚如何在运行时从字符串获取对象 例如,假设我有一个包含以下数据的字符串:工作表(“原始数据”).Range(“A1”).QueryTable 如果上面的数据是下面strParam的输入,我可能会尝试这样做: Function GetObject(strParam As String) As Object GetObject = SomeFunction(strParam) End Functi

在上一个问题中,我学习了在运行时使用CallByName在类中设置属性

然而,这一次,我试图弄清楚如何在运行时从字符串获取对象

例如,假设我有一个包含以下数据的字符串:
工作表(“原始数据”).Range(“A1”).QueryTable

如果上面的数据是下面
strParam
的输入,我可能会尝试这样做:

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

在这种情况下,当根据
工作表(“原始数据”).Range(“A1”).QueryTable
进行计算时,GetObject应该返回一个QueryTable。VBA中是否有任何东西可以取代上述示例中的
SomeFunction

有“Evaluate”方法(或[]括号)。我不认为它会完全满足您的期望-就像在字符串中找到的运行VBA代码一样。您可以在VBA帮助菜单中查找它。

这次您运气不好。没有与
eval
等效的VBA(无论如何,Excel中没有…Access VBA中有)


(Application.Evaluate()将字符串计算为Excel表达式,而不是VBA代码。)

活动脚本引擎可以帮助您。实例化
ScriptControl
ActiveX,使用
.AddObject()
方法将对Excel的
应用程序
对象的引用添加到脚本控件的执行环境中,将第三个参数设置为
True
以使所有
应用程序
的成员也可访问。然后只需使用
.Eval()
方法来计算任何属性或方法,即
应用程序的成员。下面的示例显示了对
工作表()
属性的评估:

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
正常工作。

据我所知不是这样,但伙计!你的代码必须是坚果才能维护!!!你确定Excel是你想要做的事情的最佳工具吗???Excel肯定不是“开发人员友好”编程方法的最佳解决方案。但是,最终的解决方案必须是Excel,这是我熟悉的。在这个问题中,我试图在实际代码之外尽可能多地存储“初始化变量”。这是一个很好的教训,我认为我浪费了太多的时间试图使这个完美。我有点好奇…你到底想做什么,你想在运行时提供任意的VBA代码?在您的示例中,您似乎只是试图获取与给定范围相关的查询表,但这只是意味着将范围地址设置为参数,而不是整个VBA语句。你不需要走整个“软编码”的道路……我刚才看到了你之前的评论。像“工作表”、“范围”和“查询表”这样的东西肯定属于“源代码”而不是“初始化变量”的范畴。这是一个非常好的观点。我正在尝试自动化我们公司准备交货清单的部分流程。这些已经作为Excel工作簿存在,所以我正在编写代码来读取输入的订单号,并使用数据库中的数据自动填充其他字段。我试图保持它的灵活性,并尽可能避免“硬编码”(这适用于简单类型),但我认为是时候完成这项工作了。它的工作相当好,无论如何:)这可能是一个迹象,停止尝试黑客VBA和简单地交付解决方案:)哇,这是答案。真不敢相信它竟然连选票都没有!Plz帖子作为答案,太棒了!许多论坛的人都在问如何做到这一点,答案总是“你不能”。这很好,但它可以用来实例化作用域为特定Excel工作簿的自定义定义类吗?@William check,它展示了如何按名称实例化类。