在 Visual C# 项目中向 VBA 公开代码

如果希望两种类型的代码相互交互,可以将 Visual C# 项目中的代码公开给 Visual Basic for Applications (VBA) 代码。

Visual C# 进程不同于 Visual Basic 进程。 有关详细信息,请参阅 如何:在 Visual Basic 项目中向 VBA 公开代码。

适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目。 有关详细信息,请参阅办公室应用程序和项目类型提供的功能。

在 Visual C# 项目中公开代码

若要使 VBA 代码能够调用 Visual C# 项目中的代码,请修改代码,使其对 COM 可见,然后将 ReferenceAssemblyFromVbaProject 属性设置为 设计器中的 True

有关演示如何从 VBA 调用 Visual C# 项目中的方法的演练,请参阅 演练:在 Visual C# 项目中从 VBA 调用代码。

向 VBA 公开 Visual C# 项目中的代码

  1. 打开或创建基于 Word 文档、Excel 工作簿或 Excel 模板的文档级项目,该模板支持宏,并且已包含 VBA 代码。

    有关支持宏的文档文件格式的详细信息,请参阅 合并 VBA 和文档级自定义

    注意

    此功能无法在 Word 模板项目中使用。

  2. 确保允许文档中的 VBA 代码运行,而无需提示用户启用宏。 通过在 Word 或 Excel 的“信任中心”设置中将 Office 项目的位置添加到受信任位置列表中,可以信任要运行的 VBA 代码。

  3. 将想要向 VBA 公开的成员添加到项目中的公共类,并将新成员声明为 公共类。

  4. 将以下内容 ComVisibleAttributeClassInterfaceAttribute 属性应用于要向 VBA 公开的类。 这些特性使类对于 COM 可见,但不生成类接口。

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    
  5. 重写项目中主机项类的 GetAutomationObject 方法,以返回要向 VBA 公开的类的实例:

    • 如果要向 VBA 公开主机项类,请重写属于此类的 GetAutomationObject 方法,并返回该类的当前实例。

      protected override object GetAutomationObject()
      {
          return this;
      }
      
    • 如果要向 VBA 公开不是主机项的类,请重写 项目中任何主机项的 GetAutomationObject 方法,并返回非主机项类的实例。 例如,以下代码假定你要公开名为 DocumentUtilities VBA 的类。

      protected override object GetAutomationObject()
      {
          return new DocumentUtilities();
      }
      

      有关主机项的详细信息,请参阅 主机项和主机控件概述

  6. 从要向 VBA 公开的类中提取接口。 在“提取接口”对话框中,选择要包含在接口声明中的公共成员。 有关详细信息,请参阅 提取接口重构

  7. 公共关键字 (keyword)添加到接口声明。

  8. 通过将以下 ComVisibleAttribute 属性添加到接口,使该接口对 COM 可见。

    [System.Runtime.InteropServices.ComVisible(true)]
    
  9. 在 Visual Studio 的设计器中打开文档(For Word)或工作表(for Excel)。

  10. “属性” 窗口中,选择 “ReferenceAssemblyFromVbaProject” 属性,并将值更改为 “True”

    注意

    如果工作簿或文档尚未包含 VBA 代码,或者如果文档中的 VBA 代码不受信任的运行,则会在将 ReferenceAssemblyFromVbaProject 属性设置为 True 时收到错误消息。 这是因为在这种情况下,Visual Studio 无法修改文档中的 VBA 项目。

  11. 在显示的消息中单击 “确定” 。 此消息提醒你,如果在从 Visual Studio 运行项目时向工作簿或文档添加 VBA 代码,则下次生成项目时,VBA 代码将丢失。 这是因为每次生成项目时都会覆盖生成输出文件夹中的文档。

    此时,Visual Studio 将配置项目,以便 VBA 项目可以调用程序集。 Visual Studio 还会向 VBA 项目添加一个命名 GetManagedClass 的方法。 可以从 VBA 项目中的任意位置调用此方法,以访问向 VBA 公开的类。

  12. 生成项目。