Различия

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

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

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>] 
Driven by DokuWiki