Это старая версия документа.


Создание макроса и работа с ним

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

В Microsoft Word 2007 это осуществляется следующей последовательностью действий:

  • нажать кнопку Office в верхнем левом углу, нажать кнопку "Параметры Word";
  • выбрать закладку "Центр управления безопасностью", нажать кнопку "Параметры центра управления безопасностью";
  • выбрать закладку "Параметры макросов", в разделе "Параметры макросов для разработчика" установить опцию "Доверять доступ к объектной модели проектов VBA".

В Microsoft Word 2010:

  • выбрать пункт меню "Файл → Параметры…";
  • в окне "Параметры Word" выбрать закладку "Центр управления безопасностью", нажать кнопку "Параметры центра управления безопасностью";
  • выбрать закладку "Параметры макросов", в разделе "Параметры макросов для разработчика" установить опцию "Доверять доступ к объектной модели проектов VBA".
Примечание

VBA - Visual Basic for Applications (Visual Basic для приложений) - упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office.

Начало создания макроса

Макрос для отчетов формата Word

Для того, чтобы создать или просмотреть макрос для отчета формата Word необходимо:

  • открыть отчет в Мастере отчетов;
  • на ленте "Разработчик" в группе "Код" нажать кнопку "Visual Basic" (или сразу нажать Alt+F11). Откроется окно приложения "Microsoft Visual Basic for Application";
  • В окне "Project – TemplateProject" в дереве открыть узел "TemplateProject - Microsoft Word Objects – ThisDocument";
  • В правой части окна приложения, где приведен код, будет макрос "ПослеВыполненияОтчета".
Рисунок 1. Вид окна среды VBA при работе с макросом для отчетов формата Word

Если макроса там не будет, его можно создать самостоятельно, введя в данном окне строки начала и конца макроса, а между ними - сам текст макроса:

Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)

<Текст макроса>

End Sub

Внимание!

В Word 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо:

  • запустить MS Word;
  • нажать кнопку Office в верхнем левом углу, нажать кнопку "Параметры Word";
  • на закладке "Основные" в разделе "Основные параметры работы с Word" установить опцию "Показывать вкладку "Разработчик" на ленте"

Макрос для отчетов формата Excel

Для того, чтобы создать или просмотреть макрос для отчета формата Excel, необходимо:

  • открыть отчет в Мастере отчетов;
  • нажать кнопку "2. Редактировать шаблон";
  • в MS Excel на ленте "Разработчик" в группе "Код" нажать кнопку "Visual Basic" (или сразу нажать Alt+F11). Откроется окно приложения "Microsoft Visual Basic for Application";
  • В окне "Project – VBAProject" в дереве открыть узел "VBAProject - Modules – Module1";
  • В правой части окна приложения, где приведен код, необходимо перейти к макросу "ПослеВыполненияОтчета".
Рисунок 2. Вид окна среды VBA при работе с макросом для отчетов формата Excel
Внимание!

В Excel 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо:

  • запустить MS Excel;
  • нажать кнопку Office в верхнем левом углу, нажать кнопку "Параметры Excel";
  • на закладке "Основные" в разделе "Основные параметры работы с Excel" установить опцию "Показывать вкладку "Разработчик" на ленте"

Макрос "ПослеВыполненияОтчета"

Любой отчет изначально содержит следующий макрос:

Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)
 
ВыполненияОтчета" + CStr(ob.Название)
 
End Sub

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

Переменные, которые передаются в макрос:

  • "ob" − объект, от которого был вызван отчет;
  • "app" − приложение, от которого был вызван отчет, то есть Business Studio.
Внимание!

Просмотреть объектную модель Word для разработки макросов в редакторе Visual Basic можно по клавише F2.

Название привязки для макроса

При решении ряда задач средствами программирования бывает удобно оперировать данными привязок отчета. Для этого необходимо:

  1. Знать название привязки.
  2. Связать переменные в коде VBA с этим названием.

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

Тип привязки: Объект

В отчете такие привязки представлены полями.

Узнать название в шаблоне отчета: см. Вставка привязки в шаблон отчета, статья Пример определения названия привязки типа "Объект".

Использование названия привязки в коде:

