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


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

В документе, который является частью настройки на уровне документа для Microsoft Office Word или Microsoft Office Excel, можно использовать код VBA (Visual Basic для приложений).Код VBA можно вызывать из сборки настройки в документе, также можно настроить проект таким образом, чтобы разрешить использование в документе кода VBA для вызова кода из сборки настройки.

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

Поведение кода VBA в настройке на уровне документа

При открытии проекта в Visual Studio документ открывается в режиме конструктора.Код VBA не выполняется в режиме конструктора, что позволяет работать над документом и кодом, не выполняя код VBA.

При запуске решения обработчики событий и в VBA, и в сборке настройки перехватывают события, возникающие в документе, и выполняют код.Заранее невозможно определить, какой код будет выполнен раньше; в каждом конкретном случае это выясняется путем тестирования.Если оба фрагмента кода нескоординированы и непротестированы, это может привести к непредсказуемым результатам.

Вызов кода VBA из сборки настройки

В документах Word можно вызывать макросы, а в книгах Excel — макросы и функции.Для этого воспользуйтесь одним из указанных ниже методов.

В каждом методе первый параметр определяет имя вызываемого макроса или функции, а остальные параметры — параметры, передаваемые макросу или функции.Первый параметр для приложений Word и Excel имеет различный формат.

  • Для приложения Word первый параметр представляет собой строку, которая может быть любым сочетанием шаблона, модуля и имени макроса.Если указано имя документа, в коде можно будет запускать только макросы из документов в текущем контексте, а не любые макросы из любого документа.

  • Для приложения Excel первый параметр может быть строкой, в которой хранится имя макроса, объектом Range, указывающим местоположение функции, или кодом реестра для зарегистрированной функции DLL (XLL).При передаче строки она будет интерпретироваться в контексте активного листа.

В приведенном ниже примере кода показано, как вызвать макрос с именем MyMacro в проекте на уровне документа для Excel.В данном примере предполагается, что для листа Sheet1 задан макрос MyMacro.

Globals.Sheet1.Application.Run("MyMacro")
Globals.Sheet1.Application.Run("MyMacro", missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing, 
    missing, missing, missing, missing, missing, missing);
ПримечаниеПримечание

Сведения об использовании в Visual C# вместо необязательных параметров глобальной переменной missing см. в разделе Написание кода в решениях Office.

Calling code in document-level customizations from VBA

Можно настроить проект уровня документа для Word или Excel таким образом, чтобы код Visual Basic для приложений (VBA) в документе мог вызывать код в сборке настройки.Это рекомендуется делать в следующих случаях.

  • Необходимо расширить существующий код VBA в документе с помощью возможностей настройки на уровне документа, связанной с этим же документом.

  • Необходимо предоставить доступ к службам, разрабатываемым в настройке на уровне документа, конечным пользователям, которые могут обращаться к службам, записывая код VBA в документ.

Средства разработки Office в Visual Studio предоставляют подобную функцию для надстроек уровня приложения.При разработке надстройки можно вызывать код в надстройке из других решений Microsoft Office.Дополнительные сведения см. в разделе Вызов кода в надстройках уровня приложения из других решений Office.

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

Эту функцию нельзя использовать в проектах шаблонов Word.Она может быть использована только в документе Word, книге Excel или проектах Excel.

Требования

Чтобы код VBA мог быть вызван в сборке настройки, проект должен соответствовать следующим требованиям.

  • Документ должен иметь одно из следующих расширений имени файла:

    • Для Word: DOCM или DOC

    • для Excel: XLSM, XLTM, XLS или XLT.

  • Документ должен содержать проект VBA, который, в свою очередь, содержит код VBA.

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

  • В проект Office должен входить по крайней мере один открытый класс, содержащий один или несколько открытых участников, предоставляемых коду VBA.

    Можно предоставлять коду VBA методы, свойства и события.Предоставляемый класс может быть классом ведущего элемента (например, ThisDocument для Word или ThisWorkbook и Sheet1 для Excel) или другим классом, определенным в проекте.Дополнительные сведения о ведущих элементах см. в разделе Общие сведения о ведущих элементах и элементах управления ведущего приложения.

Предоставление коду VBA возможности вызова кода сборки настройки

Существует два способа, с помощью которых можно предоставлять члены в сборке настройки коду VBA в документе.

  • Можно предоставлять члены класса ведущего элемента в проекте Visual Basic коду VBA.Для этого установите свойство ведущего элемента EnableVbaCallers равным True в окне Свойства, когда ведущий элемент (то есть документ, лист или книга) открыт в конструкторе.Visual Studio автоматически выполнит все действия, необходимые для вызова участников класса из кода VBA.

  • Можно предоставлять коду VBA члены любого открытого класса в проекте Visual C# или члены класса, не являющегося классом ведущего элемента, в проекте Visual Basic.Этот вариант предоставляет более широкий выбор классов, которые можно предоставить коду VBA, но для него требуется выполнение большего количества действий вручную.

    Для реализации последнего варианта необходимо вручную выполнить следующие действия.

    1. Предоставьте класс модели COM.

    2. Переопределите метод GetAutomationObject класса ведущего элемента проекта, чтобы получить экземпляр класса, к которому предоставляется доступ из кода VBA.

    3. Задайте для свойства ReferenceAssemblyFromVbaProject любого класса ведущего элемента в проекте значение True.Это приведет к внедрению библиотеки типов сборки настройки в сборку и добавлению ссылки на библиотеку типов в проект VBA в документе.

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

