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

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

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

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

В Microsoft Word 2010/2013/2016:

  • выбрать пункт меню "Файл → Параметры…";
  • в окне "Параметры 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)

' MsgBox "MACRO ПослеВыполненияОтчета" + CStr(ob.Название)

End Sub

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

countColumn = Table.Columns.Count 'количество столбцов таблицы

countRow = Table.Rows.Count 'количество строк таблицы

СellText  = Table.Cell(2,1).Range.Text 'значение ячейки во 2й строке 1го столбца
 

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

сountTables = ActiveDocument.Tables.Count 'количество таблиц в документе

Selection.GoTo What:=wdGoToTable, Which:=wdGoToFirst, Count:=5, Name:="" 'перейти к таблице номер 5

countColumn  = Selection.Tables(1).Columns.Count 'количество столбцов таблицы

countRow = Selection.Tables(1).Rows.Count 'количество строк таблицы

СellText  = Selection.Tables(1).Cell(2,1).Range.Text 'значение ячейки во 2й строке 1го столбца
 

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

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

СellText = Left$(СellText, (Len(CellText) - 2)) 'убираем 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

If HTMLCreate Then

     MsgBox "Выводим для HTML: HTML-публикация или Business Studio Portal"

Else
     
     MsgBox "Выводим в одиночный файл или потоком файлов"     

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

При формировании отчета типа 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" 'название привязки

        'Проверка на корректность названия привязки

        Dim BookmarkIs As Boolean 'сначала считаем, что нужной закладки нет
        Dim Bkm As Bookmark 'переменная типа Закладка

        For Each Bkm InActiveDocument.Bookmarks 'перебираем все закладки в документе

            IfBkm.Name = BookmarkName Then 'если нашли закладку с нашим именем

                BookmarkIs = True 'отмечаем, что закладка есть
                'получаем таблицу по названию привязки 
                Set SettableStatus = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1)

            End If

        Next

If BookmarkIs Then 'если в документе закладка есть
    
   'производим необходимые действия c таблицей

End If

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

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

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

VarName = "Статус_процесса_c9a10e8d" 'название привязки

      'Проверка наличия указанной привязки в документе
        Dim VarIs As Boolean 'сначала считаем что привязки нет

        'перебираем все переменные документа
        For Each aVar In ActiveDocument.Variables

            If aVar.Name = VarName Then 'если среди них есть с нашим именем

                VarIs = True 'отмечаем это
                'получаем значение переменной по названию привязки 
                MyVar = Application.ActiveDocument.Variables.Item(VarName).Value 

            End If

        Next aVar

If VarIs Then 'если в документе привязка есть

     'производим необходимые действия с переменной

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

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

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

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

  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 Macros1 ()
   'В рамках этого макроса решается одна задача
End Sub


Sub Macros2 ()
   'В рамках этого макроса решается другая задача
End Sub

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

Function BookmarkIs(BookmarkName As String) As Boolean

'Проверка на корректность названия привязки

Dim Bkm As Bookmark 'переменная типа Закладка


BookmarkIs = False 'сначала считаем, что нужной закладки нет

For Each Bkm In ActiveDocument.Bookmarks 'перебираем все закладки в документе

    If Bkm.Name = BookmarkName Then 'если нашли закладку с нашим именем
    
        BookmarkIs = True 'отмечаем, что закладка есть
        
    End If
 
Next
    
End Function

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

Sub MacrosN ()

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

End Sub

Отладка кода

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

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

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

Ресурсы по VBA

« ПредыдущаяНа уровень вышеСледующая »
Актуальные новости, публикации и практики для бизнес-архитекторов и аналитиков
Driven by DokuWiki