演练:从 VBA 中调用应用程序级外接程序中的代码

此演练演示如何向其他 Microsoft Office 解决方案(包括 Visual Basic for Applications (VBA) 和 COM 外接程序)公开某个应用程序级外接程序中的对象。

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

尽管此演练专门使用 Excel,但此演练演示的概念适用于 Visual Studio 提供的任何外接程序项目模板。

本演练阐释了以下任务:

  • 定义可向其他 Office 解决方案公开的类。

  • 向其他 Office 解决方案公开该类。

  • 从 VBA 代码中调用该类的方法。

提示

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置

系统必备

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

-

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

  1. 在**“项目”菜单上,单击“添加类”**。

  2. 在**“添加新项”对话框中,将新类的名称改为 AddInUtilities,然后单击“添加”**。

    AddInUtilities.cs 或 AddInUtilities.vb 文件将在代码编辑器中打开。

  3. 将下面的语句添加到文件的顶部。

    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;
    
  4. 将 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 类

  1. 在**“解决方案资源管理器”中展开“Excel”**。

  2. 右击**“ThisAddIn.cs”“ThisAddIn.vb”,然后单击“查看代码”**。

  3. 向 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;
    }
    
  4. 在**“生成”菜单上,单击“生成解决方案”**。

    验证解决方案已生成且未发生错误。

测试外接程序

您可以从若干不同类型的 Office 解决方案中调入 AddInUtilities 类。 在此演练中,您将在 Excel 工作簿中使用 VBA 代码。 有关同样可以使用的其他类型 Office 解决方案的更多信息,请参见从其他 Office 解决方案调用应用程序级外接程序中的代码

测试外接程序

  1. 按 F5 运行项目。

  2. 在 Excel 中,将活动工作簿另存为启用宏的 Excel 工作簿 (*.xlsm)。 将它保存在一个方便的位置,比如桌面。

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

    提示

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

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

    将打开 Visual Basic 编辑器。

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

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

  6. 向代码文件中添加以下 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
    
  7. 按 F5。

  8. 验证是否已将新的“导入的数据”工作表添加到工作簿。 同时,验证单元格 A1 是否包含字符串 This is my data。

  9. 退出 Excel。

后续步骤

可以从以下主题中了解有关外接程序编程的更多信息:

请参见

任务

如何:在 Visual Studio 中创建 Office 项目

概念

从其他 Office 解决方案调用应用程序级外接程序中的代码

使用扩展性接口自定义 UI 功能

应用程序级外接程序的体系结构

其他资源

应用程序级外接程序编程

开发 Office 解决方案