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