ПеременнаяВКоде = Application.ActiveDocument.Variables.Item("Назв

Тип привязки: Список и Фильтр

В отчете такие привязки представлены таблицей.

Узнать название в шаблоне отчета: см. Вставка привязки в шаблон отчета, статья Пример определения названия привязки типа "Список".

Использование названия привязки в коде:

Set ТаблицДляОбработки = Application.ActiveDocument.Bookmarks("Название

Работа с таблицами

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

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

Работа с таблицей через название привязки

 'переменная для работы с конкретной таблицей
конкретной таблицей
Set Table = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1)
 
countColumn = Table.Columns.Count unt 'количество строк таблицыбцов таблицы
 
countRow = Table.Rows.Count йки во 2й строке 1го столбро

Работа с таблицей через её номер в документе

сountTables = ActiveDocument.Tables.Count количество таблиц в документе
 
ц в документе
 
Selection.GoTo What:=wdGoToTable, Which:=wdGoToFirst, Count:=5, Name:="" 
countColumn  = Selection.Tице номер 5
 
countColumn  = Selection.Tables(1).Columns.Count ion.Tables(1).Rows.Count 'колбцов таблицы
 
countRow = Selection.Tables(1).Rows.Count ge.Text 'значение ячейки врок таблицы
 
С

При работе с таблицами следует помнить ряд моментов:

  • Таблицы могут содержать объединенные ячейки. В случае перебора всех строк таблицы может возникнуть ошибка. Чтобы этого не было, необходимо использовать команду игнорирования ошибки:
On Error Resume Next ' игнорирование <error 5991> - ячейки таблицы имеют вертикальное объединение
  • При получении текста таблицы следует помнить, что полученное значение ячейки так же содержит в себе 2 служебных символа. Для обработки данных ячейки без этих служебных символов следует произвести «очистку» значения. Например:
СellText = Selection.Tables(1).Cell(3,2).Range.Text текст ячейки со служебными символами
 
ебными символами
 
СellText = Left$(СellText, (Len(CellText) - 2))  - чистый текст
 

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

Определение направления формирования отчета

Один и тот же отчет Business Studio может рассматриваться из разных мест:

  • одиночный документ Word или Excel или несколько документов,
  • HTML-публикация,
  • Business Studio Portal.

При рассмотрение такого отчета в разных местах есть свои нюансы. Например, отчеты в HTML-публикации и Business Studio Portal не содержат колонтитулов, которые есть в отчете, сделанным отдельным документом Word.

Также могут быть и разные задачи по обработке отчета кодом в зависимости от направления формирования отчета. Для определения направления формирования отчета используются параметры: BSInThread, BSHtml и BSPortal.

Направление формирования отчета BSInThread BSHtml BSPortal
Одиночный файл (Word, Excel) False False False
Пакетное формирование (Word, Excel) True False False
HTML-публикация True True False
Business Studio Portal True True True
Таблица 1. Значения специальных переменных в зависимости от направления формирования отчета

Пример использования в коде:

Dim HTMLCreate As Boolean
HTMLCreate = Application.ActiveDocument.Variables("BSHtml").Value 'True или False
se
 
If HTMLCreate Then
 
     MsgBox "Выводим для HTML: HTML-публикация или Business Studio Portal"Выводим в одиночный файл или потоком файлов"одиноч
Примечание

При формировании отчета типа HTML (HTML-публикация, Business Studio Portal) так же происходит формирование и отдельного файла типа Word.

Работа со ссылками в отчетах для HTML

При обработке кодом VBA отчета, сформированного для HTML-публикации или Business Studio Portal, следует помнить, что после формирования отчет представляет собой отображение не тех данных, что видны в браузере, а документ с показом кодов полей. Это не позволяет вести обработку гиперссылок.

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

ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды полей, а значения

Работа с копией отчета, содержащим макрос

При копировании отчета названия всех привязок изменяются.

Рисунок 3. Названия привязок в исходном отчете
Рисунок 4. Названия привязок в копии отчета

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

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

Пример проверки наличия привязки типа "Список". В документе это закладки.

Определяем название привязки типа "Список", которая представляет нужную таблицу. (см. Вставка привязки в шаблон отчета)

BookmarkName = "Изменения_процесса_e1ded8b0"сса_e1ded8b0" и
 
        'Проверкривязки
 
        я привязки
 
        Dim BookmarkIs As Booleaь названия привязки
 
        Dim BookmarkIs As Boolean переменная типа Закладка
 
        For Eachжной закладки нет
        Dim Bkm As Bookmark ументе
 
            IfBkm.па Закладка
 
        For Each Bkm InActiveDocument.Bookmarks        BookmarkIs = True 'отмечаем, чадки в документе
 
            IfBkm.Name = BookmarkName Then               Set SettableStatus = A с нашим именем
 
                BookmarkIs = True )
 
            End If
 
      кладка есть
                менте закладка есть
 
   'производим азванию привязки 
 

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

