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


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

В проекте Visual C# можно предоставить доступ к коду со стороны кода VBA, если необходимо обеспечить взаимодействие двух типов кода.

Процесс Visual C# отличается от процесса Visual Basic.Дополнительные сведения см. в разделе Практическое руководство. Предоставление доступа к коду со стороны VBA в проекте Visual Basic.

Применение. Сведения этого раздела применяются к проектам уровня документа для следующих приложений: Excel 2013 и Excel 2010; Word 2013 и Word 2010. Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.

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

Чтобы предоставить коду VBA возможность обращаться к коду проекта Visual C#, необходимо изменить код так, чтобы он стал видимым для COM, а затем в конструкторе присвоить свойству ReferenceAssemblyFromVbaProject значение True.

В разделе Пошаговое руководство. Вызов кода из VBA в проекте Visual C# представлены инструкции, демонстрирующие способ вызова метода в проекте Visual C# из VBA.

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

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

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

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

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

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

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

  4. Примените атрибуты ComVisibleAttribute и ClassInterfaceAttribute к классу, доступ к которому открывается для VBA.Эти атрибуты делают класс видимым для COM без создания интерфейса класса:

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    
  5. Переопределите метод GetAutomationObject класса ведущего элемента проекта, чтобы получить экземпляр класса, доступ к которому предоставляется VBA.

    • Если VBA предоставляется доступ к классу ведущего элемента, следует переопределить метод GetAutomationObject, принадлежащий данному классу, и получить текущий экземпляр класса:

      protected override object GetAutomationObject()
      {
          return this;
      }
      
    • Если VBA предоставляется доступ к классу, не являющемуся ведущим элементом, следует переопределить метод GetAutomationObject любого ведущего элемента проекта и получить экземпляр класса элемента, не являющегося ведущим.Например, следующий образец предполагает, что VBA предоставляется доступ к классу DocumentUtilities:

      protected override object GetAutomationObject()
      {
          return new DocumentUtilities();
      }
      

    Дополнительные сведения о ведущих элементах см. в разделе Общие сведения о ведущих элементах и элементах управления ведущего приложения.

  6. Извлеките интерфейс из класса, доступ к которому предоставляется VBA.В диалоговом окне Извлечение интерфейса выберите открытые элементы, которые необходимо включить в объявление интерфейса.Дополнительные сведения см. в разделе Рефакторинг для извлечения интерфейса (C#).

  7. Добавьте в объявление интерфейса ключевое слово public.

  8. Сделайте интерфейс видимым для COM, добавив следующий атрибут ComVisibleAttribute в интерфейс:

    [System.Runtime.InteropServices.ComVisible(true)]
    
  9. Откройте документ (для Word) или рабочий лист (для Excel) в конструкторе Visual Studio.

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

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

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

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

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

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

См. также

Задачи

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

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

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

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

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

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