Поделиться через


Пошаговое руководство. Вызов кода из VBA в настройках на уровне приложения

Обновлен: Ноябрь 2007

Применение

Сведения, приведенные в данном разделе, относятся только к указанным проектам Visual Studio Tools for Office и версиям Microsoft Office.

Тип проекта

  • Проекты уровня приложения

Версия Microsoft Office

  • Выпуск 2007 системы Microsoft Office

  • Microsoft Office 2003

Дополнительные сведения см. в разделе Доступность функций по типам приложений и проектов.

В пошаговом руководстве рассматривается метод использование объекта в настройках на уровне приложения в других решениях Microsoft Office, а в также в настройках VBA и COM.

Несмотря на то, что данное руководство ориентировано на Excel, рассматриваемые подходы применимы ко всем проектам настроек благодаря Visual Studio Tools for Office. 

В данном пошаговом руководстве представлены следующие задачи:

  • Определения класса, который используется с другими решениями Office.

  • Использование класса с другими решениями Office.

  • Вызов метода класса из кода VBA.

Bb608614.alert_note(ru-ru,VS.90).gifПримечание.

На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Обязательные компоненты

Для выполнения данного руководства необходимы следующие компоненты:

  • Visual Studio Tools for Office (необязательный компонент Visual Studio 2008 Professional и Visual Studio Team System).

  • Microsoft Office Excel 2007.

    Bb608614.alert_note(ru-ru,VS.90).gifПримечание.

    Это руководство также применяется к Microsoft Office Excel 2003, однако некоторые инструкции предполагают использование ленты в Excel 2007.

Средства Visual Studio Tools for Office устанавливаются по умолчанию с нижеперечисленными версиями Visual Studio. Для того чтобы проверить наличие установленных указанных версий, см. раздел Установка средств Visual Studio для Office.

ссылка на видеоЧтобы просмотреть видео, см. раздел Практическое видеоруководство: вызов кода из VBA в надстройке уровня приложения.

Создание проекта надстроек

Первым этапом является создание проекта настроек в Excel.

Для того чтобы создать новый проект, выполните следующее.

  • Создайте проект надстроек Excel с именем ExcelImportData, используя проект надстроек Excel для системы Microsoft Office 2007. Дополнительные сведения см. в разделе Практическое руководство. Создание проектов Visual Studio Tools for Office.

    Visual Studio открывает файл кода ThisAddIn.cs или ThisAddIn.vb и добавляет проект ExcelImportData в раздел Обозреватель решений.

Определения класса, который используется с другими решениями Office

Задача данного руководства рассмотреть вызов ImportData метода класса AddInUtilities из кода VBA в настройках. Метод импортирует данные с активного листа на новый лист и создает простой DataSet для размещения данных.

Для того чтобы использовать класс AddInUtilities с другими решениями Office, необходимо опубликовать класс и отобразить в 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.

    Код позволяет классу AddInUtilities отобразиться в COM, который добавляет метод ImportData в класс. Для того чтобы использовать интерфейс IDispatch, класс AddInUtilities вводит в работу интерфейс с атрибутом InterfaceIsIDispatch.

    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    <System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
    Public Interface IAddInUtilities
        Sub ImportData()
    End Interface
    
    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    <System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
    Public Class AddInUtilities
        Implements IAddInUtilities
    
        Public Sub ImportData() Implements IAddInUtilities.ImportData
    
            ' Create a new DataTable.
            Dim ds As New DataSet()
            Dim dt As DataTable = ds.Tables.Add("Customers")
            dt.Columns.Add(New DataColumn("LastName"))
            dt.Columns.Add(New DataColumn("FirstName"))
    
            ' Add a new row to the DataTable.
            Dim dr As DataRow = dt.NewRow()
            dr("LastName") = "Chan"
            dr("FirstName") = "Gareth"
            dt.Rows.Add(dr)
    
            ' Add a new XML map to the collection.
            Dim activeWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
            Dim xmlMap1 As Excel.XmlMap = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), _
                "NewDataSet")
    
            ' Import the data.
            If Not (xmlMap1 Is Nothing) Then
                Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count)
                Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _
                    After:=lastSheet), Excel.Worksheet)
                newSheet.Name = "Imported Data"
                activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _
                    newSheet.Range("A1"))
            End If
        End Sub
    End Class
    
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    [System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IAddInUtilities
    {
        void ImportData();
    }
    
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    [System.Runtime.InteropServices.ClassInterface(ClassInterfaceType.None)]
    public class AddInUtilities : IAddInUtilities
    {
        public void ImportData()
        {
            // Create a new DataTable.
            DataSet ds = new DataSet();
            DataTable dt = ds.Tables.Add("Customers");
            dt.Columns.Add(new DataColumn("LastName"));
            dt.Columns.Add(new DataColumn("FirstName"));
    
            // Add a new row to the DataTable.
            DataRow dr = dt.NewRow();
            dr["LastName"] = "Chan";
            dr["FirstName"] = "Gareth";
            dt.Rows.Add(dr);
    
            // Add a new XML map to the collection.
            Excel.Workbook activeWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook;
            Excel.XmlMap xmlMap1 = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), 
                "NewDataSet");
    
            // Import the data.
            if (xmlMap1 != null)
            {
                object lastSheet = activeWorkbook.Sheets[activeWorkbook.Sheets.Count];
                Excel.Worksheet newSheet = (Excel.Worksheet)activeWorkbook.Sheets.Add(
                    System.Type.Missing, lastSheet, 1, System.Type.Missing);
                newSheet.Name = "Imported Data";
    
                activeWorkbook.XmlImportXml(ds.GetXml(), out xmlMap1, true,
                    newSheet.get_Range("A1", System.Type.Missing));
            }
        }
    }
    

