Как создать надстройки VBA, чтобы автоматизировать обработку документов Microsoft Office и расширить ее возможности

Сводка.  В статье приведены сведения о создании надстроек для приложений Microsoft Word, Microsoft PowerPoint и Microsoft Excel с помощью языка программирования Microsoft Visual Basic для приложений (VBA). Рассматриваются случаи, в которых рекомендуется использовать VBA для создания надстроек, и приводятся примеры задач, которые можно включить в надстройки VBA для Microsoft Office 2010.

Дата последнего изменения: 24 апреля 2015 г.

Применимо к: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Word 2010

В этой статье
Причины использования VBA
Когда следует использовать VBA
Создание файлов надстроек VBA
Устранение неполадок надстроек
Возможности надстроек VBA
Управление кодом VBA
Дальнейшие действия
Дополнительные ресурсы
Об авторе

Дата публикации:  февраль 2011 г.

Автор: Стефани Кригер (Stephanie Krieger)

Содержание

  • Причины использования VBA

  • Когда следует использовать VBA

  • Создание файлов надстроек VBA

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

  • Возможности надстроек VBA

  • Управление кодом VBA

  • Дальнейшие действия

  • Дополнительные ресурсы

  • Об авторе

Щелкните, чтобы получить код Загрузить образец кода

Причины использования VBA

Как разработчик вы можете использовать VBA для взаимодействия с управляемым кодом при автоматизации работы с документами и шаблонами. Однако используете ли вы все преимущества VBA? Если начиная новый проект Microsoft Office вы в первую очередь открываете Microsoft Visual Studio, возможно, вы делаете лишнюю работу.

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

Когда следует использовать VBA

Не так давно у крупной компании возникли сложности с созданием простой надстройки в Visual Studio. Эта надстройка служила для добавления вкладки на ленту в приложениях Word, PowerPoint и Excel. Вкладка должна была содержать ссылки на ряд разделов справки.

Когда представители компании обратились ко мне за помощью, я спросил их, почему они не использовали VBA в таком простом случае. Оказалось, что никакой особой причины нет. Им просто не приходило в голову использовать что-то еще помимо Visual Studio. Итак, я открыл редакторы Visual Basic в приложениях Office 2010, и примерно через час были полностью готовы простые надстройки для Word, Excel и PowerPoint с пользовательским интерфейсом, который выглядел именно так, как планировалось изначально.

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

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

В следующих разделах приводятся сведения о создании файлов надстроек в приложениях Word, PowerPoint и Excel. Затем приводятся примеры типов задач, которые можно решать с помощью надстроек: от упрощения создания корпоративных документов до взаимодействия со встроенными возможностями Office 2010.

Создание файлов надстроек VBA

В этом разделе приводятся сведения о создании простых надстроек для приложений Word, PowerPoint и Excel на основе приведенного выше примера. Каждая надстройка служит для добавления на ленту настраиваемой вкладки, предоставляющей пользователям быстрый доступ к определенному набору разделов справки.

Создание надстройки Word

Надстройки VBA для приложения Word представляют собой глобальные шаблоны. Глобальные шаблоны устанавливаются так, что они остаются доступными вне зависимости от активного документа. Чтобы создать надстройку Word, необходимо создать DOTM-файл (шаблон Word с поддержкой макросов).

Порядок создания проекта VBA

  1. Открыв шаблон DOTM в приложении Word, на вкладке Разработчик в группе Код нажмите кнопку Visual Basic. Также можно нажать сочетание клавиш ALT+F11.

  2. В меню Insert (Вставка) выберите пункт Module (Модуль). В окне Properties (Свойства) задайте имя модуля.

  3. В меню Tools (Сервис) выберите пункт Project Properties (Свойства проекта), чтобы задать имя проекта, добавить его описание или настроить защиту с помощью пароля.

Ниже приведен код пользовательской надстройки справки. Скопируйте этот код в созданный модуль.

Важно!

Файлы, на которые ссылаются данные макросы, можно получить, загрузив руководства по продуктам Office 2010 и руководства по интерактивным меню на ленте в Центре загрузки Майкрософт. Файл-прототип, который можно использовать в качестве документа с рекомендациями по фирменной символике компании, можно найти в загружаемом пакете с примерами для данной статьи. Обратите внимание на то, что для тестирования надстройки необходимо сохранить эти файлы, используя путь и имена, указанные в макросах. Если используется другой путь и имена файлов, внесите соответствующие изменения в макросы.

Также обратите внимание на то, что полные версии всех надстроек, используемых в качестве примеров в этой статье, включены в загружаемый пакет с образцами кода. Однако для тестирования пользовательских надстроек справки для приложений Word, PowerPoint и Excel необходимо загрузить и сохранить или установить соответствующие руководства по продуктам или руководства по интерактивным меню на ленте.

Option Explicit
Public oPath As String

Sub CommandRef(ByVal Control As IRibbonControl)
On Error GoTo Errorhandler
'The FollowHyperlink method used in this procedure requires an open document.
With Documents
    If .Count = 0 Then
    .Add
    End If
End With
'If you use the environmental variable for program files as shown here,
'(which is usually advisable) rather than hard-coding the drive letter,
'note that 64-bit machines that include both a Program Files x86 folder
'and a Program Files folder may not point to the desired location.
oPath = Environ("ProgramFiles")
ActiveDocument.FollowHyperlink Address:=oPath & _
    "\CompanyTools\CustomHelp\Word 2010\Word 2010 Guide.html", NewWindow:=True
Exit Sub
Errorhandler:
'Error 4198 occurs if the file name or path is not found.
If Err.Number = 4198 Then
    MsgBox "The Word 2010 Interactive Guide is unavailable. " & _
        "Consult your local IT department for assistance.", vbInformation
End If
End Sub

Sub ProductGuide(ByVal Control As IRibbonControl)
On Error GoTo Errorhandler
With Documents
    If .Count = 0 Then
        .Add
    End If
End With
oPath = Environ("ProgramFiles")
ActiveDocument.FollowHyperlink Address:=oPath & _
    "\CompanyTools\CustomHelp\WordProductGuide.pdf", NewWindow:=True
