Для обеспечения корректного построения отчетов, содержащих макросы, требуется установить доверие на доступ к объектной модели VBA.
В Microsoft Word 2007 это осуществляется следующей последовательностью действий:
В Microsoft Word 2010/2013/2016:
Для того, чтобы создать или просмотреть макрос для отчета формата Word необходимо:
Если макроса там не будет, его можно создать самостоятельно, введя в данном окне строки начала и конца макроса, а между ними - сам текст макроса:
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)
<Текст макроса>
End Sub
Внимание! В Word 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо:
Для того, чтобы создать или просмотреть макрос для отчета формата Excel, необходимо:
Внимание! В Excel 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо:
Любой отчет изначально содержит следующий макрос:
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) ' MsgBox "MACRO ПослеВыполненияОтчета" + CStr(ob.Название) End Sub
Этот макрос будет запускаться после вставки данных в отчет. Он используется в отчетах баз данных, поставляемых с программой. Код по обработке отчета следует вставлять в этот макрос.
Переменные, которые передаются в макрос:
Внимание! Просмотреть объектную модель Word для разработки макросов в редакторе Visual Basic можно по клавише F2.
При решении ряда задач средствами программирования бывает удобно оперировать данными привязок отчета. Для этого необходимо:
Ниже описано, как это это делается для привязок разных типов.
Тип привязки: Объект
В отчете такие привязки представлены полями.
Узнать название в шаблоне отчета: см. статью Руководство пользователя → Пример определения названия привязки типа "Объект".
Использование названия привязки в коде:
ПеременнаяВКоде = 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> - ячейки таблицы имеют вертикальное объединение
СellText = Selection.Tables(1).Cell(3,2).Range.Text 'текст ячейки со служебными символами СellText = Left$(СellText, (Len(CellText) - 2)) 'убираем 2 последних символа ячейки - чистый текст
Приведенная выше информация не является полной для работы с таблицами, а лишь обращает внимание на наиболее возможные ситуации.
Один и тот же отчет Business Studio может рассматриваться из разных мест:
При рассмотрении такого отчета в разных местах есть свои нюансы. Например, отчеты в 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 |
Пример использования в коде:
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
При обработке кодом VBA отчета, сформированного для HTML-публикации или Business Studio Portal, следует помнить, что после формирования отчет представляет собой отображение не тех данных, что видны в браузере, а документ с показом кодов полей. Это не позволяет вести обработку гиперссылок.
Для "нормализации" отображения данных следует сначала использовать следующий код:
ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды пол
При копировании отчета названия всех привязок изменяются.
В случае, если в отчете используется макрос, который "опирается" на названия привязок, то следует помнить, что после копирования такой отчет не сможет формироваться таким же образом как оригинал без дополнительной обработки.
Для корректной работы макроса рекомендуется использование проверки на предмет наличия привязки в отчете.
Пример проверки наличия привязки типа "Список". В документе это закладки.
Определяем название привязки типа "Список", которая представляет нужную таблицу (см. Руководство пользователя → Пример определения названия привязки типа "Список").
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
Из отчета можно напрямую обращаться к данным модели бизнес-архитектуры. Это делается двумя способами:
Обращение к параметрам объекта, от которого был вызван отчет, происходит таким образом:
ob.<СистемноеНазваниеПараметра>,
где
Например, при выводе отчета от единицы деятельности получить данные названия единицы деятельности можно таким образом:
Name = ob.Название 'получаем Название объекта, от которого вызвали отчет
Механизм OLE предоставляет более широкие возможности по обращению к данным модели бизнес-архитектуры и выводу этих данных в отчетах по сравнению с обращением просто как данным объекта, от которого был вызван отчет.
Описание механизма OLE подробно описано в главе Руководство технического специалиста → Работа с Business Studio через OLE. Для задействования OLE в отчетах конкретной базы нет необходимости во включении опции "Разрешено использование OLE".
Внимание! В отчетах при работе с OLE недоступны все методы класса "Система.OleApplication", поскольку в макросе "ПослеВыполненияОтчета" есть аргумент "app", который является приложением Business Studio, а не "Система.OleApplication".
Бывают ситуации, когда:
В таких случаях каждую решаемую задачу удобно оформлять отдельным макросом. А в ключевом макросе "ПослеВыполненияОтчета" лишь вызывать по очереди нужные макросы. Все эти макросы оформляются в том же окне, где и ключевой макрос и делается так:
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
Разработка макроса, как и любая другая работа, это определенный путь, в котором будут допущены ошибки и будет их исправление. Ошибки могут быть обнаружены сразу или не видны при первом взгляде. Более детально об этом описано в главе Подходы к отладке кода.
Примеры работы с отчетами при использовании макросов приведены в статье Примеры решения задач.