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


Практическое руководство. Предоставление доступа к коду со стороны 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

  1. Откройте или создайте проект уровня документа Visual Basic, основанный на документе Word, рабочей книге Excel или шаблоне Excel, поддерживающем макросы и уже содержащем код VBA. 

    Дополнительные сведения о форматах файлов документов, поддерживающих макросы, см. в разделе Объединение настроек VBA и настроек на уровне документа.

    ПримечаниеПримечание

    Эту функцию нельзя использовать в проектах шаблонов Word.

  2. Убедитесь в том, что выполнение кода VBA в документе разрешено без вывода пользователю сообщения о необходимости включения макросов.Чтобы сделать код VBA надежным и разрешить его выполнение, добавьте расположение проекта Office в список надежных расположений в параметрах центра управления безопасностью для Word или Excel.

  3. Добавьте свойство, метод или событие, к которым необходимо предоставить доступ из кода VBA, в один из классов ведущего элемента проекта и объявите новый элемент с помощью модификатора Public.Имя класса зависит от приложения:

    • в проектах Word классу ведущего элемента по умолчанию присваивается имя ThisDocument;

    • в проектах Excel классам ведущего элемента по умолчанию присваиваются имена ThisWorkbook, Sheet1, Sheet2 и Sheet3.

  4. Для свойства EnableVbaCallers ведущего элемента установите значение True.Это свойство доступно в окне Свойства для открытого в конструкторе ведущего элемента.

    После установки этого свойства в Visual Studio свойству ReferenceAssemblyFromVbaProject автоматически присваивается значение True.

    ПримечаниеПримечание

    Если книга или документ не содержат кода VBA, или код VBA в документе не имеет доверия для выполнения, при присваивании свойству EnableVbaCallers значения True отображается сообщение об ошибке.Это связано с тем, что в данном случае в Visual Studio не поддерживается изменение проекта VBA в документе.

  5. В появившимся окне с сообщением нажмите кнопку ОК.В этом сообщении содержится уведомление о том, что при добавлении кода VBA в книгу или документ во время выполнения проекта в среде Visual Studio этот код будет потерян при следующем построении проекта.Это происходит потому, что документ в выходной папке сборки перезаписывается при каждом построении проекта.

    На этом этапе Visual Studio настраивает проект, чтобы проект VBA мог обращаться к данной сборке.Visual Studio также добавляет свойство с именем CallVSTOAssembly в модуль проекта VBA ThisDocument, ThisWorkbook, Sheet1, Sheet2 или Sheet3.Это свойство можно использовать для обращения к открытым элементам класса, к которому предоставляется доступ из кода VBA.

  6. Выполните построение проекта.

Предоставление доступа к коду в классе, не являющемся классом ведущего элемента

Чтобы разрешить вызов кода Visual Basic в классе, не являющемся классом ведущего элемента, из кода VBA, измените код таким образом, чтобы он был видим из кода VBA.

Предоставление доступа к коду в классе, не являющемся классом ведущего элемента, из кода VBA

  1. Откройте или создайте проект уровня документа Visual Basic, основанный на документе Word, рабочей книге Excel или шаблоне Excel, поддерживающем макросы и уже содержащем код VBA.

    Дополнительные сведения о форматах файлов документов, поддерживающих макросы, см. в разделе Объединение настроек VBA и настроек на уровне документа.

    ПримечаниеПримечание

    Эту функцию нельзя использовать в проектах шаблонов Word.

  2. Убедитесь в том, что выполнение кода VBA в документе разрешено без вывода пользователю сообщения о необходимости включения макросов.Чтобы сделать код VBA надежным и разрешить его выполнение, добавьте расположение проекта Office в список надежных расположений в параметрах центра управления безопасностью для Word или Excel.

  3. Добавьте элемент, доступ к которому необходимо открыть для VBA, в открытый класс проекта и объявите новый элемент как public.

  4. Примените атрибуты ComVisibleAttribute и ComClassAttribute к классу, доступ к которому открывается для VBA.Эти атрибуты обеспечивают видимость класса для кода VBA.

    <Microsoft.VisualBasic.ComClass()> _
    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    
  5. Переопределите метод GetAutomationObject класса ведущего элемента проекта, чтобы получить экземпляр класса, к которому предоставляется доступ из кода VBA.В следующем примере коду VBA предоставляется доступ к классу DocumentUtilities.

    Protected Overrides Function GetAutomationObject() As Object
        Return New DocumentUtilities()
    End Function
    
  6. Откройте документ (для Word) или лист (для Excel) в конструкторе Visual Studio.

  7. В окне Свойства выберите свойство ReferenceAssemblyFromVbaProject и измените его значение на True.

    ПримечаниеПримечание

    Если книга или документ не содержат кода VBA, или код VBA в документе не имеет доверия для выполнения, при присваивании свойству ReferenceAssemblyFromVbaProject значения True отображается сообщение об ошибке.Это связано с тем, что в данном случае в Visual Studio не поддерживается изменение проекта VBA в документе.

  8. В появившимся окне с сообщением нажмите кнопку ОК.В этом сообщении содержится уведомление о том, что при добавлении кода VBA в книгу или документ во время выполнения проекта в среде Visual Studio этот код будет потерян при следующем построении проекта.Это происходит потому, что документ в выходной папке сборки перезаписывается при каждом построении проекта.

    На этом этапе Visual Studio настраивает проект, чтобы проект VBA мог обращаться к данной сборке.Visual Studio также добавляет метод с названием GetManagedClass в проект VBA.Этот метод можно вызывать в любом месте проекта VBA для доступа к классу, открытому для VBA.

  9. Выполните построение проекта.

См. также

Задачи

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

Пошаговое руководство. Вызов кода из VBA в проекте Visual Basic

Практическое руководство. Предоставление доступа к коду со стороны VBA в проекте Visual C#

Другие ресурсы

Проектирование и создание решений Office

Объединение настроек VBA и настроек на уровне документа