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

更新:2007 年 11 月

适用对象

本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。

项目类型

  • 文档级项目

Microsoft Office 版本

  • 2007 Microsoft Office system

有关更多信息,请参见按应用程序和项目类型提供的功能

如果想让 Visual C# 项目中的代码与 Visual Basic for Applications (VBA) 代码相互交互,则可以向后者公开前者。

Visual C# 进程不同于 Visual Basic 进程。有关更多信息,请参见从 VBA 中调用文档级自定义项中的代码如何:向 VBA 公开 Visual Basic 项目中的代码

公开 Visual C# 项目中的代码

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

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

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

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

    有关支持宏的文档文件格式的更多信息,请参见从 VBA 中调用文档级自定义项中的代码

    Bb608604.alert_note(zh-cn,VS.90).gif说明:

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

  2. 确保在不提示用户启用宏的情况下允许运行文档中的 VBA 代码。通过在 Word 或 Excel 的“信任中心”设置中将 Visual Studio Tools for Office 项目的位置添加到受信任位置列表中,可以在运行 VBA 代码时信任该代码。

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

  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 方法,并返回非宿主项类的实例。例如,以下代码假设要向 VBA 公开一个名为 DocumentUtilities 的类。

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

    有关宿主项的更多信息,请参见宿主项和宿主控件概述

  6. 从要向 VBA 公开的类中提取接口。在“提取接口”对话框中,选择想要包括在接口声明中的公共成员。有关更多信息,请参见如何:用“提取接口”重构代码

  7. 将 public 关键字添加到接口声明中。

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

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

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

    Bb608604.alert_note(zh-cn,VS.90).gif说明:

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

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

    此时,Visual Studio Tools for Office 将配置项目以便 VBA 项目可以调入程序集。Visual Studio Tools for Office 还会向 VBA 项目添加一个名为 GetManagedClass 的方法。可以从 VBA 项目的任何位置调用此方法以访问向 VBA 公开的类。有关更多信息,请参见从 VBA 中调用文档级自定义项中的代码

  12. 生成项目。

请参见

任务

如何:创建 Visual Studio Tools for Office 项目

演练:在 Visual C# 项目中调用 VBA 中的代码

如何:向 VBA 公开 Visual Basic 项目中的代码

概念

在 Visual Studio 中创建 Office 解决方案

结合 VBA 和文档级自定义项

从 VBA 中调用文档级自定义项中的代码