如何在VBA中将字符串转换为对象?

4
在我的上一个问题中,如何在VBA中在运行时分配属性名称的值?,我学会了使用CallByName在类中设置属性。
然而,这一次,我正在尝试弄清楚如何从字符串中在运行时获取对象。
例如,假设我有一个包含以下数据的字符串:Worksheets("RAW DATA").Range("A1").QueryTable
下面是我可能会尝试的操作,其中上述数据是strParam的输入:
Function GetObject(strParam As String) As Object
    GetObject = SomeFunction(strParam)
End Function

在这种情况下,当针对Worksheets("RAW DATA").Range("A1").QueryTable进行评估时,GetObject应该返回一个QueryTable。在VBA中是否有任何东西可以取代上面示例中的SomeFunction

2
我不知道有没有,但是哥们儿!你的代码一定很难维护啊!!!你确定Excel是你想要做的最好工具吗??? - Christian Payne
Excel显然不是最适合“开发者友好”的编程方法。然而,最终的解决方案必须在Excel中实现,这是我熟悉的东西。在这个问题中,我尽可能地将“初始化变量”存储在实际代码之外。这是一个很好的教训,让我认识到我可能花费太多时间试图让它完美无缺。 - Ben McCormack
我有些好奇,您到底想要做什么,以便在运行时提供任意的VBA代码?在您的示例中,似乎只是尝试获取与给定范围相对应的QueryTable,但这仅意味着将范围地址作为参数而不是整个VBA语句。您不应该需要走整个“软编码”路径... - jtolle
2
我刚看到你之前的评论。像“Worksheets”、“Range”和“QueryTable”这样的东西绝对属于“源代码”的范畴,而不是“初始化变量”。 - jtolle
这是一个非常好的观点。我正在尝试自动化我们公司准备交付清单所涉及的部分流程。这些清单一直存在于Excel工作簿中,因此我正在编写代码以读取输入的订单号,并使用数据库中的数据自动填充其他字段。我试图保持其灵活性并尽可能避免“硬编码”(这适用于简单类型),但我认为现在是时候完成工作了。它已经相当不错了 :) - Ben McCormack
相关链接:https://dev59.com/tFbTa4cB1Zd3GeqP91YV(涉及的功能较少,但是有效)。 - GSerg
3个回答

7

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

如果您使用的是64位的Office,这个答案可能会帮助您让ScriptControl正常工作。


这很棒,但它能用于实例化特定于Excel工作簿范围的自定义定义类吗? - William
@William,请查看此答案,它展示了如何通过名称实例化一个类。 - omegastripes

0

这一次你运气不好。在VBA中没有eval的等效函数(至少在Excel中没有...但在Access VBA中有)。

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


2
这可能是停止尝试黑客VBA并简单交付解决方案的迹象 :) - Ben McCormack

-1

有"Evaluate"方法(或[ ]括号)。我认为它不会完全按照您的期望运行在字符串中找到的VBA代码。您可以在VBA帮助菜单中查找。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接