Свойства EnableVbaCallers и ReferenceAssemblyFromVbaProject доступны только в окне Свойства во время разработки. Их нельзя использовать во время выполнения.Чтобы просмотреть свойства, откройте конструктор для ведущего элемента в Visual Studio.Дополнительные сведения о конкретных задачах, выполняемых Visual Studio при установке данных свойств, см. в разделе Задачи, выполняемые с помощью свойств ведущего элемента.

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

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

Использование членов кода VBA для вызова кода в сборке настройки

После настройки проекта для предоставления коду VBA возможности вызова кода в сборке настройки пакет инструментов Visual Studio добавляет следующие участники в проект VBA в документе.

  • Visual Studio добавляет глобальный метод GetManagedClass для всех проектов.

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

Для доступа к открытым участникам класса, предоставляемого коду VBA в проекте, можно использовать свойство CallVSTOAssembly или метод GetManagedClass.

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

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

3hekt07s.collapse_all(ru-ru,VS.110).gifИспользование свойства "CallVSTOAssembly" в проекте Visual Basic

Для доступа к открытым членам, добавленным к классу ведущего элемента, следует использовать свойство CallVSTOAssembly.Например, следующий макрос VBA вызывает метод MyVSTOMethod, определенный в классе Sheet1 в проекте книги Excel.

Sub MyMacro()
    Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub

Свойство представляет собой более удобный способ отправки вызова в сборку настройки, чем использование метода GetManagedClass напрямую.CallVSTOAssembly возвращает объект, представляющий класс ведущего элемента, который был предоставлен коду VBA.Члены и параметры метода возвращенного объекта отображаются в IntelliSense.

Свойство CallVSTOAssembly имеет объявление, сходное со следующим кодом.В этом коде предполагается, что класс ведущего элемента Sheet1 в проекте книги Excel ExcelWorkbook1 предоставляется коду VBA.

Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
    Set CallVSTOAssembly = GetManagedClass(Me)
End Property

3hekt07s.collapse_all(ru-ru,VS.110).gifИспользование метода GetManagedClass

Чтобы использовать глобальный метод GetManagedClass, следует передать коду VBA объект, соответствующий классу ведущего элемента, содержащему переопределенный метод GetAutomationObject.Затем следует использовать полученный объект для доступа к классу, переданному коду VBA.

Например, следующий макрос VBA вызывает метод MyVSTOMethod, определенный в классе ведущего элемента Sheet1 в проекте книги Excel ExcelWorkbook1.

Sub CallVSTOMethod
    Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
    Set VSTOSheet1 = GetManagedClass(Sheet1)
    VSTOSheet1.MyVSTOMethod
End Sub

Метод GetManagedClass имеет следующее объявление.

GetManagedClass(pdispInteropObject Object) As Object

Этот метод возвращает объект, представляющий класс, предоставленный коду VBA.Члены и параметры метода возвращенного объекта отображаются в IntelliSense.

Правила добавления кода VBA в документ

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

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

Если необходимо сохранить код VBA, добавленный в документ при отладке или выполнении решения, следует скопировать код VBA в документ из папки проекта.Дополнительные сведения о процессе построения см. в разделе Построение решений Office.

Когда решение уже готово для развертывания, существует три основных расположения документа, в которые можно добавить код VBA.

3hekt07s.collapse_all(ru-ru,VS.110).gifВ папке проекта на компьютере разработчика

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

Нельзя добавлять код VBA в документ, открытый в конструкторе.Необходимо сначала закрыть документ в конструкторе, а затем открыть его непосредственно в Word или Excel.

Предупреждающее замечаниеВнимание

При добавлении кода VBA, который выполняется, когда документ открыт, в редких случаях код может повредить документ или сделать невозможным его открытие в конструкторе.

3hekt07s.collapse_all(ru-ru,VS.110).gifВ папке публикации или установки

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

Если пользователи устанавливают решение непосредственно из папки публикации, необходимо добавлять код VBA в документ при каждой публикации решения.Visual Studio перезаписывает документ в папке публикации при каждой публикации решения.

Если пользователи устанавливают решение из папки установки, отличной от папки публикации, можно избежать необходимости добавлять код VBA в документ при каждой публикации решения.Когда обновление публикации готово для перемещения из папки публикации в папку установки, следует скопировать все файлы в папку установки, кроме самого документа.

