Пошаговое руководство. Вызов кода из VBA в настройках на уровне приложения
Обновлен: Ноябрь 2007
Применение |
---|
Сведения, приведенные в данном разделе, относятся только к указанным проектам Visual Studio Tools for Office и версиям Microsoft Office. Тип проекта
Версия Microsoft Office
Дополнительные сведения см. в разделе Доступность функций по типам приложений и проектов. |
В пошаговом руководстве рассматривается метод использование объекта в настройках на уровне приложения в других решениях Microsoft Office, а в также в настройках VBA и COM.
Несмотря на то, что данное руководство ориентировано на Excel, рассматриваемые подходы применимы ко всем проектам настроек благодаря Visual Studio Tools for Office.
В данном пошаговом руководстве представлены следующие задачи:
Определения класса, который используется с другими решениями Office.
Использование класса с другими решениями Office.
Вызов метода класса из кода VBA.
![]() |
---|
На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio. |
Обязательные компоненты
Для выполнения данного руководства необходимы следующие компоненты:
Visual Studio Tools for Office (необязательный компонент Visual Studio 2008 Professional и Visual Studio Team System).
Microsoft Office Excel 2007.
Примечание.
Это руководство также применяется к 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
В меню Проект выберите команду Добавить класс.
В диалоговом окне Добавить новый элемент измените имя нового класса на 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.
Код позволяет классу 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, выполните следующее.
В Обозревателе решений разверните 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; }
В меню Построить выберите команду Построить решение.
Убедитесь в том, что проект строится без ошибок.
Проверка настроек
Можно выполнить вызов класса AddInUtilities из следующих различных типов решений Office. В руководстве мы будем использовать код VBA в книге Excel. Дополнительные сведения о других типах решений Office, которые можно использовать, см. в разделе Вызов кода в надстройках уровня приложения из других решений Office.
Чтобы проверить надстройки, выполните следующее.
Нажмите клавишу F5 для запуска проекта.
В Excel сохраните активную книгу в формате книги Excel с включенными макросами (*.xlsm). Выберите удобное место для сохранения, например рабочий стол.
На ленте откройте вкладку Разработчик.
Примечание.
Если вкладка Разработчик не отображается на ленте, то ее следует отобразить вручную. Дополнительные сведения см. в разделе Практическое руководство. Отображение вкладки разработчика на ленте.
В группе Код выберите пункт Visual Basic.
Отобразится редактор Visual Basic.
В окне Проект дважды нажмите ThisWorkbook.
Откроется файл кода для объекта ThisWorkbook.
Добавьте следующий код 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
Нажмите клавишу F5.
Удостоверьтесь в том, что новый лист Imported Data был добавлен к книге. Убедитесь в том, что ячейка A1 содержит строку Chan, а ячейка B1 — строку Gareth.
Закройте приложение Excel.
Следующие действия
Дополнительные сведения о программировании настроек можно просмотреть в перечисленных ниже разделах:
Используйте класс ThisAddIn для автоматизации ведущего приложения и выполнения различных задач в проектах настроек. Дополнительные сведения см. в разделах Программирование надстроек уровня приложения и Ведущий элемент AddIn.
Создайте настраиваемую область задач в настройках для системы Microsoft Office 2007. Дополнительные сведения см. в разделах Общие сведения о настраиваемых областях задач и Практическое руководство. Добавление настраиваемой панели задач в приложение.
Настройте ленту в настройках для системы Microsoft Office 2007. Дополнительные сведения см. в разделах Обзор ленты и Практическое руководство. Работа с настройкой ленты.
См. также
Задачи
Практическое руководство. Создание проектов Visual Studio Tools for Office
Основные понятия
Программирование надстроек уровня приложения
Вызов кода в надстройках уровня приложения из других решений Office
Настройка функций пользовательского интерфейса с помощью интерфейсов расширяемости