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


Использование макросов в отчетах

Необходимые данные из бизнес-модели для отчетов собираются через привязки. Оформление отчета делается средствами MS Word. При этом бывают ситуации, когда для воплощения требуемого решения, этого бывает не достаточно и требуется использование программного кода VBA.

Задачи, при которых имеет смысл использовать макросы:

  • Оформление отчета и изменение представления информации в случаях, если ручных средств MS Word недостаточно. Например, объединение в одной ячейке значений из других ячеек таблицы.
  • Манипуляция данными, когда необходимо проводить различные сложные вычисления.

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

Примечание

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";
  • В правой части окна приложения, где приведен код будет макрос "ПослеВыполненияОтчета".
Invalid Link
Рисунок 1. Вид окна среды VBA при работе с макросом для отчетов формата Word
Внимание!

В 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";
  • В правой части окна приложения, где приведен код, необходимо перейти к макросу "ПослеВыполненияОтчета".
Invalid Link
Рисунок 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 = Tконкретной таблицей
 
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 n.Tables(1).Rows.Count 'количбцов таблицы
 
countRow = Selection.Tables(1).Rows.Count Text 'значение ячейки во 2рок таблицы
 

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

  • Таблицы могут содержать объединенные ячейки. В случае перебора всех строк таблицы может возникнуть ошибка. Чтобы этого не было,  необходимо использовать команду игнорирования ошибки:
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 "Выводим в одиночный файл или потоком"
 
Else
 
     MsgBox "Выводим для HTML: HTML-п
Примечание

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

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

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

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

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

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

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

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

 

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

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

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

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

BookmarkName = "Изменения_процесса_e1ded8b0"сса_e1ded8b0" и
 
        'Проверкривязки
 
        вязки
 
        Dim BookmarkIs As Boolean 'снь названия привязки
 
        Dim BookmarkIs As Boolean па Закладка
 
        For Each Bkm InActiveжной закладки нет
        Dim Bkm AsBookmark  IfBkm.Name = BookmarkNameпа Закладка
 
        For Each Bkm InActiveDocument.Bookmarks отмечаем, что закладка есть
         адки в документе
 
            IfBkm.Name = BookmarkName Then plication.ActiveDocument.Bookmarks(B с нашим именем
 
                BookmarkIs = True hen 'если в документе закладккладка есть
                действия c таблицей
 
End If

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

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

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

VarName = "Статус_процесса_c9a10e8d"са_c9a10e8d" язки
 
      'Проверривязки
 
      и в документе
        Dim VarIs As Boolean 'сначай привязки в документе
        Dim VarIs As Boolean     For Each aVar In ActiveDocumenо привязки нет
 
        ame Then 'если среди них есть с нашимменные документа
        For Each aVar In ActiveDocument.Variables
 
            If aVar.Name = VarName Then  = Application.ActiveDocument.Variab с нашим именем
 
                VarIs = True  Then 'если в м это
                   'производим необходимые действия с переменной
 
Enй 
Примечание

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

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

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

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

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

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

где

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

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

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

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

Ресурсы по VBA

/code

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