Exit Sub
Errorhandler:
If Err.Number = 4198 Then
    MsgBox "The file 'WordProductGuide.pdf' is unavailable. " & _
        "Consult your local IT department for assistance.", vbInformation
End If
End Sub

Sub BrandOverview(ByVal Control As IRibbonControl)
On Error GoTo Errorhandler
With Documents
    If .Count = 0 Then
    .Add
    End If
End With
oPath = Environ("ProgramFiles")
ActiveDocument.FollowHyperlink Address:=oPath & _
    "\CompanyTools\CustomHelp\Brand Guidelines.pdf", NewWindow:=True
Exit Sub
Errorhandler:
If Err.Number = 4198 Then
    MsgBox "The file 'Brand Guidelines.pdf' is unavailable. " & _
        "Consult your local IT department for assistance.", vbInformation
End If
End Sub

Примечание

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

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

Чтобы установить глобальный шаблон, выйдите из приложения Word и сохраните файл в папку автозагрузки Word. При запуске приложения Word оно автоматически загружает глобальные шаблоны, находящиеся в этой папке. Однако чтобы надстройка могла загружаться, сначала необходимо добавить разметку Office Open XML для настраиваемой вкладки на ленте, как описано в следующем разделе.

В Microsoft Windows 7 и Windows Vista папка автозагрузки Word по умолчанию находится по следующему пути: C:\Users\[имя_пользователя]\AppData\Roaming\Microsoft\Word\Startup. Для управления глобальными шаблонами надстроек или проверки загрузки надстройки в приложении Word на вкладке Разработчик нажмите кнопку Надстройки.

Если необходимо изменить код после загрузки надстройки, откройте DOTM-файл в приложении Word. Приложение Word автоматически заменяет ранее загруженный экземпляр на открытый шаблон. Измените код в редакторе Visual Basic, сохраните изменения и закройте DOTM-файл. В загруженный экземпляр надстройки автоматически вносятся последние изменения, и он остается загруженным; перезапускать Word не требуется.

Примечание

Настройки пользовательского интерфейса, описываемые в этой статье, применимы только к Office 2010, но не к Office для Mac 2011. В приложении Word 2011 добавлять настраиваемые панели инструментов и меню в шаблон можно программным путем. Однако делать это можно и из самого приложения Word, не используя код. Для этого в меню Вид наведите указатель на пункт Панели инструментов и выберите пункт Настроить панели инструментов и меню.

Также имейте в виду, что на момент написания данной статьи для автоматической загрузки глобального шаблона при запуске приложения Word 2011 могло требоваться дополнительное действие. Если после выполнения приведенных выше инструкций шаблон не перезагружается, добавьте однострочный макрос в модуль глобального шаблона Normal.dotm, указывающий на то, какой макрос необходимо добавить. Код этого макроса имеет следующий вид (в коде укажите путь и имя файла соответствующего глобального шаблона):

Sub AutoExec()AddIns.Add fileName:="[Complete Path and File Name]", Install:=TrueEnd Sub

Создание настраиваемого пользовательского интерфейса для надстройки

Возможно, вы уже используете служебную программу для настройки ленты в документе или шаблоне, однако добавление разметки вручную позволяет делать это так же легко и быстро. Так же как и в случае с разметкой Office Open XML, для написания разметки можно использовать "Блокнот" в Windows или любой другой текстовый редактор. Однако в этом случае может оказаться полезным использование продукта Visual Studio, поскольку он позволяет обращаться к схеме настройки ленты, предоставляя доступ к возможностям технологии IntelliSense.

Примечание

При выполнении указанных ниже действий предполагается, что необходимо открыть пакет документов и вручную добавить в файл элемент customUI. Если ранее вам не приходилось делать этого, это хороший повод ознакомиться со структурой Office Open XML документа. Если у вас имеется опыт изменения пакета документов Office Open XML и вы используете Visual Studio 2010, вы можете воспользоваться средством Open XML Package Editor Power Tool, чтобы открыть документ или шаблон непосредственно в Visual Studio. Это поможет уменьшить число необходимых действий, поскольку это средство позволяет добавлять папки непосредственно в пакет, упрощает добавление отношений и автоматически управляет типами контента при добавлении фрагмента или файла. Получите дополнительные сведения и загрузите средство Open XML Package Editor Power Tool для Visual Studio 2010 (возможно, на английском языке)

Для построения структуры элемента customUI также можно использовать дополнительные средства, например бесплатное средство Custom UI Editor, которое автоматически добавляет необходимые фрагменты и предоставляет образцы разметки customUI.xml.

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

Порядок добавления разметки customUI в документ или шаблон Office 2010

  1. Создайте папку с именем customUI. Эту папку можно создать в любом легкодоступном месте, например на рабочем столе Windows.

  2. Добавьте в созданную папку файл с именем customUI.xml, после чего добавьте в этот файл разметку для настройки ленты. Ниже приведен код разметки для предыдущего примера надстройки Word.

    <?xml version="1.0" encoding="utf-8"?>
    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
      <ribbon>
        <tabs>
          <tab id="customTab" label="Company Help" >
            <group id="CustomHelp" label="Get Help" >
              <button id="WebGuide" visible="true" size="large" 
                      label="Interactive Word 2010 Guide" keytip="W" 
                      screentip="Get help for finding commands on the ribbon." 
                      onAction="CommandRef" imageMso="FindDialog"/>
              <button id="ProdGuide" visible="true" size="large" 
                      label="Word 2010 Product Guide" keytip="P" 
                      screentip="Learn what's new in Word 2010 and how to find it." 
                      onAction="ProductGuide" imageMso="AdpPrimaryKey"/>
              <button id="BrandGuide" visible="true" size="large" 
                      label="Company Brand Guidelines" keytip="B" 
                      screentip="Get help for using company branding." 
                      onAction="BrandOverview" image="brand"/>
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>
    
  3. Добавьте папку customUI в пакет документа или шаблона.

    Для этого можно изменить расширение файла на ZIP, после чего открыть ZIP-пакет, чтобы перетащить в него новую папку. Также можно воспользоваться служебной программой, позволяющей открывать пакеты, не изменяя расширение файла, например 7-Zip.

    Предупреждение

    Если для открытия пакета было изменено расширение файла, не забудьте изменить его обратно после завершения работы с пакетом.

  4. Добавьте определение отношения для файла customUI в файл отношений верхнего уровня (RELS) в ZIP-пакете.

    1. В папке _rels откройте файл с расширением RELS.

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

      <Relationship Id="rID4" Type="https://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/>
      

      Примечание

      В данном конкретном случае необходимо выполнить действия 5–7, поскольку для кнопки "Company Brand Guidelines" (Рекомендации по фирменной символике компании), показанной на рис. 1, используется настраиваемое изображение. Если в разметке используются только встроенные изображения, дополнительных действий не требуется. Список всех доступных встроенных изображений Office 2010, которые можно использовать в разметке customUI, см. в разделе "Дополнительные ресурсы" в конце статьи.

  5. В папке customUI создайте две вложенные папки. Одна из них должна иметь имя _rels, а вторая, если используется разметка из этого примера, — имя images.

  6. Поместите файл изображения для настраиваемого элемента управления (в данном примере это третья кнопка) в папку images и создайте файл с именем customUI.xml.rels, поместив его в папку _rels. Для файла RELS используйте следующую разметку.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="https://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="brand" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="images/brandicon.png"/></Relationships>
    
  7. Откройте файл [Content_Types].xml в верхнем уровне ZIP-пакета. Добавьте определение для расширения файла PNG (формат файла настраиваемого изображения), если оно отсутствует. Используйте следующую разметку.

    <Default Extension="png" ContentType="image/png"/>
    

