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

本教程演示如何将 VSTO 外接程序中的对象公开给其他 Microsoft Office 解决方案,包括 Visual Basic for Applications (VBA) 和 COM VSTO 外接程序。

适用于: 本主题中的信息适用于 VSTO 外接程序项目。 有关详细信息,请参阅 Office 应用程序和项目类型提供的功能

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

本演练阐释了以下任务:

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

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

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

    注释

    以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅 个性化设置 IDE

先决条件

你需要满足以下条件才能完成本演练:

创建 VSTO 外接程序项目

第一步是为 Excel 创建 VSTO 外接程序项目。

创建新项目

  1. 使用 Excel VSTO 外接程序项目模板创建名为 ExcelImportData 的 Excel VSTO 外接程序项目。 有关详细信息,请参阅 如何:在 Visual Studio 中创建 Office 项目

    Visual Studio 将打开 ThisAddIn.csThisAddIn.vb 代码文件,并将 ExcelImportData 项目添加到 解决方案资源管理器

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

本演练的目的是从 VBA 代码中调用 VSTO 外接程序中名为 AddInUtilities 的类的 ImportData 方法。 此方法将字符串写入活动工作表的单元格 A1。

若要向 AddInUtilities 其他 Office 解决方案公开该类,必须将该类公开并使其对 COM 可见。 还必须在类中公开 IDispatch 接口。 以下过程中的代码演示了满足这些要求的一种方法。 有关详细信息,请参阅 来自其他 Office 解决方案的 VSTO 外接程序中的调用代码

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

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

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

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

  3. 将以下指令添加到文件顶部。

    using System.Data;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  4. AddInUtilities 类替换为以下代码。

    [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 解决方案公开该类

若要将 AddInUtilities 类向其他 Office 解决方案公开,请在 ThisAddIn 类中重写 RequestComAddInAutomationService 方法。 在你的重写中,返回 AddInUtilities 类的一个实例。

向其他 Office 解决方案公开 AddInUtilities 类

  1. 解决方案资源管理器中,展开 Excel

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

  3. 将以下代码添加到 ThisAddIn 类。

    private AddInUtilities utilities;
    
    protected override object RequestComAddInAutomationService()
    {
        if (utilities == null)
            utilities = new AddInUtilities();
    
        return utilities;
    }
    
  4. 在“ 生成 ”菜单上,单击“ 生成解决方案”。

    验证解决方案是否生成时没有错误。

测试 VSTO 外接程序

可以从多种不同类型的 Office 解决方案调用 AddInUtilities 该类。 在本演练中,将在 Excel 工作簿中使用 VBA 代码。 有关还可以使用的其他类型的 Office 解决方案的详细信息,请参阅 来自其他 Office 解决方案的 VSTO 外接程序中的呼叫代码

测试 VSTO 外接程序

  1. F5 运行项目。

  2. 在 Excel 中,将活动工作簿另存为 Excel Macro-Enabled 工作簿(*.xlsm)。 将其保存在方便的位置,例如桌面。

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

    注释

    如果 “开发人员 ”选项卡不可见,必须先显示它。 有关详细信息,请参阅 《如何:在功能区上显示开发人员选项卡》

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

    此时会打开 Visual Basic 编辑器。

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

    此时会打开对象的 ThisWorkbook 代码文件。

  6. 将以下 VBA 代码添加到代码文件。 此代码首先获取表示 ExcelImportData VSTO 外接程序的 COMAddIn 对象。 然后,代码使用 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 是否包含字符串 “这是我的数据”。

  9. 退出 Excel。

后续步骤

可以从以下主题了解有关对 VSTO 外接程序进行编程的详细信息: