【问题标题】:Use a function of an ATL library in a vbasic macro in Excel在 Excel 的基本宏中使用 ATL 库的功能
【发布时间】:2013-09-26 23:56:58
【问题描述】:

我成功地在 C++ 中创建了一个 ATL 库,它执行一些操作并返回解决方案。所以我通过使用自动化拥有了excel中的所有功能。现在我想创建一个宏,它可以按正确的顺序执行所有功能,然后可能会关联一个按钮。 所以我写了这个宏:

Sub Macro_test()

 Dim r As Integer

 r = setValInput(Range("F21"), Range("G21"))
 r = initializeCalculation()
 Range("C24") = r
 r = getResult("C21")


End Sub

如果我构建这个 Excel 表示函数 setValInput 不确定。 ATL 的类被命名为 OPclass,也许我需要为此做点什么?

【问题讨论】:

    标签: excel atl vba


    【解决方案1】:

    您使用CreateObject 方法创建对象。参数是您在创建 COM 类时提供给 C++ ATL 向导的 ProgID 值,或者/您可以在项目 .RGS 文件中查找它。

    代码sn-p:

       Set MyServer = CreateObject("ProgettoOPserver")
       MyServer.setValInput(Range("F21"), Range("G21"))
    

    通过实现接口公开的 ATL 类上的方法和属性将自动可用于您的 VBA 脚本代码。

    另一种选择是首先添加对外部 COM 服务器(基于 ATL 的库)的引用,而不是 CreateObject,您可以使用 New 运算符。查看更多信息:How to add a reference programmatically。优点是您将能够在对象浏览器中看到可用的方法。

    【讨论】:

    • 谢谢。我已经做到了,ProgID 是 'ProgettoOPserver' 所以我必须写 CreateObject("ProgettoOPserver") ??我试过了,但继续说功能不明确。我必须用类标识符编写函数吗?在示例 Web.getResults?
    • 我更新了代码sn-p。从这一点来看,它已经很好地设置了,进一步的问题是另一端 - ATL/C++ 实现。
    【解决方案2】:

    作为类对象成员的方法需要从类对象的实例中调用。由于您已经创建了可能包含方法 setValInputOPClass 模块,请尝试以下操作:

    Dim op as New OPClass
    Debug.Print op.setValInput(Range("F21"),Range("G21"))
    

    根据 Roman 的回答,这假设您在其他地方创建了该对象。

    【讨论】:

    • 谢谢。我试图用类名和 ProgID 来做,但说类型不确定!
    • 等等,我不明白,我必须创建如 Roman 所示的对象,然后用 Dim OPCLASS 声明?
    • 嗯,我不确定你的类对象是什么/做什么,所以我很难说。无论如何,看起来 Roman 的建议解决了你的问题,干杯!
    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2012-10-19
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多