Рис 1. Результат разметки customUI

Результаты разметки customUI

Далее в этой статье приведены примеры дополнительных задач, выполняемых с помощью разметки customUI, включая следующие:

  • использование элемента управления "Разворачивающаяся кнопка";

  • добавление настраиваемых элементов на встроенную вкладку ленты;

  • настройка положения элементов управления на вкладке или вкладок на ленте;

  • использование VBA с разметкой customUI для управления видимостью элементов управления.

Создание надстройки PowerPoint

Чтобы создать надстройку PowerPoint, сначала необходимо создать файл презентации PowerPoint с поддержкой макросов (PPTM). В приложении PowerPoint для надстроек используется уникальный формат файлов (PPAM), доступный только для чтения. Поэтому код пишется и изменяется в PPTM-файле, копия которого сохраняется как PPAM-файл надстройки.

Порядок создания надстройки PowerPoint

  1. Открыв новый PPTM-файл, запустите редактор Visual Basic.

    Примечание

    Если редактор Visual Basic используется для нескольких приложений одновременно, нажимайте клавиши ALT+F11 для переключения между редактором Visual Basic и соответствующим приложением.

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

    1. Замените объект коллекции Documents и объект ActiveDocument на объекты Presentations и ActivePresentation соответственно.

    2. Замените ссылки на содержимое и файлы Word 2010 ссылками на соответствующее содержимое PowerPoint 2010.

      Руководство по продукту PowerPoint и руководство по интерактивному меню на ленте также доступны для загрузки по приведенным выше ссылкам. Так же как и в случае с надстройкой Word, сохраните файлы образцов для PowerPoint в соответствии с путем и именами файлов, указанными в макросе. Поскольку некоторые из этих файлов отличаются от файлов надстройки Word, потребуется изменить имена соответствующих файлов в макросах.

  3. Сохраните и закройте PPTM-файл.

  4. Добавьте папку customUI и необходимое содержимое в PPTM-файл.

    Можно использовать инструкции и разметку, приведенные в предыдущем разделе, внеся необходимые изменения в разметку (например, текст меток и всплывающей подсказки) для выбранного содержимого PowerPoint. Однако необходимо выполнить инструкции по изменению файлов RELS и [Content_Types].xml, содержащихся в файле PowerPoint, а не заменять их.

  5. Откройте PPTM-файл в приложении PowerPoint. Убедившись в том, что настраиваемая вкладка на ленте выглядит и работает правильно, сохраните копию файла в формате Надстройка PowerPoint (*.ppam). Приложение PowerPoint автоматически сохраняет надстройку в папке Надстройки Майкрософт.

    В Windows 7 папка надстроек Майкрософт по умолчанию расположена по следующему пути: C:\Users\имя_пользователя\AppData\Roaming\Microsoft\AddIns.

Примечание

В приложении PowerPoint для Mac 2011 добавить панель инструментов или меню в надстройку можно программным путем. Пример можно найти в загружаемом пакете для этой статьи.

Порядок загрузки надстройки PowerPoint

  1. В приложении PowerPoint на вкладке Разработчик нажмите кнопку Надстройки.

  2. Щелкните Добавить.

  3. Выберите сохраненный файл и нажмите кнопку Открыть.

  4. Если появится сообщение системы безопасности, щелкните Включить макросы.

По умолчанию загруженные файлы надстроек PowerPoint не появляются в области Окно проекта редактора Visual Basic. Чтобы просматривать и открывать загруженные проекты PPAM, необходимо добавить параметр в реестр Windows. В разделе HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\PowerPoint\Options добавьте параметр типа DWORD с именем DebugAddins и значением 1. После этого перезапустите приложение PowerPoint. Обратите внимание на то, что можно просматривать, экспортировать и копировать содержимое из загруженного проекта PPAM. Также можно вносить изменения, чтобы проверять их работу в загруженной надстройке, что делает очень удобным устранение неполадок и тестирование новых возможностей при разработке надстроек. Однако сохранять изменения непосредственно в файл загруженной надстройки нельзя.

Создание надстройки Excel

Из трех приложений, рассматриваемых в этой статье, создавать надстройки для приложения Excel, пожалуй, проще всего, поскольку можно сохранить файл в формате надстройки Excel (XLAM), загрузить сохраненный файл надстройки и затем писать и изменять код непосредственно в загруженном файле надстройки.

