演练:从 VBA 中调用应用程序级外接程序中的代码
此演练演示如何向其他 Microsoft Office 解决方案(包括 Visual Basic for Applications (VBA) 和 COM 外接程序)公开某个应用程序级外接程序中的对象。
**适用于:**本主题中的信息适用于 Microsoft Office 2013 和 Microsoft Office 2010 的应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
尽管此演练专门使用 Excel,但此演练演示的概念适用于 Visual Studio 提供的任何外接程序项目模板。
本演练阐释了以下任务:
定义可向其他 Office 解决方案公开的类。
向其他 Office 解决方案公开该类。
从 VBA 代码中调用该类的方法。
说明 |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。 |
系统必备
您需要以下组件来完成本演练:
-
Visual Studio 2012 的一个版本,其中包含 Microsoft Office 开发工具。有关更多信息,请参见[将计算机配置为开发 Office 解决方案](bb398242\(v=vs.110\).md)。
- Excel 2013 或 Excel 2010。
有关此主题的视频版本,请参见 Video How to: Calling Code in an Application-Level Add-in from VBA(视频帮助:从 VBA 中调用应用程序级外接程序中的代码)。
创建外接程序项目
第一步是针对 Excel 创建一个外接程序项目。
创建新项目
使用 Excel 外接程序项目模板,创建一个名为“ExcelImportData”的 Excel 外接程序项目。有关更多信息,请参见如何:在 Visual Studio 中创建 Office 项目。
Visual Studio 将打开 ThisAddIn.cs 或 ThisAddIn.vb 代码文件,并将**“ExcelImportData”项目添加到“解决方案资源管理器”**中。
定义可向其他 Office 解决方案公开的类
此演练的目的是从 VBA 代码中调入外接程序中名为 AddInUtilities 的类的 ImportData 方法。此方法向活动工作表的单元格 A1 中写入字符串。
若要向其他 Office 解决方案公开 AddInUtilities 类,您必须使该类成为公共类并对于 COM 可见。您还必须在类中公开 IDispatch 接口。下面过程中的代码演示了一种可满足这些要求的方式。有关更多信息,请参见从其他 Office 解决方案调用应用程序级外接程序中的代码。
定义可向其他 Office 解决方案公开的类
在**“项目”菜单上,单击“添加类”**。
在**“添加新项”对话框中,将新类的名称改为 AddInUtilities,然后单击“添加”**。
AddInUtilities.cs 或 AddInUtilities.vb 文件将在代码编辑器中打开。
将下面的语句添加到文件的顶部。
Imports System.Data Imports System.Runtime.InteropServices Imports Excel = Microsoft.Office.Interop.Excel
using System.Data; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel;
将 AddInUtilities 类替换为以下代码。
<ComVisible(True)> _ Public Interface IAddInUtilities Sub ImportData() End Interface <ComVisible(True)> _ <ClassInterface(ClassInterfaceType.None)> _ Public Class AddInUtilities Implements IAddInUtilities ' This method tries to write a string to cell A1 in the active worksheet. Public Sub ImportData() Implements IAddInUtilities.ImportData Dim activeWorksheet As Excel.Worksheet = Globals.ThisAddIn.Application.ActiveSheet If activeWorksheet IsNot Nothing Then Dim range1 As Excel.Range = activeWorksheet.Range("A1") range1.Value2 = "This is my data" End If End Sub End Class
[ComVisible(true)] public interface IAddInUtilities { void ImportData(); } [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] public class AddInUtilities : IAddInUtilities { // This method tries to write a string to cell A1 in the active worksheet. public void ImportData() { Excel.Worksheet activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet; if (activeWorksheet != null) { Excel.Range range1 = activeWorksheet.get_Range("A1", System.Type.Missing); range1.Value2 = "This is my data"; } } }
此代码使 AddInUtilities 类对于 COM 可见,并且它向类中添加 ImportData 方法。为了公开 IDispatch 接口,AddInUtilities 类还拥有 ClassInterfaceAttribute 特性,并且该类实现对 COM 可见的接口。
向其他 Office 解决方案公开该类
若要向其他 Office 解决方案公开 AddInUtilities 类,请重写 ThisAddIn 类中的 RequestComAddInAutomationService 方法。在重写中,返回 AddInUtilities 类的实例。
向其他 Office 解决方案公开 AddInUtilities 类
在**“解决方案资源管理器”中展开“Excel”**。
右击**“ThisAddIn.cs”或“ThisAddIn.vb”,然后单击“查看代码”**。
将下面的代码添加到 ThisAddIn 类中。
Private utilities As AddInUtilities Protected Overrides Function RequestComAddInAutomationService() As Object If utilities Is Nothing Then utilities = New AddInUtilities() End If Return utilities End Function
private AddInUtilities utilities; protected override object RequestComAddInAutomationService() { if (utilities == null) utilities = new AddInUtilities(); return utilities; }
在**“生成”菜单上,单击“生成解决方案”**。
验证解决方案已生成且未发生错误。
测试外接程序
您可以从若干不同类型的 Office 解决方案中调入 AddInUtilities 类。在此演练中,您将在 Excel 工作簿中使用 VBA 代码。有关同样可以使用的其他类型 Office 解决方案的更多信息,请参见从其他 Office 解决方案调用应用程序级外接程序中的代码。
测试外接程序
按 F5 运行项目。
在 Excel 中,将活动工作簿另存为启用宏的 Excel 工作簿 (*.xlsm)。将它保存在一个方便的位置,比如桌面。
在功能区上,单击**“开发人员”**选项卡。
说明 如果看不到“开发人员”选项卡,您必须首先显示该选项卡。有关更多信息,请参见如何:在功能区上显示“开发人员”选项卡。
在**“代码”组中,单击“Visual Basic”**。
将打开 Visual Basic 编辑器。
在**“项目”窗口中,双击“ThisWorkbook”**。
将打开 ThisWorkbook 对象的代码文件。
向代码文件中添加以下 VBA 代码。此代码首先获取一个 COMAddIn 对象,该对象表示 ExcelImportData 外接程序。然后,代码使用 COMAddIn 对象的 Object 属性来调用 ImportData 方法。
Sub CallVSTOMethod() Dim addIn As COMAddIn Dim automationObject As Object Set addIn = Application.COMAddIns("ExcelImportData") Set automationObject = addIn.Object automationObject.ImportData End Sub
按 F5。
验证是否已将新的“导入的数据”工作表添加到工作簿。同时,验证单元格 A1 是否包含字符串 This is my data。
退出 Excel。
后续步骤
可以从以下主题中了解有关外接程序编程的更多信息:
使用 ThisAddIn 类来实现宿主应用程序自动化并在外接程序项目中执行其他任务。有关更多信息,请参见应用程序级外接程序编程。
在外接程序中创建自定义任务窗格。有关更多信息,请参见自定义任务窗格和如何:向应用程序中添加自定义任务窗格。
在外接程序中自定义功能区。有关更多信息,请参见功能区概述和如何:开始自定义功能区。
请参见
任务
如何:在 Visual Studio 中创建 Office 项目
概念
从其他 Office 解决方案调用应用程序级外接程序中的代码