Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:work_in_macros [2020/07/17 09:29] 192.168.1.126 удалено |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Создание макроса и работа с ним ====== | ||
- | Для обеспечения корректного построения отчетов, содержащих макросы, требуется установить доверие на доступ к объектной модели VBA. | ||
- | |||
- | В Microsoft Word 2007 это осуществляется следующей последовательностью действий: | ||
- | |||
- | *нажать кнопку {{ru/creating_user_reports/use_macros_in_reports/macros_in_report_1418.png?34x35&nolink}} Office в верхнем левом углу, нажать кнопку "Параметры Word"; | ||
- | *выбрать закладку "Центр управления безопасностью", нажать кнопку "Параметры центра управления безопасностью"; | ||
- | *выбрать закладку "Параметры макросов", в разделе "Параметры макросов для разработчика" установить опцию "Доверять доступ к объектной модели проектов VBA". | ||
- | |||
- | В Microsoft Word 2010/2013/2016: | ||
- | |||
- | *выбрать пункт меню "Файл -> Параметры…"; | ||
- | *в окне "Параметры Word" выбрать закладку "Центр управления безопасностью", нажать кнопку "Параметры центра управления безопасностью"; | ||
- | *выбрать закладку "Параметры макросов", в разделе "Параметры макросов для разработчика" установить опцию "Доверять доступ к объектной модели проектов VBA". | ||
- | |||
- | <note> | ||
- | **Примечание.** VBA - Visual Basic for Applications (Visual Basic для приложений) - упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office. | ||
- | </note> | ||
- | |||
- | ===== Начало создания макроса ===== | ||
- | |||
- | ==== Макрос для отчетов формата Word ==== | ||
- | |||
- | Для того, чтобы создать или просмотреть макрос для отчета формата Word необходимо: | ||
- | |||
- | * открыть отчет в Мастере отчетов; | ||
- | |||
- | * на ленте "Разработчик" в группе "Код" нажать кнопку "Visual Basic" (или сразу нажать Alt+F11). Откроется окно приложения "Microsoft Visual Basic for Application"; | ||
- | |||
- | * В окне "Project -- TemplateProject" в дереве открыть узел "TemplateProject - Microsoft Word Objects -- ThisDocument"; | ||
- | |||
- | * В правой части окна приложения, где приведен код, будет макрос "ПослеВыполненияОтчета". | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:lang_startvbaword.png?nolink |Рисунок 1. Вид окна среды VBA при работе с макросом для отчетов формата Word}}] | ||
- | |||
- | Если макроса там не будет, его можно создать самостоятельно, введя в данном окне строки начала и конца макроса, а между ними - сам текст макроса: | ||
- | |||
- | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
- | |||
- | <Текст макроса> | ||
- | |||
- | End Sub | ||
- | |||
- | == == | ||
- | |||
- | **Внимание!** В Word 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо: | ||
- | |||
- | * запустить MS Word; | ||
- | |||
- | * нажать кнопку {{ru:creating_user_reports:use_macros_in_reports:lang_macros_in_report_1418.png?nolink}} Office в верхнем левом углу, нажать кнопку "Параметры Word"; | ||
- | |||
- | * на закладке "Основные" в разделе "Основные параметры работы с Word" установить опцию "Показывать вкладку "Разработчик" на ленте" | ||
- | ==== ==== | ||
- | |||
- | ==== Макрос для отчетов формата Excel ==== | ||
- | |||
- | Для того, чтобы создать или просмотреть макрос для отчета формата Excel, необходимо: | ||
- | |||
- | * открыть отчет в Мастере отчетов; | ||
- | |||
- | * нажать кнопку "2. Редактировать шаблон"; | ||
- | |||
- | * в MS Excel на ленте "Разработчик" в группе "Код" нажать кнопку "Visual Basic" (или сразу нажать Alt+F11). Откроется окно приложения "Microsoft Visual Basic for Application"; | ||
- | |||
- | * В окне "Project -- VBAProject" в дереве открыть узел "VBAProject - Modules -- Module1"; | ||
- | |||
- | * В правой части окна приложения, где приведен код, необходимо перейти к макросу "ПослеВыполненияОтчета". | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:lang_startvbaexcel.png?nolink |Рисунок 2. Вид окна среды VBA при работе с макросом для отчетов формата Excel}}] | ||
- | |||
- | == == | ||
- | |||
- | **Внимание!** В Excel 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо: | ||
- | |||
- | * запустить MS Excel; | ||
- | |||
- | * нажать кнопку {{ru:creating_user_reports:use_macros_in_reports:lang_macros_in_report_1418.png?nolink}} Office в верхнем левом углу, нажать кнопку "Параметры Excel"; | ||
- | |||
- | * на закладке "Основные" в разделе "Основные параметры работы с Excel" установить опцию "Показывать вкладку "Разработчик" на ленте" | ||
- | ==== ==== | ||
- | |||
- | ===== Макрос "ПослеВыполненияОтчета" ===== | ||
- | |||
- | Любой отчет изначально содержит следующий макрос: | ||
- | |||
- | <code> | ||
- | |||
- | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
- | |||
- | ' MsgBox "MACRO ПослеВыполненияОтчета" + CStr(ob.Название) | ||
- | |||
- | End Sub | ||
- | |||
- | </code> | ||
- | |||
- | Этот макрос будет запускаться после вставки данных в отчет. Он используется в отчетах баз данных, поставляемых с программой. Код по обработке отчета следует вставлять в этот макрос. | ||
- | |||
- | Переменные, которые передаются в макрос: | ||
- | |||
- | * "ob" − объект, от которого был вызван отчет; | ||
- | |||
- | * "app" − приложение, от которого был вызван отчет, то есть Business Studio. | ||
- | |||
- | == == | ||
- | **Внимание!** Просмотреть объектную модель Word для разработки макросов в редакторе Visual Basic можно по клавише F2. | ||
- | ==== ==== | ||
- | |||
- | ===== Название привязки для макроса ===== | ||
- | |||
- | При решении ряда задач средствами программирования бывает удобно оперировать данными привязок отчета. Для этого необходимо: | ||
- | |||
- | - Знать название привязки. | ||
- | - Связать переменные в коде VBA с этим названием. | ||
- | |||
- | Ниже описано, как это это делается для привязок разных типов. | ||
- | |||
- | **Тип привязки: Объект** | ||
- | |||
- | В отчете такие привязки представлены полями. | ||
- | |||
- | Узнать название в шаблоне отчета: см. статью [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект|Пример определения названия привязки типа "Объект"]]. | ||
- | |||
- | Использование названия привязки в коде: | ||
- | |||
- | <code> | ||
- | |||
- | ПеременнаяВКоде = Application.ActiveDocument.Variables.Item("НазваниеПривязки").Value | ||
- | |||
- | </code> | ||
- | |||
- | **Тип привязки: Список и Фильтр** | ||
- | |||
- | В отчете такие привязки представлены таблицей. | ||
- | |||
- | Узнать название в шаблоне отчета: см. статью [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список|Пример определения названия привязки типа "Список"]]. | ||
- | |||
- | Использование названия привязки в коде: | ||
- | |||
- | <code> | ||
- | |||
- | Set ТаблицДляОбработки = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1) | ||
- | |||
- | </code> | ||
- | |||
- | |||
- | ===== Работа с таблицами ===== | ||
- | |||
- | В отчетах Business Studio присутствует большое количество таблиц. Поэтому высока вероятность того, что основные задачи будут связаны с их обработкой. | ||
- | |||
- | Примеры ключевых функций, которые будут полезны при работы с таблицами, приведены ниже. | ||
- | |||
- | **Работа с таблицей через название привязки** | ||
- | |||
- | <code> | ||
- | 'переменная для работы с конкретной таблицей | ||
- | 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го столбца | ||
- | |||
- | </code> | ||
- | |||
- | **Работа с таблицей через её номер в документе** | ||
- | |||
- | <code> | ||
- | |||
- | с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го столбца | ||
- | |||
- | </code> | ||
- | |||
- | **При работе с таблицами следует помнить ряд моментов:** | ||
- | |||
- | * Таблицы могут содержать объединенные ячейки. В случае перебора всех строк таблицы может возникнуть ошибка. Чтобы этого не было, необходимо использовать команду игнорирования ошибки: | ||
- | |||
- | <code> | ||
- | On Error Resume Next ' игнорирование <error 5991> - ячейки таблицы имеют вертикальное объединение | ||
- | |||
- | </code> | ||
- | |||
- | * При получении текста таблицы следует помнить, что полученное значение ячейки так же содержит в себе 2 служебных символа. Для обработки данных ячейки без этих служебных символов следует произвести «очистку» значения. Например: | ||
- | |||
- | <code> | ||
- | |||
- | СellText = Selection.Tables(1).Cell(3,2).Range.Text 'текст ячейки со служебными символами | ||
- | |||
- | СellText = Left$(СellText, (Len(CellText) - 2)) 'убираем 2 последних символа ячейки - чистый текст | ||
- | |||
- | </code> | ||
- | |||
- | Приведенная выше информация не является полной для работы с таблицами, а лишь обращает внимание на наиболее возможные ситуации. | ||
- | |||
- | ===== Определение направления формирования отчета ===== | ||
- | |||
- | Один и тот же отчет Business Studio может рассматриваться из разных мест: | ||
- | |||
- | * одиночный документ Word или Excel или несколько документов, | ||
- | * HTML-публикация, | ||
- | * Business Studio Portal. | ||
- | |||
- | При рассмотрении такого отчета в разных местах есть свои нюансы. Например, отчеты в HTML-публикации и Business Studio Portal не содержат колонтитулов, которые есть в отчете, сделанным отдельным документом Word. | ||
- | |||
- | Также могут быть и разные задачи по обработке отчета кодом в зависимости от направления формирования отчета. Для определения направления формирования отчета используются параметры: BSInThread, BSHtml и BSPortal. | ||
- | |||
- | <startTableBox> | ||
- | ^ Направление формирования отчета ^ BSInThread ^ BSHtml ^ BSPortal ^ | ||
- | | Одиночный файл (Word, Excel) | False | False | False | | ||
- | | Пакетное формирование (Word, Excel) | True | False | False | | ||
- | | HTML-публикация | True | True | False | | ||
- | | Business Studio Portal | True | True | True | | ||
- | <endTableBox| Таблица 1. Значения специальных переменных в зависимости от направления формирования отчета> | ||
- | |||
- | Пример использования в коде: | ||
- | <code> | ||
- | |||
- | 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 | ||
- | |||
- | </code> | ||
- | |||
- | <note> | ||
- | **Примечание.** При формировании отчета типа HTML (HTML-публикация, Business Studio Portal) так же происходит формирование и отдельного файла типа Word. | ||
- | </note> | ||
- | |||
- | ===== Работа со ссылками в отчетах для HTML ===== | ||
- | |||
- | При обработке кодом VBA отчета, сформированного для HTML-публикации или Business Studio Portal, следует помнить, что после формирования отчет представляет собой отображение не тех данных, что видны в браузере, а документ с показом кодов полей. Это не позволяет вести обработку гиперссылок. | ||
- | |||
- | Для "нормализации" отображения данных следует сначала использовать следующий код: | ||
- | |||
- | <codevb> | ||
- | |||
- | ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды полей, а значения | ||
- | |||
- | </code> | ||
- | |||
- | ===== Работа с копией отчета, содержащей макрос ===== | ||
- | |||
- | При копировании отчета названия всех привязок изменяются. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:lang_copy1.png?nolink |Рисунок 3. Названия привязок в исходном отчете}}] | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:lang_copy2.png?nolink |Рисунок 4. Названия привязок в копии отчета}}] | ||
- | |||
- | В случае, если в отчете используется макрос, который "опирается" на названия привязок, то следует помнить, что после копирования такой отчет не сможет формироваться таким же образом как оригинал без дополнительной обработки. | ||
- | |||
- | Для корректной работы макроса рекомендуется использование проверки на предмет наличия привязки в отчете. | ||
- | |||
- | **Пример проверки наличия привязки типа "Список".** В документе это закладки. | ||
- | |||
- | Определяем название привязки типа "Список", которая представляет нужную таблицу (см. [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список|Пример определения названия привязки типа "Список"]]). | ||
- | |||
- | <code> | ||
- | |||
- | 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 | ||
- | |||
- | </code> | ||
- | |||
- | Выводить какое-либо сообщение в случае отсутствия привязки не рекомендуется по причине того, что если не будет данных для формирования привязки, то и соответствующей привязки не будет. | ||
- | |||
- | **Пример проверки наличия привязки типа Объект** | ||
- | |||
- | Определяем название привязки типа "Объект", которая представляет нужное поле в отчёте (см. статью [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект|Пример определения названия привязки типа "Объект"]]). | ||
- | |||
- | <code> | ||
- | |||
- | 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 | ||
- | |||
- | </code> | ||
- | |||
- | <note> | ||
- | **Примечание.** Закладки, не относящиеся к привязкам, например, созданные пользователем самостоятельно, при копировании отчетов не изменяются. | ||
- | </note> | ||
- | |||
- | ===== Обращение к данным из базы ===== | ||
- | |||
- | Из отчета можно напрямую обращаться к данным из базы бизнес-модели. Это делается двумя способами: | ||
- | |||
- | - Через обращение к параметрам объекта, от которого был вызван отчет. | ||
- | - Через использование механизма OLE. | ||
- | |||
- | ==== Обращение к параметрам объекта ==== | ||
- | |||
- | Обращение к параметрам объекта, от которого был вызван отчет, происходит таким образом: | ||
- | |||
- | ob.<СистемноеНазваниеПараметра>, | ||
- | |||
- | где | ||
- | |||
- | * "ob" - объект, от которого был вызван отчет; | ||
- | |||
- | * <СистемноеНазваниеПараметра> − это системное название параметра объекта, которое можно просмотреть в **Объектной модели** (см. [[ru/manual/manual]] -> [[ru/manual/report/object_model]]). | ||
- | |||
- | Например, при выводе отчета от процесса получить данные названия процесса можно таким образом: | ||
- | |||
- | <code> | ||
- | |||
- | Name = ob.Название 'получаем Название объекта, от которого вызвали отчет | ||
- | |||
- | </code> | ||
- | |||
- | ==== Использование механизма OLE ==== | ||
- | Механизм OLE предоставляет более широкие возможности по обращению к данным бизнес-модели и выводу этих данных в отчетах по сравнению с обращением просто как данным объекта, от которого был вызван отчет. | ||
- | |||
- | Описание механизма OLE подробно описано в главе [[ru/technical_manual/technical_manual]] -> [[ru/technical_manual/work_via_ole]]. | ||
- | Для задействования OLE в отчетах конкретной базы нет необходимости во включении опции "Разрешено использование OLE". | ||
- | |||
- | == == | ||
- | **Внимание!** В отчетах при работе с OLE недоступны все методы класса "Система.OleApplication", поскольку в макросе "ПослеВыполненияОтчета" есть аргумент "app", который является приложением Business Studio, а не "Система.OleApplication". | ||
- | ==== ==== | ||
- | |||
- | ===== Несколько задач в одном макросе ===== | ||
- | |||
- | Бывают ситуации, когда: | ||
- | - В рамках одного отчета необходимо решить более чем одну задачу. Например, форматирование полей типа RTF и вставка столбца в таблицу. | ||
- | - Одну и ту же задачу необходимо применять к разным отчетам. Для этого необходимо скопировать код VBA, который решает поставленную задачу. И будет удобней, если этот код не пересекается с кодами других задач. | ||
- | - Отладку кода удобно вести по одной из задач, на время отключив выполнение других задач. | ||
- | |||
- | В таких случаях каждую решаемую задачу удобно оформлять отдельным макросом. А в ключевом макросе "ПослеВыполненияОтчета" лишь вызывать по очереди нужные макросы. Все эти макросы оформляются в том же окне, где и ключевой макрос и делается так: | ||
- | <code> | ||
- | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
- | |||
- | Call Macros1 | ||
- | Call Macros2 | ||
- | 'любые другие макросы | ||
- | |||
- | End Sub | ||
- | |||
- | |||
- | Sub Macros1 () | ||
- | 'В рамках этого макроса решается одна задача | ||
- | End Sub | ||
- | |||
- | |||
- | Sub Macros2 () | ||
- | 'В рамках этого макроса решается другая задача | ||
- | End Sub | ||
- | </code> | ||
- | |||
- | Если такие макросы имеют одинаковые части кода, то их тоже можно (и рекомендуется) выносить в отдельные макросы или функции в том же окне с ключевым макросом. Например, функция для определения присутствия в отчете необходимой привязки типа "Список" (см. [[#работа_с_копией_отчета_содержащим_макрос|Работа с копией отчета, содержащим макрос]]) может быть следующей: | ||
- | |||
- | <code> | ||
- | 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 | ||
- | </code> | ||
- | |||
- | Использование этой функции из макроса может быть таким: | ||
- | <code> | ||
- | Sub MacrosN () | ||
- | |||
- | BookmarkName = "НазваниеЗакладкиТипаСписок" | ||
- | |||
- | If BookmarkIs(BookmarkName) Then 'если в документе закладка есть | ||
- | 'Выполняются необходимые действия | ||
- | End If | ||
- | |||
- | End Sub | ||
- | </code> | ||
- | |||
- | ===== Отладка кода ===== | ||
- | Разработка макроса, как и любая другая работа, это определенный путь, в котором будут допущены ошибки и будет их исправление. Ошибки могут быть обнаружены сразу или не видны при первом взгляде. Более детально об этом описано в главе [[/ru/creating_user_reports/use_macros_in_reports/debug]]. | ||
- | |||
- | ===== Примеры решения задач с использованием макросов ===== | ||
- | |||
- | Примеры работы с отчетами при использовании макросов приведены в статье [[/ru/creating_user_reports/use_macros_in_reports/examples]]. | ||
- | |||
- | ===== Ресурсы по VBA ===== | ||
- | |||
- | *[[http://msdn.microsoft.com/ru-ru/library/office/ee814735(v=office.14).aspx|http://msdn.microsoft.com]] - Начало работы с VBA в MS Office | ||
- | *[[http://msdn.microsoft.com/ru-ru/library/office/ff604039(v=office.14).aspx|http://msdn.microsoft.com]] - Начало работы с VBA в Word 2010 | ||
- | *[[http://msdn.microsoft.com/ru-ru/library/office/ee814737(v=office.14).aspx|http://msdn.microsoft.com]] - Начало работы с VBA в Excel 2010 | ||
- | * [[https://www.google.ru/?q=vba#q=vba|http://google.com]] | ||
- | |||
- | [<contextnavigator>] |