Порядок создания и загрузки надстройки Excel

  1. Создайте файл Excel и сохраните его в формате Надстройка Excel (*.xlam). Приложение Excel автоматически сохраняет файл в папке надстроек Майкрософт.

  2. На вкладке Разработчик нажмите кнопку Надстройки. Сохраненная надстройка должна отобразиться в списке. В этом случае выберите ее (надстройка будет загружена) и закройте диалоговое окно. Если надстройка отсутствует в списке, нажмите кнопку Обзор, чтобы найти и загрузить файл надстройки.

  3. Откройте редактор Visual Basic. Затем создайте проект и добавьте содержимое в соответствии с инструкциями в предыдущих разделах, посвященных надстройкам Word и PowerPoint.

    Если копируется код VBA из раздела, посвященного надстройке Word, измените ссылки на объект коллекции Documents и объект ActiveDocument на ссылки на объекты Workbooks и ActiveWorkbook соответственно. Также измените ссылки на файлы Word на ссылки на соответствующее содержимое Excel. Руководство по продукту Excel и руководство по интерактивному меню на ленте для этой надстройки можно загрузить по приведенным выше ссылкам.

  4. Выйдите из приложения Excel и перейдите к папке Надстройки Майкрософт, чтобы найти созданный файл надстройки.

  5. Добавьте разметку customUI в файл надстройки.

    Если используются разметка и код, приведенные выше для надстройки Word, внесите необходимые изменения в атрибуты (например, текст меток и всплывающих подсказок) для содержимого Excel. Чтобы настроить пользовательский интерфейс, необходимо выполнить приведенные выше инструкции по изменению файлов RELS и [Content_Types].xml, содержащихся в файле Excel.

При следующем открытии приложения Excel должна загрузиться надстройка и должны отобразиться настройки customUI.

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

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

  • Настройки ленты не отображаются.  Если при открытии файла с разметкой customUI (или при загрузке надстройки) настройки ленты не отображаются, скорее всего, причина кроется в синтаксической ошибке. Проверьте созданный файл customUI.xml и файл RELS, в который было добавлено отношение.

    • Учтите, что даже небольшая ошибка, например пропущенные кавычки или скобка либо неправильный регистр символа, может привести к неправильной работе части XML-документа.

    • Также проверьте определение отношения, добавленное в файл RELS, чтобы убедиться в том, что путь соответствует папке и имени файла, в котором была сохранена разметка customUI.

  • Процедура не выполняется.  Если при щелчке элемента управления надстройки на ленте процедура не выполняется, проверьте следующее.

    • Совпадает ли в разметке customUI имя процедуры, используемое в атрибуте OnAction для данного элемента управления, с именем процедуры в коде VBA?

    • Объявлена ли разметка customUI в процедуре, используемой в качестве значения атрибута OnAction, как элемент управления ленты в коде VBA?

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

    На вкладке Разработчик нажмите кнопку Безопасность макросов. Выберите вариант Отключить все макросы с уведомлением. Разрешать выполнение всех макросов, конечно же, не рекомендуется. Но если отключить все макросы без уведомления, загрузка надстроек может быть невозможна.

Возможности надстроек VBA

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

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

При изучении этих принципов помните, что большая часть приводимого кода VBA может применяться к приложениям Word, PowerPoint или Excel вне зависимости от того, какое приложение используется в конкретном примере.

Автоматизация задач создания документов

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

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

Надстройка в этом примере содержит одну пользовательскую форму и три модуля.

  • Пользовательская форма служит для сбора и хранения пользовательских данных и настроек.

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

  • Второй модуль предназначен для элементов управления ленты.

  • Третий модуль содержит код для создания настраиваемых документов.

Для этой задачи необходимо создать диалоговое окно (пользовательскую форму), в котором пользователь может вводить данные. Затем эти данные должны сохраняться в реестре Windows.

Примечание

Перед тем как перейти к следующей процедуре, необходимо создать проект VBA. Также обратите внимание на то, что в Office для Mac 2011 можно использовать код, аналогичный тому, который используется для сохранения данных в реестре Windows и извлечения данных из него. В Mac OS эти методы работают сходным образом и сохраняют данные в PLIST-файле в папке пользовательских настроек библиотеки.

