演练:在 Visual Basic 项目中调用 VBA 中的代码
此演练演示如何从文档的 Visual Basic for Applications (VBA) 代码中调用 Microsoft Office Word 文档级自定义项中的方法。该过程包括三个基本步骤:向 ThisDocument 宿主项类添加方法,向 VBA 代码公开方法,然后从文档的 VBA 代码中调用该方法。
**适用于:**本主题中的信息适用于以下应用程序的文档级项目:Excel 2013 和 Excel 2010;Word 2013 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
尽管此演练专门使用 Word,但由该演练演示的概念同样适用于 Excel 的文档级项目。
本演练阐释了以下任务:
创建一个包含 VBA 代码的文档。
使用 Word 的“信任中心”信任文档的位置。
向 ThisDocument 宿主项类添加方法。
向 VBA 代码公开此方法。
从 VBA 代码中调用方法。
说明 |
---|
以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。您安装的 Visual Studio 版本以及使用的设置决定了这些元素。有关更多信息,请参见Visual Studio 设置。 |
有关相关的视频演示,请参见 How Do I: Call VSTO Code from VBA?(如何实现:从 VBA 调用 VSTO 代码)。
系统必备
您需要以下组件来完成本演练:
-
Visual Studio 2012 的一个版本,其中包含 Microsoft Office 开发工具。有关更多信息,请参见[将计算机配置为开发 Office 解决方案](bb398242\(v=vs.110\).md)。
- Word 2013 或 Word 2010。
创建一个包含 VBA 代码的文档
第一步是创建一个包含简单 VBA 宏的启用宏的文档。在创建一个基于该文档的 Visual Studio 项目之前,该文档必须包含一个 VBA 项目。否则,Visual Studio 无法修改 VBA 项目以使 VBA 代码能够调入自定义项程序集。
如果您已经拥有一个包含要使用的 VBA 代码的文档,则可以跳过此步骤。
创建一个包含 VBA 代码的文档
启动 Word。
将活动文档另存为名为 DocumentWithVBA 的**“启用宏的 Word 文档(*.docm)”**。将它保存在一个方便的位置,比如桌面。
在功能区上,单击**“开发人员”**选项卡。
说明 如果看不到“开发人员”选项卡,您必须首先显示该选项卡。有关更多信息,请参见如何:在功能区上显示“开发人员”选项卡。
在**“代码”组中,单击“Visual Basic”**。
将打开 Visual Basic 编辑器。
在**“项目”窗口中,双击“ThisDocument”**。
将打开 ThisDocument 对象的代码文件。
向代码文件中添加以下 VBA 代码。此代码定义一个不执行任何操作的简单函数。此函数的唯一用途是确保 VBA 项目存在于文档中。这对此演练中的后续步骤是必需的。
Sub EmptySub() End Sub
保存文档并退出 Word。
创建项目
现在可以创建一个 Word 文档级项目,该项目使用之前创建的启用宏的文档。
创建新项目
启动 Visual Studio。
在**“文件”菜单上指向“新建”,再单击“项目”。如果您的 IDE 设置为使用 Visual Basic 开发设置,请在“文件”菜单上单击“新建项目”**。
在模板窗格中,展开 Visual Basic,然后展开 Office/SharePoint。
选择 Office 加载项 节点。
在项目模板列表中,选择 Word 2010 文档 或 Word 2013 文档 项目。
在**“名称”**框中,键入 CallingCodeFromVBA。
单击**“确定”**。
会打开**“Visual Studio Tools for Office 项目向导”**。
选择**“复制现有文档”,并在“现有文档的完整路径”**框中,指定之前创建的 DocumentWithVBA 文档的位置。如果您正在使用自己的启用宏的文档,则改为指定此文档的位置。
单击**“完成”**。
Visual Studio 将在设计器中打开 DocumentWithVBA 文档,并将**“CallingCodeFromVBA”项目添加到“解决方案资源管理器”**中。
信任文档的位置
在可以向文档中的 VBA 代码公开解决方案中的代码之前,必须信任要运行的文档中的 VBA。有若干方法可用来执行此操作。对于此演练,信任 Word 的**“信任中心”**中文档的位置。
信任文档的位置
启动 Word。
单击**“文件”**选项卡。
单击**“Word 选项”**按钮。
在类别窗格中单击**“信任中心”**。
在详细信息窗格中单击**“信任中心设置”**。
在类别窗格中单击**“受信任位置”**。
在细节窗格中单击**“添加新位置”**。
在**“Microsoft Office 受信任位置”**对话框中,浏览到包含 CallingCodeFromVBA 项目的文件夹。
选择**“同时信任此位置的子文件夹”**。
在**“Microsoft Office 受信任位置”对话框中,单击“确定”**。
在**“信任中心”对话框中,单击“确定”**。
在**“Word 选项”对话框中,单击“确定”**。
退出 Word。
向 ThisDocument 类添加方法
既然设置了 VBA 项目,请向可从 VBA 代码中调用的 ThisDocument 宿主项类添加方法。
向 ThisDocument 类添加方法
在**“解决方案资源管理器”中,右击“ThisDocument.vb”,再单击“查看代码”**。
将在代码编辑器中打开 ThisDocument.vb 文件。
将下面的方法添加到 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
生成项目。
向 VBA 代码公开方法
若要向文档中的 VBA 代码公开 CreateTable 方法,请将 ThisDocument 宿主项的**“EnableVbaCallers”属性设置为“True”**。
向 VBA 代码公开方法
在**“解决方案资源管理器”**中,双击 ThisDocument.vb。
将在设计器中打开 DocumentWithVBA 文件。
在**“属性”窗口中,选择“EnableVbaCallers”属性,并将值更改为“True”**。
在显示的消息中单击**“确定”**。
生成项目。
从 VBA 代码中调用方法
现在可以从文档的 VBA 代码中调用 CreateTable 方法。
说明 |
---|
在此演练中,将在调试项目时向文档添加 VBA 代码。在下次生成项目时,添加到此文档中的 VBA 代码将被覆盖,因为 Visual Studio 会将生成输出文件夹中的文档替换为主项目文件夹中文档的副本。如果要保存 VBA 代码,可以将它复制到项目文件夹内的文档中。有关更多信息,请参见结合 VBA 和文档级自定义项。 |
从 VBA 代码中调用方法
按 F5 运行项目。
在**“开发人员”选项卡上的“代码”组中,单击“Visual Basic”**。
将打开 Visual Basic 编辑器。
在**“插入”菜单上,单击“模块”**。
向新模块添加以下代码。
此代码调用自定义项程序集中的 CreateTable 方法。宏通过使用 ThisDocument 对象的 CallVSTOAssembly 属性来访问此方法。之前在此演练中设置**“EnableVbaCallers”**属性时自动生成了此属性。
Sub CreateTable() Call ThisDocument.CallVSTOAssembly.CreateTable("Employee Name", "Start Date") End Sub
按 F5。
验证是否已将新表添加到文档中。
退出 Word 而不保存更改。
后续步骤
在以下主题中,您可以了解有关从 VBA 调用 Office 解决方案中的代码的更多信息:
从 VBA 中调用 Visual C# 自定义项中的代码。此过程不同于 Visual Basic 过程。有关更多信息,请参见演练:在 Visual C# 项目中调用 VBA 中的代码。
从 VBA 中调用应用程序级外接程序中的代码。有关更多信息,请参见演练:从 VBA 中调用应用程序级外接程序中的代码。
请参见
任务
如何:向 VBA 公开 Visual Basic 项目中的代码