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

此演练演示如何从文档的 Visual Basic for Applications (VBA) 代码中调用 Microsoft Office Word 文档级自定义项中的方法。 该过程包括三个基本步骤:向 ThisDocument 宿主项类添加方法,向 VBA 代码公开方法,然后从文档的 VBA 代码中调用该方法。

**适用于:**本主题中的信息适用于以下应用程序的文档级项目:Excel 2007 和 Excel 2010;Word 2007 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

尽管此演练专门使用 Word,但由该演练演示的概念同样适用于 Excel 的文档级项目。

本演练阐释了以下任务:

  • 创建一个包含 VBA 代码的文档。

  • 使用 Word 的“信任中心”信任文档的位置。

  • 向 ThisDocument 宿主项类添加方法。

  • 向 VBA 代码公开此方法。

  • 从 VBA 代码中调用方法。

提示

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 您安装的 Visual Studio 版本以及使用的设置决定了这些元素。 有关更多信息,请参见 使用设置

链接到视频 有关相关的视频演示,请参见 How Do I: Call VSTO Code from VBA?(如何实现:从 VBA 调用 VSTO 代码)。

系统必备

您需要以下组件来完成本演练:

-

Visual Studio 2010 的一个版本,其中包含 Microsoft Office 开发工具。有关更多信息,请参见[将计算机配置为开发 Office 解决方案](bb398242\(v=vs.100\).md)。
  • Word 2007 或 Word 2010。

创建一个包含 VBA 代码的文档

第一步是创建一个包含简单 VBA 宏的启用宏的文档。 在创建一个基于该文档的 Visual Studio 项目之前,该文档必须包含一个 VBA 项目。 否则,Visual Studio 无法修改 VBA 项目以使 VBA 代码能够调入自定义项程序集。

如果您已经拥有一个包含要使用的 VBA 代码的文档,则可以跳过此步骤。

创建一个包含 VBA 代码的文档

  1. 启动 Word。

  2. 将活动文档另存为名为 DocumentWithVBA 的**“启用宏的 Word 文档(*.docm)”**。 将它保存在一个方便的位置,比如桌面。

  3. 在功能区上,单击**“开发人员”**选项卡。

    提示

    如果看不到“开发人员”选项卡,您必须首先显示该选项卡。 有关更多信息,请参见如何:在功能区上显示“开发人员”选项卡

  4. 在**“代码”组中,单击“Visual Basic”**。

    将打开 Visual Basic 编辑器。

  5. 在**“项目”窗口中,双击“ThisDocument”**。

    将打开 ThisDocument 对象的代码文件。

  6. 向代码文件中添加以下 VBA 代码。 此代码定义一个不执行任何操作的简单函数。 此函数的唯一用途是确保 VBA 项目存在于文档中。 这对于此演练后面的步骤来说是必需的。

    Sub EmptySub()
    End Sub
    
  7. 保存文档并退出 Word。

创建项目

现在可以创建一个 Word 文档级项目,该项目使用之前创建的启用宏的文档。

创建新项目

  1. 启动 Visual Studio。

  2. 在**“文件”菜单上指向“新建”,再单击“项目”。 如果您的 IDE 设置为使用 Visual Basic 开发设置,请在“文件”菜单上单击“新建项目”**。

  3. 在模板窗格中,展开**“Visual Basic”,然后展开“Office”**。

  4. 选择**“2010”“2007”**节点。

  5. 在项目模板列表中,选择**“Word 文档”**项目。

  6. 在**“名称”**框中,键入 CallingCodeFromVBA。

  7. 单击**“确定”**。

    会打开**“Visual Studio Tools for Office 项目向导”**。

  8. 选择**“复制现有文档”,并在“现有文档的完整路径”**框中,指定之前创建的 DocumentWithVBA 文档的位置。 如果您正在使用自己的启用宏的文档,则改为指定此文档的位置。

  9. 单击**“完成”**。

    Visual Studio 将在设计器中打开 DocumentWithVBA 文档,并将**“CallingCodeFromVBA”项目添加到“解决方案资源管理器”**中。

信任文档的位置

在可以向文档中的 VBA 代码公开解决方案中的代码之前,必须信任要运行的文档中的 VBA。 有若干方法可用来执行此操作。 对于此演练,信任 Word 的**“信任中心”**中文档的位置。

