gpt4 book ai didi

c# - 如何从 C# 访问 Excel VBA 中的类模块?

转载 作者:行者123 更新时间:2023-12-02 16:54:53 26 4
gpt4 key购买 nike

我有一个带有类模块的 Excel 加载项。我想在 C# 中实例化类模块并调用它的方法。我该怎么做?

最佳答案

如果您确实需要访问该类的实例,您可以执行以下操作:

  • 为您想要从 VBA 类公开的 COM 接口(interface)生成类型库(例如 IMyComInterface)

  • 在 VBA 项目中添加对此类型库的引用

  • 在 VBA 类模块中实现接口(interface) - 例如MyVbaClass(使用 Implements 关键字):

    Option Explicit
    Implements IMyComInterface

    Private Sub IMyComInterface_SomeMethod(...)
    ...
    End Sub
    ...
  • 在 C# 项目中引用相同的类型库

  • 使用接受 VBA 接口(interface)实例引用的方法创建 ComVisible C# 类。像这样的东西:

    public class MyVbaLoader
    {
    public IMyComInterface MyComInterface
    {
    get { return myComInterface; }
    set { myComInterface = value; }
    }
    }
  • 在 VBA 标准模块中编写一个“工厂”方法,该方法将一个对象作为 ByRef 参数。该对象应假定作为参数传递的对象具有属性“MyComInterface”,并应将此属性设置为 VBA 类 MyClass 的新实例。

    Public Sub MyFactoryMethod(MyVbaLoader As Object) 
    Dim objClass As MyVbaClass
    Set objClass = New MyVbaClass
    ... any initialization of objClass here ...

    ' Pass a reference to the VBA class to the C# object MyVbaLoader
    MyVbaLoader.MyComInterface = objClass
    End Sub
  • 从 C# 代码中调用工厂方法。假设您已打开工作簿并在 VBA 代码中有一个引用“工作簿”,则代码将如下所示:

    MyVbaLoader loader = new MyVbaLoader();
    workbook.Application.Run("MyModule.MyFactoryMethod", loader, Type.Missing, ... , Type.Missing);
    // we now have a reference to the VBA class module in loader.MyComInterface
    // ...

如您所见,它相当复杂。如果没有您要解决的问题的更多细节,很难说这种复杂性是否合理,或者是否有更简单的解决方案。

如果上述内容不清楚,请告诉我,我会尽力澄清。

基本上,您无法使用 Application.Run 从 C# 代码调用的 VBA 宏返回值,因此您必须通过值传递一个对象,该对象具有可以从 VBA 调用的方法或属性来设置实例。

关于c# - 如何从 C# 访问 Excel VBA 中的类模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1731496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com