Порядок сбора и сохранения пользовательских данных

  1. В редакторе Visual Basic создайте пользовательскую форму и поместите на нее необходимые элементы управления. Для этого в меню Insert (Вставка) выберите пункт UserForm (Пользовательская форма). Если панель инструментов (содержащая доступные элементы управления пользовательской формы) не появляется автоматически, в меню View (Вид) выберите пункт Toolbox (Панель инструментов).

    1. Щелкните необходимый элемент управления (например, метку или текстовое поле) и перетащите его на пользовательскую форму, чтобы создать элемент управления требуемого размера.

      (Инструменты выравнивания и изменения интервалов доступны в меню Format (Формат).)

    2. Используйте окно Properties (Свойства) для задания имени элемента управления и настройки различных свойств, например добавления заголовка или сочетания клавиш, изменения высоты и ширины или задания положения относительно левого верхнего угла формы. В этом окне можно настроить различные аспекты внешнего вида и поведения элемента управления.

    На рис. 2 показан готовый объект пользовательской формы для данного примера. Обратите внимание на некоторые детали, повышающие удобство взаимодействия пользователя с пользовательской формой. Например, для пользователей, предпочитающих работать с клавиатурой, настроены сочетания клавиш, элементы управления упорядочены по размеру и выровнены, а для их группировки используются рамки.

    Помимо этих видимых особенностей, настроена последовательность табуляции для удобства использования клавиатуры. Чтобы задать последовательность табуляции для элементов управления на пользовательской форме, щелкните форму правой кнопкой мыши и выберите пункт Tab Order (Последовательность табуляции). Затем щелкните правой кнопкой мыши каждую рамку и выберите пункт Tab Order, чтобы изменить последовательность табуляции для элементов управления внутри этой рамки.

    Рис. 2. Готовая пользовательской форма

    UserForm после завершения написания кода

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

    Option Explicit
    Public oName As String, oTitle As String, oAdd1 As String, oAdd2 As String, _
    oPh1 As String, oPh2 As String, oPDat1 As String, oPDat2 As String, i As Integer, _
    oPaper As String, oPhone(2) As String, oDoc As Word.Document
    
    Sub DocVarbs()
    'GetSetting and SaveSetting use VB and VBA Program Settings in the Registry: _
    HKEY_CURRENT_USER\Software\VB and VBA Program Settings
    oName = GetSetting("CustomDocs", "Info", "Name")
    oTitle = GetSetting("CustomDocs", "Info", "Title")
    oAdd1 = GetSetting("CustomDocs", "Info", "Add1")
    oAdd2 = GetSetting("CustomDocs", "Info", "Add2")
    oPh1 = GetSetting("CustomDocs", "Info", "PLabel1")
    oPh2 = GetSetting("CustomDocs", "Info", "PLabel2")
    oPDat1 = GetSetting("CustomDocs", "Info", "PData1")
    oPDat2 = GetSetting("CustomDocs", "Info", "PData2")
    oPaper = GetSetting("CustomDocs", "Info", "Paper")
    
    'populates the combo boxes in the dialog box
    oPhone(0) = "Phone"
    oPhone(1) = "Fax"
    oPhone(2) = "Email"
    
    'sets default values for the first use of the info dialog box
    'or in the case that a user generates a document with the tools
    'before saving information.
    If oName = "" Then
        oName = Application.UserName
        oChk = True
    End If
    If oPh1 = "" Then oPh1 = "Phone"
    If oPh2 = "" Then oPh2 = "Email"
    If oPaper = "" Then oPaper = "L"
    End Sub
    
  3. Добавьте код для пользовательской формы.

    Процедура Initialize заполняет форму, используя ранее сохраненные данные или значения по умолчанию, определенные для переменных при выполнении предыдущего шага. Процедура cmdSave сохраняет введенные пользователем данные в реестре.

    Option Explicit
    
    Private Sub cmdCancel_Click()
    Unload Me
    End Sub
    
    Private Sub cmdSave_Click()
    Dim myP As String
    With Me
        SaveSetting "CustomDocs", "Info", "Name", .txtName.Value
        SaveSetting "CustomDocs", "Info", "Title", .txtTitle.Value
        SaveSetting "CustomDocs", "Info", "Add1", .txtAdd1.Value
        SaveSetting "CustomDocs", "Info", "Add2", .txtAdd2.Value
        SaveSetting "CustomDocs", "Info", "PLabel1", .cmbPh1.Value
        SaveSetting "CustomDocs", "Info", "PLabel2", .cmbPh2.Value
        SaveSetting "CustomDocs", "Info", "PData1", .txtPDat1.Value
        SaveSetting "CustomDocs", "Info", "PData2", .txtPDat2.Value
        If .optA.Value = True Then
            myP = "A"
        Else
            myP = "L"
        End If
        SaveSetting "CustomDocs", "Info", "Paper", myP
    End With
    Unload Me
    End Sub
    
    Private Sub UserForm_Initialize()
    Call modVarbs.DocVarbs
    With Me
        .txtName.Value = oName
        .txtTitle.Value = oTitle
        .txtAdd1.Value = oAdd1
        .txtAdd2.Value = oAdd2
        .txtPDat1.Value = oPDat1
        .txtPDat2.Value = oPDat2
        .cmbPh1.List() = oPhone
        .cmbPh2.List() = oPhone
        .cmbPh1.Value = oPh1
        .cmbPh2.Value = oPh2
        If oPaper = "L" Then
            .optL.Value = True
        Else
            .optA.Value = True
        End If
    End With
    End Sub
    
  4. Создайте модуль для элементов управления на ленте. Добавьте в этот модуль процедуру для отображения пользовательской формы и объявите эту процедуру как элемент управления ленты.

    Sub UserInfo(ByVal control As IRibbonControl)
    frmInfo.Show
    End Sub
    

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

