Различия

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

Ссылка на это сравнение

ru:manual:report:use_macros_in_reports [2013/08/23 10:09]
belkin
— (текущий)
Строка 1: Строка 1:
-====== Использование макросов в отчетах ====== 
  
-Необходимые данные из бизнес-модели для отчетов собираются через привязки. Оформление отчета делается средствами MS Word. При этом бывают ситуации, когда для воплощения требуемого решения, этого бывает не достаточно и требуется использование программного кода VBA. 
- 
-Задачи, при которых имеет смысл использовать макросы: 
- 
-  * Оформление отчета и изменение представления информации в случаях, если ручных средств MS Word недостаточно. Например, объединение в одной ячейке значений из других ячеек таблицы. 
-  * Манипуляция данными, когда необходимо проводить различные сложные вычисления. 
- 
-Макросы можно использовать для получения данных непосредственно из базы. Даже можно написать макрос, который строит отчеты, аналогичный регламентирующему документу без единой привязки. Но в этом нет смысла при таком мощном Мастере отчетов. 
- 
-Для обеспечения корректного построения отчетов, содержащих макросы, требуется установить доверие на доступ к объектной модели VBA. 
- 
-В Microsoft Word 2007 это осуществляется следующей последовательностью действий: 
- 
-  *нажать кнопку {{ru/manual/sample_questions/macros_in_report/macros_in_report_1418.png?34x35&nolink}} 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"; 
- 
-  * В правой части окна приложения, где приведен код будет макрос "ПослеВыполненияОтчета". 
- 
-[{{ ru:manual:report:use_macros_in_reports:startvbaword.png?nolink |Рисунок 1. Вид окна среды VBA при работе с макросом для отчетов формата Word}}] 
- 
-  
-== Внимание! == 
- 
-В Word 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо: 
- 
-  * запустить MS Word; 
- 
-  * нажать кнопку {{ru:manual:report:use_macros_in_reports: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:manual:report:use_macros_in_reports:startvbaexcel.png?nolink |Рисунок 2. Вид окна среды VBA при работе с макросом для отчетов формата Excel}}] 
- 
-== Внимание! == 
- 
-В Excel 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо: 
- 
-  * запустить MS Excel; 
- 
-  * нажать кнопку {{ru:manual:report:use_macros_in_reports:macros_in_report_1418.png?nolink}} Office в верхнем левом углу, нажать кнопку "Параметры Excel"; 
- 
-  * на закладке "Основные" в разделе "Основные параметры работы с  Excel" установить опцию "Показывать вкладку "Разработчик" на ленте" 
-====== ====== 
- 
-===== Макрос "ПослеВыполненияОтчета" ===== 
- 
-Любой отчет изначально содержит следующий макрос: 
- 
-<code vb> 
- 
-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/report/insert_anchor]], статья [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект | Пример определения названия привязки типа "Объект"]]. 
- 
-Использование названия привязки в коде: 
- 
-<code vb> 
-  
-ПеременнаяВКоде = Application.ActiveDocument.Variables.Item("НазваниеПривязки").Value 
- 
-</code> 
- 
-**Тип привязки:  Список и Фильтр**  
- 
-В отчете такие привязки представлены таблицей. 
- 
-Узнать название в шаблоне отчета: см. [[ru/manual/report/insert_anchor]], статья [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список |Пример определения названия привязки типа "Список"]]. 
- 
-Использование названия привязки в коде: 
- 
-<code vb> 
-   
-Set ТаблицДляОбработки = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1) 
- 
-</code> 
- 
- 
-===== Работа с таблицами ===== 
- 
-Отчеты Business Studio имеют четкую структуру и в них присутствует множество таблиц. Поэтому высока вероятность того, что основные задачи будут связаны с их обработкой. 
- 
-Примеры ключевых функций, которые будут полезны при работы с таблицами, приведены ниже. 
-  
-**Работа с таблицей через название привязки** 
- 
-<code vb> 
- 'переменная для работы с конкретной таблицей 
-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 vb> 
- 
-с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 vb> 
-On Error Resume Next ' игнорирование <error 5991> - ячейки таблицы имеют вертикальное объединение 
-  
-</code> 
- 
-  * При получении текста таблицы следует помнить, что полученное значение ячейки так же содержит в себе 2 служебных символа. Для обработки данных ячейки без этих служебных символов следует произвести «очистку» значения. Например: 
- 
-<code vb> 
- 
-С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 vb> 
- 
-Dim HTMLCreate As Boolean 
-HTMLCreate = Application.ActiveDocument.Variables("BSHtml").Value 'True или False 
- 
-If HTMLCreate Then 
- 
-     MsgBox "Выводим в одиночный файл или потоком" 
-      
-Else 
-      
-     MsgBox "Выводим для HTML: HTML-публикация или Business Studio Portal" 
- 
-End If 
- 
-</code> 
- 
-== Примечание == 
-При формировании отчета типа HTML (HTML-портал, Business Studio Portal) так же происходит формирование и отдельного файла типа Word. 
-====== ====== 
-===== Работа со ссылками в отчетах для HTML ===== 
- 
-При обработке кодом VBA отчета, сформированного для HTML-публикатора или Business Studio Portal, следует помнить, что после формирования отчета представляет собой отображение не тех данных, что видны в браузере, а документ с показом кодов полей. Это не позволяет вести обработку гиперссылок. 
- 
-Для "нормализации" отображения данных следует сначала использовать следующий код: 
- 
-<codevb> 
-  
-ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды полей, а значения 
-  
-</code> 
- 
-===== Работа с копией отчета, содержащим макрос ===== 
- 
-При копировании отчета названия всех привязок изменяются. 
- 
-[{{ ru:manual:report:use_macros_in_reports:copy1.png?nolink |Рисунок 3. Названия привязок  в исходном отчете}}] 
- 
-[{{ ru:manual:report:use_macros_in_reports:copy2.png?nolink |Рисунок 4. Названия привязок в копии отчета}}]  
- 
-В случае, если в отчете используется макрос, который "опирается" на названия привязок, то следует помнить, что после копирования такой отчет не сможет формироваться таким же образом как оригинал без дополнительной обработки. 
- 
-Для корректной работы макроса рекомендуется использование проверки на предмет наличия привязки в отчете. 
- 
-**Пример проверки наличия привязки типа "Список".** В документе это закладки. 
- 
-Определяем название привязки типа "Список", которая представляет нужную таблицу. (см. [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список ]]) 
- 
-<code vb> 
- 
-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/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект]]) 
- 
-<code vb> 
- 
-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> 
- 
- == Примечание == 
-Закладки, не относящиеся к привязкам, например, созданные пользователем самостоятельно, при копировании отчетов не изменяются. 
-====== ====== 
- 
-===== Обращение к данным из базы ===== 
- 
-Из отчета можно напрямую обращаться к данным из базы бизнес-модели. Это делается двумя способами: 
- 
-  - Через обращение к параметрам объекта, от которого был вызван отчет. 
-  - Через использование механизма OLE (см. [[ru/technical_manual/work_via_ole]]). 
- 
-Обращение к параметрам объекта, от которого был вызван отчет, происходит таким образом: 
- 
-ob.<СистемноеНазваниеПараметра>, 
- 
-где 
- 
-  * "ob" - объект, от которого был вызван отчет; 
- 
-  * <СистемноеНазваниеПараметра> − это системное название параметра объекта, которое можно просмотреть в Объектной модели (см. [[ru/manual/report/object_model]]). 
- 
-Например, при выводе отчета от процесса получить данные названия процесса можно таким образом: 
- 
-<code vb> 
- 
-   Name = ob.Название  'получаем Название объекта, от которого вызвали отчет  
-  
-</code> 
-===== Отладка кода ===== 
- 
-Разработка макроса, как и любая другая работа, это определенный путь, в котором будут допущены ошибки и будет их исправление. Ошибки могут быть обнаружены сразу или не видны при первом взгляде. 
- 
-Более детально в статье [[/ru/manual/report/use_macros_in_reports/debug]]. 
- 
-===== Примеры решения задач с использованием макросов ===== 
- 
-  *[[/ru/manual/report/use_macros_in_reports/rtf_in_table]] 
-  *[[/ru/manual/report/use_macros_in_reports/plus_one_year]] 
-  *[[/ru/manual/report/use_macros_in_reports/insert_column]] 
-  *[[/ru/manual/report/use_macros_in_reports/another_language]] 
-  *[[/ru/manual/report/use_macros_in_reports/table_on_page]] 
-  *[[/ru/manual/report/use_macros_in_reports/without_tunnel]] 
-  *[[/ru/manual/report/use_macros_in_reports/contents_update]] 
-  *[[/ru/manual/report/use_macros_in_reports/data_access_from_report]] 
- 
-===== Ресурсы по VBA ===== 
- 
-  *[[http://msdn.microsoft.com/ru-ru/library/office/ee814735(v=office.14).aspx|http://msdn.microsoft.com]] - Начало работы с VBA в MS Office 
-  *[[http://vtit.kuzstu.ru/books/shelf/book3/sod/SOD.html|Информатика. Основы языка программирования VBA.]] - Учебное пособие. 
-  *[[http://vba-help.ru|http://vba-help.ru]] -- справочник Visual Basic for Applications 
-  *[[http://www.askit.ru/custom/vba_office/vba_office_plan.htm|http://askit.ru]] - учебный курс «Программирование в Microsoft Office для пользователей». 
-  *[[http://wordexpert.ru|http://wordexpert.ru]]- Профессиональная работа с текстом 
-  * [[http://www.google.com|http://google.com]] 
Актуальные новости, публикации и практики для бизнес-архитекторов и аналитиков
Driven by DokuWiki