Практическое руководство. Предоставление доступа к коду со стороны VBA в проекте Visual Basic
В проекте Visual Basic можно предоставить доступ к коду со стороны кода VBA, если необходимо обеспечить взаимодействие двух типов кода.
Применение. Сведения этого раздела применяются к проектам уровня документа для следующих приложений: Excel 2013 и Excel 2010; Word 2013 и Word 2010. Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.
Этот процесс для Visual Basic отличается от процесса для Visual C#.Дополнительные сведения см. в разделе Практическое руководство. Предоставление доступа к коду со стороны VBA в проекте Visual C#.
Процесс для кода в классе ведущего элемента отличается от процесса для кода в других классах:
Предоставление доступа к коду в классе ведущего элемента
Предоставление доступа к коду в классе, не являющемся классом ведущего элемента
Для просмотра связанных демонстрационных видеороликов перейдите по ссылке Инструкции по вызову кода VSTO из VBA (страница может быть на английском языке).
Предоставление доступа к коду в классе ведущего элемента
Чтобы разрешить вызов кода в классе ведущего элемента Visual Basic из кода VBA, установите для свойства EnableVbaCallers ведущего элемента значение True.
В разделе Пошаговое руководство. Вызов кода из VBA в проекте Visual Basic представлено пошаговое руководство по предоставлению доступа к методу класса ведущего элемента и его последующему вызову из кода VBA.Дополнительные сведения о ведущих элементах см. в разделе Общие сведения о ведущих элементах и элементах управления ведущего приложения.
Предоставление доступа к коду ведущего элемента из кода VBA
Откройте или создайте проект уровня документа Visual Basic, основанный на документе Word, рабочей книге Excel или шаблоне Excel, поддерживающем макросы и уже содержащем код VBA.
Дополнительные сведения о форматах файлов документов, поддерживающих макросы, см. в разделе Объединение настроек VBA и настроек на уровне документа.
Примечание
Эту функцию нельзя использовать в проектах шаблонов Word.
Убедитесь в том, что выполнение кода VBA в документе разрешено без вывода пользователю сообщения о необходимости включения макросов.Чтобы сделать код VBA надежным и разрешить его выполнение, добавьте расположение проекта Office в список надежных расположений в параметрах центра управления безопасностью для Word или Excel.
Добавьте свойство, метод или событие, к которым необходимо предоставить доступ из кода VBA, в один из классов ведущего элемента проекта и объявите новый элемент с помощью модификатора Public.Имя класса зависит от приложения:
в проектах Word классу ведущего элемента по умолчанию присваивается имя ThisDocument;
в проектах Excel классам ведущего элемента по умолчанию присваиваются имена ThisWorkbook, Sheet1, Sheet2 и Sheet3.
Для свойства EnableVbaCallers ведущего элемента установите значение True.Это свойство доступно в окне Свойства для открытого в конструкторе ведущего элемента.
После установки этого свойства в Visual Studio свойству ReferenceAssemblyFromVbaProject автоматически присваивается значение True.
Примечание
Если книга или документ не содержат кода VBA, или код VBA в документе не имеет доверия для выполнения, при присваивании свойству EnableVbaCallers значения True отображается сообщение об ошибке.Это связано с тем, что в данном случае в Visual Studio не поддерживается изменение проекта VBA в документе.
В появившимся окне с сообщением нажмите кнопку ОК.В этом сообщении содержится уведомление о том, что при добавлении кода VBA в книгу или документ во время выполнения проекта в среде Visual Studio этот код будет потерян при следующем построении проекта.Это происходит потому, что документ в выходной папке сборки перезаписывается при каждом построении проекта.
На этом этапе Visual Studio настраивает проект, чтобы проект VBA мог обращаться к данной сборке.Visual Studio также добавляет свойство с именем CallVSTOAssembly в модуль проекта VBA ThisDocument, ThisWorkbook, Sheet1, Sheet2 или Sheet3.Это свойство можно использовать для обращения к открытым элементам класса, к которому предоставляется доступ из кода VBA.
Выполните построение проекта.
Предоставление доступа к коду в классе, не являющемся классом ведущего элемента
Чтобы разрешить вызов кода Visual Basic в классе, не являющемся классом ведущего элемента, из кода VBA, измените код таким образом, чтобы он был видим из кода VBA.
Предоставление доступа к коду в классе, не являющемся классом ведущего элемента, из кода VBA
Откройте или создайте проект уровня документа Visual Basic, основанный на документе Word, рабочей книге Excel или шаблоне Excel, поддерживающем макросы и уже содержащем код VBA.
Дополнительные сведения о форматах файлов документов, поддерживающих макросы, см. в разделе Объединение настроек VBA и настроек на уровне документа.
Примечание
Эту функцию нельзя использовать в проектах шаблонов Word.
Убедитесь в том, что выполнение кода VBA в документе разрешено без вывода пользователю сообщения о необходимости включения макросов.Чтобы сделать код VBA надежным и разрешить его выполнение, добавьте расположение проекта Office в список надежных расположений в параметрах центра управления безопасностью для Word или Excel.
Добавьте элемент, доступ к которому необходимо открыть для VBA, в открытый класс проекта и объявите новый элемент как public.
Примените атрибуты ComVisibleAttribute и ComClassAttribute к классу, доступ к которому открывается для VBA.Эти атрибуты обеспечивают видимость класса для кода VBA.
<Microsoft.VisualBasic.ComClass()> _ <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Переопределите метод GetAutomationObject класса ведущего элемента проекта, чтобы получить экземпляр класса, к которому предоставляется доступ из кода VBA.В следующем примере коду VBA предоставляется доступ к классу DocumentUtilities.
Protected Overrides Function GetAutomationObject() As Object Return New DocumentUtilities() End Function
Откройте документ (для Word) или лист (для Excel) в конструкторе Visual Studio.
В окне Свойства выберите свойство ReferenceAssemblyFromVbaProject и измените его значение на True.
Примечание
Если книга или документ не содержат кода VBA, или код VBA в документе не имеет доверия для выполнения, при присваивании свойству ReferenceAssemblyFromVbaProject значения True отображается сообщение об ошибке.Это связано с тем, что в данном случае в Visual Studio не поддерживается изменение проекта VBA в документе.
В появившимся окне с сообщением нажмите кнопку ОК.В этом сообщении содержится уведомление о том, что при добавлении кода VBA в книгу или документ во время выполнения проекта в среде Visual Studio этот код будет потерян при следующем построении проекта.Это происходит потому, что документ в выходной папке сборки перезаписывается при каждом построении проекта.
На этом этапе Visual Studio настраивает проект, чтобы проект VBA мог обращаться к данной сборке.Visual Studio также добавляет метод с названием GetManagedClass в проект VBA.Этот метод можно вызывать в любом месте проекта VBA для доступа к классу, открытому для VBA.
Выполните построение проекта.
См. также
Задачи
Практическое руководство. Создание проектов Office в Visual Studio
Пошаговое руководство. Вызов кода из VBA в проекте Visual Basic
Практическое руководство. Предоставление доступа к коду со стороны VBA в проекте Visual C#