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


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

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

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

Область применения. Сведения в этом разделе относятся к проектам уровня документа для Excel и Word. Дополнительные сведения см. в разделе "Функции", доступные по Приложение Office ликации и типу проекта.

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

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

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

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

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

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

    Примечание.

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

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

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

  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 любого ведущего элемента в проекте и возвращает экземпляр класса элементов, не являющихся узлами. Например, в следующем коде предполагается, что вы представляете класс с именем DocumentUtilities VBA.

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

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

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

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

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

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

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

    Примечание.

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

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

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

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