Пошаговое руководство. Вызов кода из VBA в проекте Visual C#
В этом пошаговом руководстве показано, как вызвать метод в настройке на уровне документа для Microsoft Office Excel из кода Visual Basic для приложений (VBA) в книге. Данная процедура состоит из трех основных этапов: добавление метода в класс ведущего элемента Sheet1
, представление метода коду VBA в книге и вызов метода из кода VBA в книге.
Область применения. Сведения в этом разделе относятся к проектам уровня документа для Excel и Word. Дополнительные сведения см. в разделе "Функции", доступные по Приложение Office ликации и типу проекта.
Хотя в этом пошаговом руководстве используется Excel, рассмотренная процедура также применима к проектам на уровне документа для Word.
В этом пошаговом руководстве рассматриваются следующие задачи:
Создание книги, содержащей код VBA
Предоставление доверия расположению книги с помощью центра управления безопасностью в Excel
Добавление метода в класс ведущего элемента
Sheet1
Извлечение интерфейса для класса ведущего элемента
Sheet1
представление метода коду VBA;
Вызов метода из кода VBA
Примечание.
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация интегрированной среды разработки Visual Studio.
Необходимые компоненты
Для выполнения этого пошагового руководства требуются следующие компоненты:
Выпуск Visual Studio, включающий инструменты разработчика Microsoft Office. Дополнительные сведения см. в статье "Настройка компьютера для разработки решений Office".
Microsoft Excel
Создание книги, содержащей код VBA
Первым шагом является создание книги с поддержкой макросов, которая содержит простой макрос VBA. Прежде чем код в настройке можно будет предоставить VBA, книга уже должна содержать код VBA. В противном случае Visual Studio не сможет изменить проект VBA так, чтобы код VBA мог вызывать сборку настройки.
Если у вас уже есть книга, содержащая код VBA, который необходимо использовать, данный шаг можно пропустить.
Создание книги, содержащей код VBA
Запустите Excel.
Сохраните активный документ в виде книги с поддержкой макросов Excel (*.xlsm) с именем WorkbookWithVBA. Сохраните его в удобном месте, например на рабочем столе.
На ленте перейдите на вкладку Разработчик .
Примечание.
Если вкладка Разработчик не отображается, сделайте ее видимой. Дополнительные сведения см. в разделе "Практическое руководство. Отображение вкладки разработчика на ленте".
В группе Код щелкните Visual Basic.
Открывается редактор Visual Basic.
В окне Проект дважды щелкните ThisWorkbook.
Открывается файл кода для объекта
ThisWorkbook
.Добавьте следующий код VBA в файл кода. Этот код определяет простую функцию, которая не выполняет никаких действий. Данная функция предназначена исключительно для проверки наличия проекта VBA в книге. Это необходимо для выполнения последующих действий в данном пошаговом руководстве.
Sub EmptySub() End Sub
Сохраните документ и выйдите из Excel.
Создание проекта
Теперь можно создать проект на уровне документа для Excel, который использует созданную ранее книгу с поддержкой макросов.
Создание проекта
Запустите среду Visual Studio.
В меню Файл укажите Создать, затем нажмите Проект.
В области шаблонов разверните узел Visual C#, а затем узел Office/SharePoint.
Выберите узел Надстройки Office .
В списке шаблонов проектов выберите проект Книга Excel 2010 или Книга Excel 2013 .
В поле Имя введите CallingCodeFromVBA.
Щелкните OK.
Откроется Мастер проектов набора средств Visual Studio для Office .
Выберите Копировать существующий документи в поле Полный путь к существующему документу укажите расположение книги WorkbookWithVBA , которая была создана ранее. Если вы используете собственную книгу с поддержкой макросов, укажите расположение этой книги.
Нажмите кнопку Готово.
Visual Studio открывает книгу WorkbookWithVBA в конструкторе и добавляет проект CallingCodeFromVBA в Обозреватель решений.
Доверие к расположению книги
Перед предоставлением кода в своем решении коду VBA в книге необходимо предоставить доверие VBA на выполнение в книге. Для этого существует несколько способов. В этом пошаговом руководстве данную задачу предстоит выполнить путем предоставления доверия расположению книги в центре управления безопасностью в Excel.
Предоставление доверия расположению книги
Запустите Excel.
Перейдите на вкладку Файл .
Нажмите кнопку Параметры Excel .
В области категорий нажмите Центр управления безопасностью.
В области сведений нажмите Параметры центра управления безопасностью.
В области категорий нажмите Надежные расположения.
В области сведений нажмите Добавить новое расположение.
В диалоговом окне Надежное расположение Microsoft Office перейдите в папку, содержащую проект CallingCodeFromVBA .
Установите флажок Также доверять всем вложенным папкам.
В диалоговом окне Надежное расположение Microsoft Office нажмите кнопку ОК.
В диалоговом окне Центр управления безопасностью нажмите кнопку ОК.
В диалоговом окне Параметры Excel нажмите кнопку ОК.
Выйдите из Excel.
Добавление метода в класс Sheet1
Теперь, когда проект VBA настроен, добавьте открытый метод в класс ведущего элемента Sheet1
, который можно вызвать из кода VBA.
Порядок добавления метода в класс Sheet1
В обозревателе решенийщелкните правой кнопкой мыши файл Sheet1.csи выберите пункт Просмотреть код.
Файл Sheet1.cs открывается в редакторе кода.
Добавьте в класс
Sheet1
приведенный далее код. МетодCreateVstoNamedRange
создает новый объект NamedRange в указанном диапазоне. При этом также создается обработчик событий для события Selected в NamedRange. Далее в этом пошаговом руководстве будет вызван методCreateVstoNamedRange
из кода VBA в документе.private Microsoft.Office.Tools.Excel.NamedRange namedRange1; public void CreateVstoNamedRange(Excel.Range range, string name) { if (!this.Controls.Contains(name)) { namedRange1 = this.Controls.AddNamedRange(range, name); namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler( namedRange1_Selected); } else { MessageBox.Show("A named range with this specific name " + "already exists on the worksheet."); } } private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target) { MessageBox.Show("This named range was created by Visual Studio " + "Tools for Office."); }
Добавьте приведенный ниже метод в класс
Sheet1
. Этот метод переопределяет метод GetAutomationObject для возврата текущего экземпляра классаSheet1
.protected override object GetAutomationObject() { return this; }
Примените следующие атрибуты перед первой строкой объявления класса
Sheet1
. Эти атрибуты делают класс видимым для модели COM, но без создания интерфейса класса.[System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ClassInterface( System.Runtime.InteropServices.ClassInterfaceType.None)]
Извлечение интерфейса для класса Sheet1
Перед предоставлением метода CreateVstoNamedRange
коду VBA необходимо создать открытый интерфейс, который определяет данный метод, а также предоставить этот интерфейс модели COM.
Извлечение интерфейса для класса Sheet1
В файле кода Sheet1.cs щелкните в любом месте внутри класса
Sheet1
.В меню Рефакторинг выберите пункт Извлечь интерфейс.
В диалоговом окне Извлечение интерфейса в поле Выбрать открытые методы для создания интерфейса выберите значение для метода
CreateVstoNamedRange
.Щелкните OK.
Visual Studio создает новый интерфейс с именем
ISheet1
и изменяет определениеSheet1
класса таким образом, чтобы он реализовалISheet1
интерфейс. Visual Studio также открывает файл ISheet1.cs в редакторе кода.В файле ISheet1.cs замените объявление интерфейса
ISheet1
на следующий код. Этот код делает интерфейсISheet1
общедоступным и применяет атрибут ComVisibleAttribute , чтобы сделать интерфейс видимым для модели COM.[System.Runtime.InteropServices.ComVisible(true)] public interface ISheet1 { void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name); }
Выполните сборку проекта.
Предоставление метода коду VBA
Для предоставления метода CreateVstoNamedRange
коду VBA в книге установите для свойства ReferenceAssemblyFromVbaProject значения для ведущего элемента Sheet1
значение True.
Порядок представления метода коду VBA
В обозревателе решенийдважды щелкните файл Sheet1.cs.
Файл WorkbookWithVBA открывается в конструкторе, и отображается Sheet1.
В окне Свойства выберите свойство ReferenceAssemblyFromVbaProject и установите значение True.
Появляется сообщение, в котором следует нажать кнопку ОК .
Выполните сборку проекта.
Вызов метода из кода VBA
Теперь можно вызвать метод CreateVstoNamedRange
из кода VBA в книге.
Примечание.
В этом пошаговом руководстве будет добавлен код VBA в книгу во время отладки проекта. Код VBA, добавляемый в этот документ, будет перезаписан в следующий раз при построении проекта, так как Visual Studio заменяет документ в выходной папке сборки копией документа из главной папки проекта. Если код VBA необходимо сохранить, его можно скопировать в документ в папке проекта. Дополнительные сведения см. в разделе "Объединение настроек VBA и уровня документа".
Вызов метода из кода VBA
Нажмите клавишу F5 для запуска проекта.
На вкладке Разработчик в группе Код щелкните элемент Visual Basic.
Открывается редактор Visual Basic.
В меню Вставить выберите пункт Модуль.
Добавьте в новый модуль следующий код:
Этот код вызывает метод
CreateTable
в сборке настройки. Макрос обращается к этому методу, используя глобальный методGetManagedClass
для доступа к классу ведущего элементаSheet1
, который был предоставлен коду VBA. МетодGetManagedClass
был автоматически создан ранее при установке значения для свойства ReferenceAssemblyFromVbaProject в этом пошаговом руководстве.Sub CallVSTOMethod() Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1 Set VSTOSheet1 = GetManagedClass(Sheet1) Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange") End Sub
Нажмите клавишу F5.
В открытой книге щелкните ячейку A1 на листе Sheet1. Убедитесь, что появляется окно сообщения.
Выйдите из Excel без сохранения изменений.
Следующие шаги
Дополнительные сведения о вызове кода в решениях Office из VBA см. в следующих разделах:
Вызов кода в ведущем элементе в настройке Visual Basic из VBA. Этот процесс отличается от процесса Visual C#. Дополнительные сведения см. в пошаговом руководстве. Вызов кода из VBA в проекте Visual Basic.
Вызов кода в надстройке VSTO из VBA. Дополнительные сведения см. в пошаговом руководстве. Код вызова в надстройке VSTO из VBA.