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

更新:2007 年 11 月

适用对象

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

项目类型

  • 文档级项目

Microsoft Office 版本

  • 2007 Microsoft Office system

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

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

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

用于宿主项类中的代码的过程与用于其他类中的代码的过程不同:

  • 公开宿主项类中的代码

  • 公开不在宿主项类中的代码

公开宿主项类中的代码

为了使 VBA 代码能够调用宿主项类中的 Visual Basic 代码,请将宿主项的“EnableVbaCallers”属性设置为“True”。

有关演示如何公开宿主项类的方法然后从 VBA 中调用该方法的演练,请参见演练:在 Visual Basic 项目中调用 VBA 中的代码。有关宿主项的更多信息,请参见宿主项和宿主控件概述

向 VBA 公开宿主项中的代码

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

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

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

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

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

  3. 将要向 VBA 公开的属性、方法或事件添加到项目中的某个宿主项类中,并将新成员声明为 Public。类的名称取决于应用程序:

    • 在 Word 项目中,宿主项类默认情况下名为 ThisDocument。

    • 在 Excel 项目中,宿主项类默认情况下名为 ThisWorkbook、Sheet1、Sheet2 和 Sheet3。

  4. 将宿主项的“EnableVbaCallers”属性设置为“True”。当宿主项在设计器中打开时,此属性在“属性”窗口中可用。

    当您设置了此属性后,Visual Studio Tools for Office 会自动将“ReferenceAssemblyFromVbaProject”属性设置为“True”。有关此属性的更多信息,请参见从 VBA 中调用文档级自定义项中的代码

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

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

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

    此时,Visual Studio Tools for Office 将配置项目以便 VBA 项目可以调入程序集。Visual Studio Tools for Office 还会向 VBA 项目的 ThisDocument、ThisWorkbook、Sheet1、Sheet2 或 Sheet3 模块中添加一个名为 CallVSTOAssembly 的属性。您可以使用此属性来访问您向 VBA 公开的类的公共成员。有关更多信息,请参见从 VBA 中调用文档级自定义项中的代码

  6. 生成项目。

公开不在宿主项类中的代码

为了使 VBA 代码能够调用不在宿主项类中的 Visual Basic 代码,请修改代码以使其对于 VBA 可见。

向 VBA 公开不在宿主项类中的代码

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

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

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

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

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

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

  4. 将以下 ComVisibleAttributeComClassAttribute 属性应用于要向 VBA 公开的类。这些属性使得类对于 VBA 可见。

    <Microsoft.VisualBasic.ComClass()> _
    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    
  5. 重写项目中宿主项类的 GetAutomationObject 方法以返回要向 VBA 公开的类的实例。下面的代码示例假定您向 VBA 公开名为 DocumentUtilities 的类。

    Protected Overrides Function GetAutomationObject() As Object
        Return New DocumentUtilities()
    End Function
    
  6. 在 Visual Studio 中打开文档(Word 文档)或工作表(Excel 工作表)的设计器。

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

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

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

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

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

  9. 生成项目。

请参见

任务

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

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

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

概念

在 Visual Studio 中创建 Office 解决方案

结合 VBA 和文档级自定义项

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