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

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

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

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

本演练阐释了以下任务:

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

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

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

    注意

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

先决条件

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

创建 VSTO 外接程序项目

第一步是针对 Excel 创建一个 VSTO 外接程序项目。

创建新项目

  1. 使用 Excel VSTO 外接程序项目模板,创建一个名为 ExcelImportData的 Excel VSTO 外接程序项目。 有关详细信息,请参阅 How to: Create Office Projects in Visual Studio

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

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

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

若要向其他 Office 解决方案公开 AddInUtilities 类,必须使该类成为公共类并对 COM 可见。 还必须在类中公开 IDispatch 接口。 以下过程中的代码演示了一种可满足这些要求的方式。 有关更多信息,请参见 Calling Code in VSTO Add-ins from Other Office Solutions

定义可向其他 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 类,请替代 RequestComAddInAutomationService 类中的 ThisAddIn 方法。 在替代中,返回 AddInUtilities 类的一个实例。

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

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

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

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

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

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

测试 VSTO 外接程序

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

测试 VSTO 外接程序

  1. F5 运行项目。

  2. 在 Excel 中,将活动工作簿另存为启用宏的 Excel 工作簿 (*.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. 验证是否已将新的 Imported Data 表添加到工作簿。 此外,请验证 A1 单元格是否包含字符串 This is my data

  9. 退出 Excel。

后续步骤

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