Предоставление кода 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
Откройте или создайте проект уровня документа, основанный на документе Word, книге Excel или шаблоне Excel, поддерживающем макросы, и который уже содержит код VBA.
Дополнительные сведения о форматах файлов документов, поддерживающих макросы, см. в разделе "Объединение настроек VBA и уровня документа".
Примечание.
Эту функцию нельзя использовать в проектах шаблонов Word.
Убедитесь, что код VBA в документе разрешено запускать без запроса пользователя включить макросы. Чтобы разрешить выполнение кода VBA, расположение проекта Office можно добавить в список надежных расположений в параметрах Центра управления безопасностью для Word или Excel.
Добавьте участника, который вы хотите предоставить VBA общедоступному классу в проекте, и объявите нового члена как общедоступного.
Примените следующие ComVisibleAttribute и ClassInterfaceAttribute атрибуты к классу, который вы подвергаете VBA. Эти атрибуты делают класс видимым для модели COM, но без создания интерфейса класса.
[System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ClassInterface( System.Runtime.InteropServices.ClassInterfaceType.None)]
Переопределите метод GetAutomationObject класса элемента узла в проекте, чтобы вернуть экземпляр класса, который вы подвергаете VBA:
Если класс элемента узла представляется VBA, переопределите метод GetAutomationObject , принадлежащий этому классу, и верните текущий экземпляр класса.
protected override object GetAutomationObject() { return this; }
Если вы представляете класс, который не является основным элементом VBA, переопределите метод GetAutomationObject любого ведущего элемента в проекте и возвращает экземпляр класса элементов, не являющихся узлами. Например, в следующем коде предполагается, что вы представляете класс с именем
DocumentUtilities
VBA.protected override object GetAutomationObject() { return new DocumentUtilities(); }
Дополнительные сведения о элементах узла см. в обзоре элементов узла и элементов управления узлами.
Извлеките интерфейс из класса, который вы подвергаете VBA. В диалоговом окне "Извлечение интерфейса" выберите общедоступные члены, которые необходимо включить в объявление интерфейса. Дополнительные сведения см. в разделе "Извлечение рефакторинг интерфейса".
Добавьте общедоступную ключевое слово в объявление интерфейса.
Сделайте интерфейс видимым для COM, добавив следующий ComVisibleAttribute атрибут в интерфейс.
[System.Runtime.InteropServices.ComVisible(true)]
Откройте документ (для Word) или лист (для Excel) в конструкторе в Visual Studio.
В окне Свойства выберите свойство ReferenceAssemblyFromVbaProject и установите значение True.
Примечание.
Если книга или документ еще не содержит код VBA или если код VBA в документе не является доверенным для выполнения, при установке свойства ReferenceAssemblyFromVbaProject свойство ReferenceAssemblyFromVbaProject имеет значение True. Это происходит потому, что в данной ситуации Visual Studio не может изменить проект VBA в документе.
Появляется сообщение, в котором следует нажать кнопку ОК . Это сообщение напоминает вам, что при добавлении кода VBA в книгу или документ при запуске проекта из Visual Studio код VBA будет потерян при следующем создании проекта. Это связано с тем, что документ в выходной папке сборки перезаписывается каждый раз при сборке проекта.
На этом этапе Visual Studio настраивает проект так, чтобы проект VBA можно было вызвать в сборку. Visual Studio также добавляет метод с именем
GetManagedClass
в проект VBA. Этот метод можно вызвать в любом месте проекта VBA, чтобы получить доступ к классу, который вы предоставили VBA.Выполните сборку проекта.