Использование класса с другими решениями Office

Для того чтобы использовать класс AddInUtilities с другими решениями Office, перепишите RequestComAddInAutomationService метод класса ThisAddIn. Во время переопределения возвратите экземпляр класса AddInUtilities.

Для того чтобы использовать класс AddInUtilities с другими решениями Office, выполните следующее.

  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. В меню Построить выберите команду Построить решение.

    Убедитесь в том, что проект строится без ошибок.

Проверка настроек

Можно выполнить вызов класса AddInUtilities из следующих различных типов решений Office. В руководстве мы будем использовать код VBA в книге Excel. Дополнительные сведения о других типах решений Office, которые можно использовать, см. в разделе Вызов кода в надстройках уровня приложения из других решений Office.

Чтобы проверить надстройки, выполните следующее.

  1. Нажмите клавишу F5 для запуска проекта.

  2. В Excel сохраните активную книгу в формате книги Excel с включенными макросами (*.xlsm). Выберите удобное место для сохранения, например рабочий стол.

  3. На ленте откройте вкладку Разработчик.

    Bb608614.alert_note(ru-ru,VS.90).gifПримечание.

    Если вкладка Разработчик не отображается на ленте, то ее следует отобразить вручную. Дополнительные сведения см. в разделе Практическое руководство. Отображение вкладки разработчика на ленте.

  4. В группе Код выберите пункт Visual Basic.

    Отобразится редактор Visual Basic.

  5. В окне Проект дважды нажмите ThisWorkbook.

    Откроется файл кода для объекта ThisWorkbook.

  6. Добавьте следующий код VBA в файл кода. Сначала код получает объект COMAddIn с настройками ExcelImportData. Затем, код использует свойство Object объекта COMAddIn в запросе ImportData.

    Sub CallVSTOMethod()
        Dim addIn As COMAddIn
        Dim automationbject As Object
        Set addIn = Application.COMAddIns("ExcelImportData")
        Set automationObject = addIn.Object
        automationObject.ImportData
    End Sub
    
  7. Нажмите клавишу F5.

  8. Удостоверьтесь в том, что новый лист Imported Data был добавлен к книге. Убедитесь в том, что ячейка A1 содержит строку Chan, а ячейка B1 — строку Gareth.

  9. Закройте приложение Excel.

Следующие действия

Дополнительные сведения о программировании настроек можно просмотреть в перечисленных ниже разделах:

См. также

Задачи

Практическое руководство. Создание проектов Visual Studio Tools for Office

Основные понятия

Программирование надстроек уровня приложения

Вызов кода в надстройках уровня приложения из других решений Office

Разработка решений Office

Ведущий элемент AddIn

Настройка функций пользовательского интерфейса с помощью интерфейсов расширяемости

Архитектура надстроек уровня приложения