Порядок создания настраиваемого документа

  • Для выполнения этой задачи сначала необходимо создать шаблон документа, например письмо с фирменной символикой компании, как в данном примере. Код в этом примере создает документ на основе шаблона. Затем он настраивает документ в соответствии с пользовательскими настройками и заполняет элементы управления в основном тексте и нижнем колонтитуле документа, используя сохраненные пользовательские данные.

  • На рис. 3 обратите внимание на то, что данный шаблон документа формата Letter содержит две фоновых фигуры (серая градиентная подложка и красная вертикальная полоса), которые потребуется настроить программным путем, если в качестве размера бумаги используется формат A4. Этим фигурам были присвоены имена для удобства их распознавания в коде с помощью области Выделение в Word 2010. Чтобы открыть область Выделение, на вкладке Главная в группе Редактирование щелкните элемент Выделить.

  • На рис. 3 имя и заголовок в основном тексте документа, а также адрес, телефон и адрес электронной почты в колонтитуле (вместе с соответствующими надписями) помещаются в элементах управления содержимым. Вставить элементы управления содержимым можно на вкладке Разработчик в группе Элементы управления. В этой же группе можно нажать кнопку Режим конструктора, чтобы изменить замещающий текст. Нажмите кнопку Свойства, чтобы настроить параметры элемента управления, например, добавить теги, с помощью которых элемент управления будет идентифицироваться в коде.

    Примечание

    В Word для Mac 2011 нельзя создавать элементы управления содержимым и взаимодействовать с ними программным образом. Вместо этого рекомендуется использовать ячейки таблицы или закладки в качестве опорных точек для заполнения содержимого документа, как описывается в этом разделе.

    Чтобы добавить скрытую от пользователей закладку, в начале ее имени поставьте знак подчеркивания. Сделать это можно только программным путем. Для этого щелкните в том месте документа, в которое необходимо добавить закладку, после чего в редакторе Visual Basic воспользуйтесь окном интерпретации, чтобы добавить закладку. Ниже показан пример кода для добавления закладки в позиции курсора.

    Selection.Range.Bookmarks.Add("_name")

    Рис. 3. Шаблон, используемый кодом для создания документа

    Шаблон, используемый кодом для создания документа

  • Ниже приведен код для создания и настройки документа. Этот код может быть полезно поместить в отдельный модуль, поскольку реальная версии подобной надстройки, скорее всего, будет использоваться для создания нескольких типов документов. Когда код будет готов, добавьте в ранее созданный модуль ленты процедуру, с помощью которой можно объявить элемент управления ленты для вызова данного макроса.

    Sub NewLetter()
    On Error GoTo ErrorHandler
    Dim cc As ContentControl
    'If the user has not yet saved their information, prompt with that option.
    If GetSetting("CustomDocs", "Info", "Name") = "" Then
    i = MsgBox("Would you like to save your document details now, so that they " _
    & "can be added to your documents automatically?", vbQuestion + vbYesNoCancel, _
    "Custom Document Tools")
        If i = vbYes Then
        frmInfo.Show
        ElseIf i = vbCancel Then
        Exit Sub
        End If
    End If
    
    Call modVarbs.DocVarbs
    'set the defined Word.Document variable to the new document when it's created.
    'avoids errors related to multiple concurrent open documents.
    Set oDoc = Documents.Add(oPath & "\CompanyTools\CustomDocs\CompanyLetter.dotx")
    
    'if the saved paper size preference is A4, this changes the paper size and
    'then corrects the size and position of the background graphics in the header.
    If oPaper = "A" Then
    oDoc.PageSetup.PaperSize = wdPaperA4
        With oDoc.Sections(1).Headers(wdHeaderFooterFirstPage).Range
                With .ShapeRange("Backing")
                    .Width = 541.75
                    .Height = 841.95
                End With
                With .ShapeRange("Edge")
                    .Width = 53.2
                    .Height = 841.95
                    .Left = 542.5
                End With
        End With
    End If
    
    'populate the saved information in the controls provided in the template.
    For Each cc In oDoc.Range.ContentControls
        Select Case cc.Tag
            Case "Name"
            cc.Range.Text = oName
            Case "Title"
            cc.Range.Text = oTitle
        End Select
    Next cc
    
    For Each cc In oDoc.Sections(1).Footers(wdHeaderFooterFirstPage) _
    .Range.ContentControls
        Select Case cc.Tag
            Case "Address Line 1"
            cc.Range.Text = oAdd1
            Case "Address Line 2"
            cc.Range.Text = oAdd2
            Case "Label1"
            cc.Range.Text = oPh1
            Case "Label2"
            cc.Range.Text = oPh2
            Case "Phone1"
            cc.Range.Text = oPDat1
            Case "Phone2"
            cc.Range.Text = oPDat2
        End Select
    Next cc
    Exit Sub
    
    ErrorHandler:
    Select Case Err.Number
        Case 5174
        MsgBox "The document template is unavailable." & _
        " Please contact your local IT staff for assistance." _
        , vbInformation, "Custom Document Tools"
        Case Else
        MsgBox "The task ended in error. The template may be damaged. Note " & _
        " that your saved info may not have been added to the new document.", _
        vbInformation, "Custom Document Tools"
    End Select
    End Sub
    
  • В этом примере использовались свободные элементы управления содержимым для пользовательских данных. В зависимости от требований, например, если одни и те же пользовательские данные должны отображаться в документе в нескольких местах или если данные отображаются в стандартном блоке титульной странице, который может быть заменен на другой стандартный блок, предпочтительнее могут быть связанные элементы управления.

Создание пользовательского интерфейса для надстройки

В пользовательском интерфейсе надстройки в данном примере используется элемент управления "Разворачивающаяся кнопка", который помещается на вкладке "Главная" после группы "Абзац", как показано на рис. 4. Чтобы создать этот настраиваемый элемент ленты, выполните шаги 1–4 в приведенном выше примере использования customUI. В шаге 2 используйте следующую разметку.

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab idMso="TabHome" >
        <group id="CustomDocs" label="Company Docs" 
               insertAfterMso="GroupParagraph" >
          <splitButton id="CompanyDocs" size="large" >
            <menu id="coDocs" >
              <button id="NewLetter" visible="true" label="New Letter" 
                      onAction="Letter" imageMso="NewPageShort"/>
              <button id="UserInfo" visible="true" label="Save Info" 
                      onAction="UserInfo" imageMso="ContactAddMyContacts"/>
            </menu>
          </splitButton>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Рис. 4. Настраиваемый элемент надстройки на вкладке "Главная"

Настройка надстроек на вкладке "Главная"

В этом примере сохраненные данные используются для заполнения элементов управления содержимым. Однако с помощью аналогичных действий можно заполнять другие объекты в документе Word, презентации PowerPoint или книге Excel. Например, можно заполнять содержимым ячейку таблицы или закладку в документе Word, текстовое поле в PowerPoint или ячейку листа в Excel.

Примечание

Многие события приложений, рассматриваемые в следующем разделе, не поддерживаются в Office для Mac 2011. В PowerPoint 2011 события приложения не поддерживаются, а в Word 2011 их поддержка ограничена. Однако в Excel для Mac 2011 можно использовать те же действия для настройки модуля проекта VBA и модуля класса, а также просматривать доступные события приложения. Начальные сведения об использовании событий приложения в Word или Excel см. в примечании после описания процедуры в следующем разделе. Также обратите внимание на то, что в Word 2011 поддерживаются события уровня документа, а в PowerPoint 2011 поддерживается ряд макросов, связанных с показом слайдов.

Взаимодействие с событиями приложения

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

События уровня документа чаще используются в коде VBA, предназначенном для работы с отдельным документом или шаблоном. Также в надстройку можно включать код для взаимодействия со встроенными функциями документа или шаблона. Однако события уровня приложения зачастую более удобны для использования в надстройках, поскольку их можно встраивать непосредственно в надстройки Word, PowerPoint или Excel, чтобы обеспечивать реакцию на действия пользователя.

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

Примечание