Пример проверки наличия привязки типа Объект

Определяем название привязки типа "Объект", которая представляет нужное поле в отчёте. (см. Вставка привязки в шаблон отчета)

VarName = "Статус_процесса_c9a10e8d"са_c9a10e8d" язки
 
      'Проверривязки
 
      ивязки в документе
        Dim VarIs As Boolean 'й привязки в документе
        Dim VarIs As Boolean кумента
        For Each aVar In Aо привязки нет
 
        If aVar.Name = VarName Then 'если сременные документа
        For Each aVar In ActiveDocument.Variables
 
            If aVar.Name = VarName Then ванию привязки 
                MyVa с нашим именем
 
                VarIs = True ue 
 
         м это
                r
 
If VarIs Then 'если в документе привязка есть
 
  й по названию привязки 
 
Примечание

Закладки, не относящиеся к привязкам, например, созданные пользователем самостоятельно, при копировании отчетов не изменяются.

Обращение к данным из базы

Из отчета можно напрямую обращаться к данным из базы бизнес-модели. Это делается двумя способами:

  1. Через обращение к параметрам объекта, от которого был вызван отчет.
  2. Через использование механизма OLE.

Обращение к параметрам объекта

Обращение к параметрам объекта, от которого был вызван отчет, происходит таким образом:

ob.<СистемноеНазваниеПараметра>,

где

  • "ob" - объект, от которого был вызван отчет;
  • <СистемноеНазваниеПараметра> − это системное название параметра объекта, которое можно просмотреть в Объектной модели (см. Объектная модель).

Например, при выводе отчета от процесса получить данные названия процесса можно таким образом:

   Name = ob.Название  м Название объекта, от которого вызвали отчет 
 

Использование механизма OLE

Механизм OLE предоставляет более широкие возможности по обращению к данным бизнес-модели и выводу этих данных в отчетах по сравнению с обращением просто как данным объекта, от которого был вызван отчет.

Описание механизма OLE подробно описано в главе Работа с Business Studio через OLE. Для задействования OLE в отчетах конкретной базы нет необходимости во включении опции "Разрешено использование OLE".

Внимание!

В отчетах при работе с OLE недоступны все методы класса "Система.OleApplication", поскольку в макросе "ПослеВыполненияОтчета" есть аргумент "app", который является приложением Business Studio, а не "Система.OleApplication".

Несколько задач в одном макросе

Бывают ситуации, когда:

  1. В рамках одного отчета необходимо решить более чем одну задачу. Например, форматирование полей типа RTF и вставка столбца в таблицу.
  2. Одну и ту же задачу необходимо применять к разным отчетам. Для этого необходимо скопировать код VBA, который решает поставленную задачу. И будет удобней если этот код не пересекается с кодами других задач.
  3. Отладку кода удобно вести по одной из задач, на время отключив выполнение других задач.

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

Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)
 
   Call Macros1
   Call Macros2
    
 
End Sub
 
 
Sub Macros макросы 
 
End Sub
 
 
Sub Macros1 ()
   адача
End Sub
 
 
Sub Macros2 ()
   'В рамках эешается одна задача
End Su

Если такие макросы имеют одинаковые части кода, то их тоже можно (и рекомендуется) выносить в отдельные макросы или функции в том же окне с ключевым макросом. Например, функция для определения присутствия в отчете необходимой привязки типа список (см. Работа с копией отчета, содержащим макрос) может быть следующей:

Function BookmarkIs(BookmarkName As String) As Boolean
 
'Проверка на корректность названия привязки
ь названия привязки
 
Dim Bkm As Bookmark  = False 'сначала считаем,па Закладка
 
 
BookmarkIs = False ctiveDocument.Bookmarks 'перебираем все зажной закладки нет
 
For Each Bkm In ActiveDocument.Bookmarks  с нашим именем
 
        Bookmarkадки в документе
 
    If Bkm.Name = BookmarkName Then   
End Function

Использование этой функции из макроса может быть таким:

Sub MacrosN ()
 
BookmarkName = "НазваниеЗакладкиТипаСписок"киТипаСписок"
 
If BookmarkIs(BookmarkName) Then  есть
   'Выполняются необходимызакладка есть
 

Отладка кода

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

Примеры решения задач с использованием макросов

Примеры работы с отчетами при использовании макросов приведены в статье Примеры решения задач.

Ресурсы по VBA

Актуальные новости, публикации и практики для бизнес-архитекторов и аналитиков
Driven by DokuWiki