Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве показано, как вызвать метод в настройке на уровне документа для 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.
Нажмите кнопку ОК.
Откроется мастер создания проектов 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.Нажмите кнопку ОК.
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
Чтобы сделать метод доступным для кода VBA в книге, задайте для свойства ReferenceAssemblyFromVbaProject хост-элемента Sheet1 значение True.
Предоставить метод для использования в коде VBA
В обозревателе решений дважды щелкните Sheet1.cs.
Файл WorkbookWithVBA открывается в конструкторе с видимым листом 1.
В окне свойств выберите свойство 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 на листе 1. Убедитесь, что появится поле сообщения.
Выйдите из Excel без сохранения изменений.
Дальнейшие шаги
Дополнительные сведения о вызове кода в решениях Office из VBA см. в следующих разделах:
Вызов программного кода в хост-элементе в адаптации Visual Basic из VBA. Этот процесс отличается от процесса Visual C#. Дополнительную информацию см. в руководстве: Вызов кода из VBA в проекте Visual Basic.
Вызов кода в надстройке VSTO из VBA. Для получения дополнительной информации см. Пошаговое руководство: вызов кода в надстройке VSTO из VBA.