信任文档的位置

  1. 启动 Word。

  2. 单击**“文件”选项卡(对于 Word 2010)或“Microsoft Office 按钮”**(对于 Word 2007)。

  3. 单击**“Word 选项”**按钮。

  4. 在类别窗格中单击**“信任中心”**。

  5. 在详细信息窗格中单击**“信任中心设置”**。

  6. 在类别窗格中单击**“受信任位置”**。

  7. 在细节窗格中单击**“添加新位置”**。

  8. 在**“Microsoft Office 受信任位置”**对话框中,浏览到包含 CallingCodeFromVBA 项目的文件夹。

  9. 选择**“同时信任此位置的子文件夹”**。

  10. 在**“Microsoft Office 受信任位置”对话框中,单击“确定”**。

  11. 在**“信任中心”对话框中,单击“确定”**。

  12. 在**“Word 选项”对话框中,单击“确定”**。

  13. 退出 Word。

向 ThisDocument 类添加方法

既然设置了 VBA 项目,请向可从 VBA 代码中调用的 ThisDocument 宿主项类添加方法。

向 ThisDocument 类添加方法

  1. 在**“解决方案资源管理器”中,右击“ThisDocument.vb”,再单击“查看代码”**。

    将在代码编辑器中打开 ThisDocument.vb 文件。

  2. 将下面的方法添加到 ThisDocument 类中。 此方法将在文档的开头创建一个包含两行和两列的表。 参数指定将在第一行中显示的文本。 稍后在此演练中您将从文档的 VBA 代码中调用此方法。

    Public Sub CreateTable(ByVal firstColumnHeader As String, _
        ByVal secondColumnHeader As String)
    
        Me.Paragraphs(1).Range.InsertParagraphBefore()
        Dim table1 As Word.Table = Me.Tables.Add(Me.Paragraphs(1).Range, 2, 2)
    
        With table1
            .Style = "Table Professional"
            .Cell(1, 1).Range.Text = firstColumnHeader
            .Cell(1, 2).Range.Text = secondColumnHeader
        End With
    End Sub
    
  3. 生成项目。

向 VBA 代码公开方法

若要向文档中的 VBA 代码公开 CreateTable 方法,请将 ThisDocument 宿主项的**“EnableVbaCallers”属性设置为“True”**。

向 VBA 代码公开方法

  1. 在**“解决方案资源管理器”**中,双击 ThisDocument.vb。

    将在设计器中打开 DocumentWithVBA 文件。

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

  3. 在显示的消息中单击**“确定”**。

  4. 生成项目。

从 VBA 代码中调用方法

现在可以从文档的 VBA 代码中调用 CreateTable 方法。

提示

在此演练中,将在调试项目时向文档添加 VBA 代码。 在下次生成项目时,添加到此文档中的 VBA 代码将被覆盖,因为 Visual Studio 会将生成输出文件夹中的文档替换为主项目文件夹中文档的副本。 如果要保存 VBA 代码,可以将它复制到项目文件夹内的文档中。 有关更多信息,请参见从 VBA 中调用文档级自定义项中的代码

从 VBA 代码中调用方法

  1. 按 F5 运行项目。

  2. 在**“开发人员”选项卡上的“代码”组中,单击“Visual Basic”**。

    将打开 Visual Basic 编辑器。

  3. 在**“插入”菜单上,单击“模块”**。

  4. 向新模块添加以下代码。

    此代码调用自定义项程序集中的 CreateTable 方法。 宏通过使用 ThisDocument 对象的 CallVSTOAssembly 属性来访问此方法。 之前在此演练中设置**“EnableVbaCallers”**属性时自动生成了此属性。

    Sub CreateTable()
        Call ThisDocument.CallVSTOAssembly.CreateTable("Employee Name", "Start Date")
    End Sub
    
  5. 按 F5。

  6. 验证是否已将新表添加到文档中。

  7. 退出 Word 而不保存更改。

后续步骤

在以下主题中,您可以了解有关从 VBA 调用 Office 解决方案中的代码的更多信息:

请参见

任务

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

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

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

其他资源

结合 VBA 和文档级自定义项

对文档级自定义项进行编程