Выбор этого примера для статьи обусловлен тем, что он позволяет устранить распространенную причину недовольства пользователей, которое особенно часто возникает в компаниях, выполняющих миграцию с версии Microsoft Office, использующей устаревшие форматы файлов (Office 2003 или более ранняя версия), на Office 2010 (или Office 2007). Когда пользователи копируют слайды из презентаций, созданных в более ранней версии приложения, они часто используют команду "Сохранить исходное форматирование", чтобы добиться единообразного оформления слайдов в презентации. Однако на самом деле при каждом использовании этой команды добавляется еще один образец и набор макетов. В результате получаются презентации с непомерно большим числом образцов, несогласованным форматированием и чрезмерным размером файлов, которые пользователи и специалисты службы поддержки могут расценивать как поврежденные. Средство, аналогичное приведенному в примере кода, может помочь пользователям избежать чрезмерного усложнения презентаций, затрудняющего управление ими, информируя их о последствиях определенных действий.

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

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

  1. На вкладке Insert (Вставка) щелкните Class Module (Модуль класса), чтобы создать модуль класса. В окне Properties (Свойства) присвойте модулю класса интуитивно понятное имя, например EventClassModule.

  2. Добавьте код в существующий модуль проекта, чтобы создать экземпляр нового модуля класса. Для этого требуется всего одно объявление (обратите внимание на использование имени модуля класса в операторе Dim в начале модуля) и две небольших процедуры.

    Dim XMST As New EventClassModule
    Sub Auto_Open()
    Call InitializeMSTApp
    End Sub
    
    Sub InitializeMSTApp()
    Set XMST.app = Application
    End Sub
    
  3. Создайте пользовательскую форму, которая будет предлагать пользователю удалить образцы из презентации. В этом примере пользовательская форма используется вместо простого окна сообщения, чтобы предоставить пользователю возможность выбора.

    Для создания пользовательской формы используйте советы, приведенные в предыдущем разделе. Готовая пользовательская форма содержит одну метку, две кнопки и один флажок, как показано на рис. 5.

    Рис. 5. Готовая пользовательская форма для события приложения

    Завершенная форма UserForm для события приложения

  4. Базовый код пользовательской формы в данном случае разрешает дальнейшее выполнение кода события (cmdYes) или выгружает форму, завершая выполнение (cmdNo). При этом есть возможность добавить в файл свойство документа, благодаря которому пользователю больше не будет выводиться запрос при работе с этим же файлом (chkDontFix). Кроме того, процедура Terminate передает коду события значение, указывающее на то, что выполнение этого кода должно быть прервано, если пользователь нажимает в заголовке окна кнопку X, чтобы закрыть окно.

    Private Sub cmdNo_Click()
    If Me.chkDontFix.Value = True Then
        With ActivePresentation
            .CustomDocumentProperties.Add Name:="DontFix", _
            LinkToContent:=False, Type:=msoPropertyTypeBoolean, Value:=True
            .Saved = msoFalse
        End With
    End If
    Unload Me
    End Sub
    
    Private Sub cmdYes_Click()
    Me.Hide
    End Sub
    
    Private Sub userform_Terminate()
    oCncl = True
    End Sub
    
  5. Чтобы добавить код для события, в начале модуля класса объявите переменную приложения, которая будет использоваться в событиях. Затем добавьте процедуру. В данном случае используется событие PresentationClose.

    Обратите внимание на то, что в следующем коде используются две переменные: oCncl типа Boolean и i типа Integer. Чтобы объявить эти переменные как общие, сделав их доступными в пределах всего проекта, объявите их в начале любого обычного модуля.

    Public WithEvents app As Application
    Private Sub app_PresentationClose(ByVal Pres As Presentation)
    Dim oProp As DocumentProperty
    oCncl = False
    i = 0
    'checks if the active presentation is a branded company
    'presentation. In this case, a document property is included
    'in the template for company presentations for ease of
    'identification.
    With ActivePresentation
        For Each oProp In .CustomDocumentProperties
            If oProp.Name = "CompanyPres" Then i = i + 1
        Next oProp
        If i = 0 Then Exit Sub
    'checks for the DontFix property added when the user
    'selects the check box in the user form.
        For Each oProp In .CustomDocumentProperties
            If oProp.Name = "DontFix" Then Exit Sub
        Next oProp
    'checks the presentation for the number of masters.
    'If only one master exists, there is no need to continue.
        If .Designs.Count = 1 Then Exit Sub
    End With
    'initiates the UserForm.
    With frmMasters
        .chkDontFix.Value = False
        .cmdYes.SetFocus
        .Show
    End With
    
    If oCncl = True Then
        Exit Sub
    End If
    
    Dim oDes As Design, oSd As slide
    'attaches all slides to the first master.
    With ActivePresentation
        For Each oSd In .Slides
            oSd.Design = .Designs(1)
        Next oSd
    'deletes all masters other than the first.
        Do Until .Designs.Count = 1
            For Each oDes In .Designs
                If Not oDes.Index = 1 Then oDes.Delete
            Next oDes
        Loop
    End With
    End Sub
    

После сохранения этого файла как надстройки и загрузки его в PowerPoint, потребуется презентация, содержащая переменную CompanyPres и несколько образцов для тестирования надстройки. Используйте образец документа, включенный в загружаемый пакет для данной статьи. Также можно использовать шаблон для создания собственных тестовых презентаций.

Примечание

Приведенные выше шаги 1 и 2 можно также использовать, чтобы создать модуль класса для события приложения в приложении Word или Excel. Код в шаге 2 одинаков для любого приложения, а чтобы объявить переменную для работы с событиями приложения, можно добавить аналогичный оператор Public WithEvents app As Application в начало модуля класса в редакторе Visual Basic для приложения Word или Excel. После этого выберите пункт "app" в списке объектов (раскрывающийся список слева над окном кода), и в списке процедур (раскрывающийся список справа над окном кода) отобразятся доступные события.

Программное управление пользовательским интерфейсом надстройки

При создании настраиваемого пользовательского интерфейса для надстройки иногда требуются дополнительные возможности по управлению его внешним видом, которые не может обеспечить разметка Office Open XML. Например, текст метки для элемента управления может изменяться в зависимости от определенных условий, или видимость элементов управления может меняться в соответствии с пользовательскими настройками. К счастью, схема customUI включает набор атрибутов, обеспечивающих подобную гибкость.

В следующем сценарии в компании используется набор настраиваемых инструментов, размещаемых на ленте приложения Excel. Соответствующая вкладка требуется лишь некоторым пользователям. При запуске приложения Excel надстройка запрашивает пользователя, требуется ли отображать настраиваемую вкладку. Если пользователь указывает, что вкладку следует скрыть, надстройка добавляет элемент управления в конце вкладки Главная, с помощью которой пользователь может снова включить настраиваемую вкладку.

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