3hekt07s.collapse_all(ru-ru,VS.110).gifНа компьютере конечного пользователя

Если конечные пользователи являются разработчиками VBA, вызывающими службы, которые предоставляются с настройкой уровня документа, можно сообщить им способ вызова кода с помощью свойства CallVSTOAssembly или метода GetManagedClass в их копиях документа.При публикации обновлений для решения код VBA в документе на компьютере конечного пользователя не будет перезаписан, поскольку документ не изменяется при обновлении публикации.

Задачи, выполняемые с помощью свойств ведущего элемента

При использовании свойств EnableVbaCallers и ReferenceAssemblyFromVbaProject пакет Visual Studio выполняет различные наборы задач.

3hekt07s.collapse_all(ru-ru,VS.110).gifEnableVbaCallers

Если для свойства EnableVbaCallers ведущего элемента в проекте Visual Basic установлено значение True, то пакет Visual Studio выполняет следующие задачи.

  1. Добавляет атрибуты ComClassAttribute и ComVisibleAttribute к классу ведущего элемента.

  2. Переопределяет метод GetAutomationObject класса ведущего элемента.

  3. Устанавливает для свойства ReferenceAssemblyFromVbaProject ведущего элемента значение True.

Если снова задать для свойства EnableVbaCallers значение False, то пакет Visual Studio выполняет следующие задачи.

  1. Удаляет атрибуты ComClassAttribute и ComVisibleAttribute из класса ThisDocument.

  2. Удаляет метод GetAutomationObject из класса ведущего элемента.

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

    Visual Studio не устанавливает для свойства ReferenceAssemblyFromVbaProject значение False автоматически.Можно установить для этого свойства значение False вручную с помощью окна Свойства.

3hekt07s.collapse_all(ru-ru,VS.110).gifReferenceAssemblyFromVbaProject

Если для свойства ReferenceAssemblyFromVbaProject какого-либо ведущего элемента в проекте Visual Basic или Visual C# установлено значение True, то пакет Visual Studio выполняет следующие задачи.

  1. Создает библиотеку типов для сборки настройки и внедряет библиотеку типов в сборку.

  2. Добавляет ссылку на следующие библиотеки типов в проекте VBA в документе.

    • Библиотека типов для сборки настройки.

    • Библиотека типов для ядра исполнения Microsoft Visual Studio Tools for Office Execution Engine 9.0.Эта библиотека типов включена в Visual Studio Tools for Office (cреда выполнения).

Если снова задать для свойства ReferenceAssemblyFromVbaProject значение False, то пакет Visual Studio выполняет следующие задачи.

  1. Удаляет ссылки на библиотеки типов из проекта VBA в документе.

  2. Удаляет внедренные библиотеки типов из сборки.

Устранение неполадок

В следующей таблице приведены типичные ошибки и рекомендации по их устранению.

Ошибка

Рекомендации

После задания значения для свойства EnableVbaCallers или ReferenceAssemblyFromVbaProject появляется сообщение об ошибке с информацией о том, что документ не содержит проект VBA или отсутствуют необходимые разрешения для доступа к проекту VBA в документе.

Убедитесь, что документ в проекте содержит по крайней мере один макрос VBA, проекту VBA предоставлен достаточный уровень доверия для выполнения и проект не защищен паролем.

После задания значения для свойства EnableVbaCallers или ReferenceAssemblyFromVbaProject появляется сообщение об ошибке с информацией о том, что объявление атрибута GuidAttribute отсутствует или повреждено.

Убедитесь, что объявление атрибута GuidAttribute расположено в файле AssemblyInfo.cs или AssemblyInfo.vb проекта и для этого атрибута указан допустимый идентификатор GUID.

После задания значения для свойства EnableVbaCallers или ReferenceAssemblyFromVbaProject появляется сообщение об ошибке с информацией о том, что номер версии, указанный в атрибуте AssemblyVersionAttribute, не является допустимым.

Убедитесь, что объявление атрибута AssemblyVersionAttribute расположено в файле AssemblyInfo.cs или AssemblyInfo.vb проекта и для этого атрибута указан допустимый номер версии.Дополнительные сведения о допустимых номерах версий сборок см. в описании класса AssemblyVersionAttribute.

После переименования сборки настройки код VBA, который вызывает код сборки настройки, прекращает выполняться.

Если изменить имя сборки настройки после предоставления его коду VBA, связь между проектом VBA в документе и сборкой настройки будет нарушена.Чтобы исправить данную ошибку, следует изменить значение свойства ReferenceFromVbaAssembly в проекте на False, затем снова установить значение True. После этого следует заменить все ссылки на старое имя сборки в коде VBA на новое имя сборки.

См. также

Задачи

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

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

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

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

Основные понятия

Сравнение решений Office и VBA в Visual Studio

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

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

Настройки программирования уровня документа