В следующей процедуре предполагается, что уже имеется разметка customUI.xml для настраиваемой вкладки на ленте и для кнопки сброса, которая будет отображаться для пользователей, изначально отключивших вкладку.

Порядок программного управления поведением настраиваемого элемента ленты

  1. Создайте пользовательскую форму, которая будет предлагать пользователю выбрать настройку при запуске приложения Excel.

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

    Рис. 6. Готовая пользовательская форма для события Workbook_Open

    Завершенная форма UserForm для события Workbook_Open

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

    Private Sub cmdNever_Click()
    oVis = "Never"
    Me.Hide
    End Sub
    
    Private Sub cmdNo_Click()
    oVis = "No"
    Me.Hide
    End Sub
    
    Private Sub cmdYes_Click()
    oVis = "Show"
    Me.Hide
    End Sub
    
  3. В объект ThisWorkbook проекта добавьте событие Workbook_Open. Приведенный ниже код служит для вывода диалогового окна в случае, если пользователь не указал, что запрос выводиться не должен. После этого он сохраняет выбранную пользователем настройку ("Да", "Нет" или "Больше не показывать") в реестре.

    Private Sub Workbook_Open()
    Dim iResp As Integer
    oVis = GetSetting("CustomDocs", "Info", "ExcelVis")
    If Not oVis = "Never" Then
        frmTools.Show
        SaveSetting "CustomDocs", "Info", "ExcelVis", oVis
    End If
    End Sub
    

    Обратите внимание на то, насколько полезен объект ThisWorkbook в Excel для надстроек, так как он позволяет использовать события уровня документа на уровне приложения. Поскольку объект ThisWorkbook ссылается на файл надстройки, событие Workbook_Open, используемое в следующем образце кода, выполняется при запуске приложения и автоматической загрузке (открытии) файла надстройки.

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

    В этом примере одна процедура предназначена для скрытия или отображения окна в соответствии в настройками, переданными в файл customUI. Вторая процедура используется для элемента управления, который отображается, если пользователь отключил вывод запроса, и позволяет снова включить его.

    Обратите внимание на то, что процедура ShowControls ссылается на идентификаторы элементов управления из файла customUI.xml. Первый идентификатор в данном случае — это идентификатор, назначенный настраиваемой вкладке, а второй — это идентификатор, назначенный дополнительной кнопке сброса, добавляемой на вкладку "Главная".

    Public Sub ShowControls(ByVal control As IRibbonControl, ByRef visible As Variant)
    Select Case control.ID
        Case "TabCompany"
            If Not oVis = "Show" Then
                visible = False
            Else
                visible = True
            End If
        Case "CustomTools"
            If oVis = "Never" Then
                visible = True
            Else
                visible = False
            End If
    End Select
    End Sub
    
    Sub Reset(ByVal control As IRibbonControl)
    SaveSetting "CustomDocs", "Info", "ExcelVis", ""
    MsgBox "You will be prompted to show " & _
    "company tools the next time you start Excel.", _
    vbInformation, "Company Custom Tools"
    End Sub
    
  5. В файле customUI.xml добавьте атрибут GetVisible к тегу настраиваемой вкладки и к тегу группы, в которой будет отображаться кнопка сброса. В качестве значения в обоих случаях используйте имя процедуры ShowControls.

    Ниже сначала приведена разметка для двух измененных строк. Затем эти строки показаны в контексте.

    <tab id="TabCompany" label="Company Tools" insertBeforeMso="TabHome" getVisible="ShowControls">
    <group id="CustomTools" label="Company Options" getVisible="ShowControls">
    

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

    <?xml version="1.0" encoding="utf-8"?>
    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
     <ribbon>
     <tabs>
      <tab id="TabCompany" label="Company Tools" insertBeforeMso="TabHome"
           getVisible="ShowControls">
        <group id="coTools" label="Sample Tools" 
               supertip="Arbitrarily selected tools to demo GetVisible behavior.">
         <button idMso="FileNewDefault" size="large" />
         <button idMso="FileSave" size="large"/>
         <separator id="space2" />
         <button idMso="Paste" size="large"/>
         <gallery idMso="PasteGallery" size="large" />
        </group>
      </tab>
      <tab idMso="TabHome" >
         <group id="CustomTools" label="Company Options" 
                getVisible="ShowControls">
           <button id="coRestore" size="large" label="Reset" 
                   onAction="Reset" imageMso="GroupJournalArrangement" />
         </group>
      </tab>
     </tabs>
     </ribbon>
    </customUI>
    

Управление кодом VBA

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

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

Чтобы настроить самозаверяющий сертификат, воспользуйтесь диалоговым окном Средство создания цифровых сертификатов для проектов VBA (меню Пуск, Все программы, Microsoft Office, Средства Microsoft Office).

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

Дальнейшие действия

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

Многие разработчики твердо уверены, что работа над проектом должна начинаться в окне кода. Однако следует помнить, что приложения, работу с которыми вы автоматизируете, — будь то с помощью управляемого кода или с помощью VBA — сами по себе обладают достаточно широкими и гибкими возможностями. Простое решение для автоматизации, скорее всего, можно реализовать простым способом без написания кода (или того, что мы обычно имеем в виду под написанием кода). Например, связанные элементы управления содержимым и коды полей в Word обеспечивают динамическое поведение, так же как и функции в Excel. Вне зависимости от того, является ли использование VBA или функций, доступных в окнах приложений, целесообразным в рамках проекта, необходимо рассмотреть возможные варианты, оценить требования и выбрать оптимальные средства для решения данной конкретной задачи.

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

Дополнительные ресурсы

Об авторе

Стефани Кригер (Stephanie Krieger) — автор двух книг: "Advanced Microsoft Office Documents 2007 Edition Inside Out" ("Современные документы Microsoft Office 2007: полное руководство") и "Microsoft Office Document Designer" ("Создание документов Microsoft Office"). Как профессиональный консультант по работе с документами она оказала помощь многим глобальным компаниям в разработке корпоративных решений для Microsoft Office на обеих платформах. Выход ее новой книги, посвященной возможностям Office 2010 и Office для Mac 2011, намечен на весну 2011 г.