Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:work_in_macros [2013/10/16 16:11] admin [Отладка кода] |
ru:creating_user_reports:use_macros_in_reports:work_in_macros [2017/10/16 15:07] (текущий) |
||
---|---|---|---|
Строка 5: | Строка 5: | ||
В Microsoft Word 2007 это осуществляется следующей последовательностью действий: | В Microsoft Word 2007 это осуществляется следующей последовательностью действий: | ||
- | *нажать кнопку {{ru/use_macros_in_reports/use_macros_in_reports/macros_in_report_1418.png?34x35&nolink}} Office в верхнем левом углу, нажать кнопку "Параметры Word"; | + | *нажать кнопку {{ru/creating_user_reports/use_macros_in_reports/macros_in_report_1418.png?34x35&nolink}} Office в верхнем левом углу, нажать кнопку "Параметры Word"; |
*выбрать закладку "Центр управления безопасностью", нажать кнопку "Параметры центра управления безопасностью"; | *выбрать закладку "Центр управления безопасностью", нажать кнопку "Параметры центра управления безопасностью"; | ||
*выбрать закладку "Параметры макросов", в разделе "Параметры макросов для разработчика" установить опцию "Доверять доступ к объектной модели проектов VBA". | *выбрать закладку "Параметры макросов", в разделе "Параметры макросов для разработчика" установить опцию "Доверять доступ к объектной модели проектов VBA". | ||
- | В Microsoft Word 2010: | + | В Microsoft Word 2010/2013/2016: |
*выбрать пункт меню "Файл -> Параметры…"; | *выбрать пункт меню "Файл -> Параметры…"; | ||
Строка 17: | Строка 17: | ||
== Примечание == | == Примечание == | ||
VBA - Visual Basic for Applications (Visual Basic для приложений) - упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office. | VBA - Visual Basic for Applications (Visual Basic для приложений) - упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office. | ||
- | ====== ====== | + | ==== ==== |
===== Начало создания макроса ===== | ===== Начало создания макроса ===== | ||
Строка 30: | Строка 31: | ||
* В окне "Project -- TemplateProject" в дереве открыть узел "TemplateProject - Microsoft Word Objects -- ThisDocument"; | * В окне "Project -- TemplateProject" в дереве открыть узел "TemplateProject - Microsoft Word Objects -- ThisDocument"; | ||
- | * В правой части окна приложения, где приведен код будет макрос "ПослеВыполненияОтчета". | + | * В правой части окна приложения, где приведен код, будет макрос "ПослеВыполненияОтчета". |
[{{ ru:creating_user_reports:use_macros_in_reports:startvbaword.png?nolink |Рисунок 1. Вид окна среды VBA при работе с макросом для отчетов формата Word}}] | [{{ ru:creating_user_reports:use_macros_in_reports:startvbaword.png?nolink |Рисунок 1. Вид окна среды VBA при работе с макросом для отчетов формата Word}}] | ||
+ | Если макроса там не будет, его можно создать самостоятельно, введя в данном окне строки начала и конца макроса, а между ними - сам текст макроса: | ||
+ | |||
+ | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
+ | |||
+ | <Текст макроса> | ||
+ | |||
+ | End Sub | ||
== Внимание! == | == Внимание! == | ||
Строка 44: | Строка 52: | ||
* на закладке "Основные" в разделе "Основные параметры работы с Word" установить опцию "Показывать вкладку "Разработчик" на ленте" | * на закладке "Основные" в разделе "Основные параметры работы с Word" установить опцию "Показывать вкладку "Разработчик" на ленте" | ||
- | ====== ====== | + | ==== ==== |
==== Макрос для отчетов формата Excel ==== | ==== Макрос для отчетов формата Excel ==== | ||
- | Для того, чтобы создать или просмотреть макрос для отчета формата Excel необходимо: | + | Для того, чтобы создать или просмотреть макрос для отчета формата Excel, необходимо: |
* открыть отчет в Мастере отчетов; | * открыть отчет в Мастере отчетов; | ||
Строка 71: | Строка 79: | ||
* на закладке "Основные" в разделе "Основные параметры работы с Excel" установить опцию "Показывать вкладку "Разработчик" на ленте" | * на закладке "Основные" в разделе "Основные параметры работы с Excel" установить опцию "Показывать вкладку "Разработчик" на ленте" | ||
- | ====== ====== | + | ==== ==== |
===== Макрос "ПослеВыполненияОтчета" ===== | ===== Макрос "ПослеВыполненияОтчета" ===== | ||
Строка 77: | Строка 85: | ||
Любой отчет изначально содержит следующий макрос: | Любой отчет изначально содержит следующий макрос: | ||
- | <code vb> | + | <code> |
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
Строка 87: | Строка 95: | ||
</code> | </code> | ||
- | Этот макрос будет запускаться после вставки данных в отчет. Он используется в отчетах шаблонной базы данных, поставляемой с программой. Код по обработке отчета следует вставлять в этот макрос. | + | Этот макрос будет запускаться после вставки данных в отчет. Он используется в отчетах баз данных, поставляемых с программой. Код по обработке отчета следует вставлять в этот макрос. |
Переменные, которые передаются в макрос: | Переменные, которые передаются в макрос: | ||
Строка 98: | Строка 106: | ||
Просмотреть объектную модель Word для разработки макросов в редакторе Visual Basic можно по клавише F2. | Просмотреть объектную модель Word для разработки макросов в редакторе Visual Basic можно по клавише F2. | ||
- | ====== ====== | + | ==== ==== |
===== Название привязки для макроса ===== | ===== Название привязки для макроса ===== | ||
Строка 104: | Строка 112: | ||
При решении ряда задач средствами программирования бывает удобно оперировать данными привязок отчета. Для этого необходимо: | При решении ряда задач средствами программирования бывает удобно оперировать данными привязок отчета. Для этого необходимо: | ||
- | - Знать названия привязки. | + | - Знать название привязки. |
- Связать переменные в коде VBA с этим названием. | - Связать переменные в коде VBA с этим названием. | ||
- | Ниже представлено как это это делается для разного типа привязок. | + | Ниже описано, как это это делается для привязок разных типов. |
**Тип привязки: Объект** | **Тип привязки: Объект** | ||
Строка 113: | Строка 121: | ||
В отчете такие привязки представлены полями. | В отчете такие привязки представлены полями. | ||
- | Узнать название в шаблоне отчета: см. [[ru/manual/report/insert_anchor]], статья [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект | Пример определения названия привязки типа "Объект"]]. | + | Узнать название в шаблоне отчета: см. статью [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект|Пример определения названия привязки типа "Объект"]]. |
Использование названия привязки в коде: | Использование названия привязки в коде: | ||
- | <code vb> | + | <code> |
ПеременнаяВКоде = Application.ActiveDocument.Variables.Item("НазваниеПривязки").Value | ПеременнаяВКоде = Application.ActiveDocument.Variables.Item("НазваниеПривязки").Value | ||
Строка 127: | Строка 135: | ||
В отчете такие привязки представлены таблицей. | В отчете такие привязки представлены таблицей. | ||
- | Узнать название в шаблоне отчета: см. [[ru/manual/report/insert_anchor]], статья [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список |Пример определения названия привязки типа "Список"]]. | + | Узнать название в шаблоне отчета: см. статью [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список|Пример определения названия привязки типа "Список"]]. |
Использование названия привязки в коде: | Использование названия привязки в коде: | ||
- | <code vb> | + | <code> |
Set ТаблицДляОбработки = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1) | Set ТаблицДляОбработки = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1) | ||
Строка 140: | Строка 148: | ||
===== Работа с таблицами ===== | ===== Работа с таблицами ===== | ||
- | Отчеты Business Studio имеют четкую структуру и в них присутствует множество таблиц. Поэтому высока вероятность того, что основные задачи будут связаны с их обработкой. | + | В отчетах Business Studio присутствует большое количество таблиц. Поэтому высока вероятность того, что основные задачи будут связаны с их обработкой. |
Примеры ключевых функций, которые будут полезны при работы с таблицами, приведены ниже. | Примеры ключевых функций, которые будут полезны при работы с таблицами, приведены ниже. | ||
Строка 146: | Строка 154: | ||
**Работа с таблицей через название привязки** | **Работа с таблицей через название привязки** | ||
- | <code vb> | + | <code> |
'переменная для работы с конкретной таблицей | 'переменная для работы с конкретной таблицей | ||
Set Table = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1) | Set Table = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1) | ||
Строка 160: | Строка 168: | ||
**Работа с таблицей через её номер в документе** | **Работа с таблицей через её номер в документе** | ||
- | <code vb> | + | <code> |
сountTables = ActiveDocument.Tables.Count 'количество таблиц в документе | сountTables = ActiveDocument.Tables.Count 'количество таблиц в документе | ||
Строка 178: | Строка 186: | ||
* Таблицы могут содержать объединенные ячейки. В случае перебора всех строк таблицы может возникнуть ошибка. Чтобы этого не было, необходимо использовать команду игнорирования ошибки: | * Таблицы могут содержать объединенные ячейки. В случае перебора всех строк таблицы может возникнуть ошибка. Чтобы этого не было, необходимо использовать команду игнорирования ошибки: | ||
- | <code vb> | + | <code> |
On Error Resume Next ' игнорирование <error 5991> - ячейки таблицы имеют вертикальное объединение | On Error Resume Next ' игнорирование <error 5991> - ячейки таблицы имеют вертикальное объединение | ||
Строка 185: | Строка 193: | ||
* При получении текста таблицы следует помнить, что полученное значение ячейки так же содержит в себе 2 служебных символа. Для обработки данных ячейки без этих служебных символов следует произвести «очистку» значения. Например: | * При получении текста таблицы следует помнить, что полученное значение ячейки так же содержит в себе 2 служебных символа. Для обработки данных ячейки без этих служебных символов следует произвести «очистку» значения. Например: | ||
- | <code vb> | + | <code> |
СellText = Selection.Tables(1).Cell(3,2).Range.Text 'текст ячейки со служебными символами | СellText = Selection.Tables(1).Cell(3,2).Range.Text 'текст ячейки со служебными символами | ||
Строка 193: | Строка 201: | ||
</code> | </code> | ||
- | Приведенная выше информация является не полной для работы с таблицами, а лишь обращает внимание на наиболее возможные ситуации. | + | Приведенная выше информация не является полной для работы с таблицами, а лишь обращает внимание на наиболее возможные ситуации. |
===== Определение направления формирования отчета ===== | ===== Определение направления формирования отчета ===== | ||
Строка 199: | Строка 208: | ||
* одиночный документ Word или Excel или несколько документов, | * одиночный документ Word или Excel или несколько документов, | ||
- | * HTML-публикатор, | + | * HTML-публикация, |
* Business Studio Portal. | * Business Studio Portal. | ||
- | При рассмотрение такого отчета в разных местах есть свои нюансы. Например, отчеты в HTML-публикаторе и Business Studio Portal не содержат колонтитулов, которые есть в отчете, сделанным отдельным документом Word. | + | При рассмотрение такого отчета в разных местах есть свои нюансы. Например, отчеты в HTML-публикации и Business Studio Portal не содержат колонтитулов, которые есть в отчете, сделанным отдельным документом Word. |
- | Аналогичным образом могут быть и разные задачи по обработке отчета кодом в зависимости от направления формирования отчета. Для определения направления формирования отчета используются параметры: BSInThread, BSHtml и BSPortal. | + | Также могут быть и разные задачи по обработке отчета кодом в зависимости от направления формирования отчета. Для определения направления формирования отчета используются параметры: BSInThread, BSHtml и BSPortal. |
<startTableBox> | <startTableBox> | ||
- | ^ Направление формирования отчета ^ BSInThread ^BSHtml ^BSPortal ^ | + | ^ Направление формирования отчета ^ BSInThread ^ BSHtml ^ BSPortal ^ |
| Одиночный файл (Word, Excel) | False | False | False | | | Одиночный файл (Word, Excel) | False | False | False | | ||
| Пакетное формирование (Word, Excel) | True | False | False | | | Пакетное формирование (Word, Excel) | True | False | False | | ||
Строка 215: | Строка 224: | ||
Пример использования в коде: | Пример использования в коде: | ||
- | <code vb> | + | <code> |
Dim HTMLCreate As Boolean | Dim HTMLCreate As Boolean | ||
Строка 233: | Строка 242: | ||
== Примечание == | == Примечание == | ||
- | При формировании отчета типа HTML (HTML-портал, Business Studio Portal) так же происходит формирование и отдельного файла типа Word. | + | При формировании отчета типа HTML (HTML-публикация, Business Studio Portal) так же происходит формирование и отдельного файла типа Word. |
- | ====== ====== | + | ==== ==== |
===== Работа со ссылками в отчетах для HTML ===== | ===== Работа со ссылками в отчетах для HTML ===== | ||
- | При обработке кодом VBA отчета, сформированного для HTML-публикатора или Business Studio Portal, следует помнить, что после формирования отчета представляет собой отображение не тех данных, что видны в браузере, а документ с показом кодов полей. Это не позволяет вести обработку гиперссылок. | + | При обработке кодом VBA отчета, сформированного для HTML-публикации или Business Studio Portal, следует помнить, что после формирования отчет представляет собой отображение не тех данных, что видны в браузере, а документ с показом кодов полей. Это не позволяет вести обработку гиперссылок. |
Для "нормализации" отображения данных следует сначала использовать следующий код: | Для "нормализации" отображения данных следует сначала использовать следующий код: | ||
<codevb> | <codevb> | ||
- | |||
ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды полей, а значения | ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды полей, а значения | ||
- | |||
</code> | </code> | ||
Строка 261: | Строка 269: | ||
**Пример проверки наличия привязки типа "Список".** В документе это закладки. | **Пример проверки наличия привязки типа "Список".** В документе это закладки. | ||
- | Определяем название привязки типа "Список", которая представляет нужную таблицу. (см. [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список ]]) | + | Определяем название привязки типа "Список", которая представляет нужную таблицу (см. [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список|Пример определения названия привязки типа "Список"]]). |
- | <code vb> | + | <code> |
BookmarkName = "Изменения_процесса_e1ded8b0" 'название привязки | BookmarkName = "Изменения_процесса_e1ded8b0" 'название привязки | ||
Строка 296: | Строка 304: | ||
**Пример проверки наличия привязки типа Объект** | **Пример проверки наличия привязки типа Объект** | ||
- | Определяем название привязки типа "Объект", которая представляет нужное поле в отчёте. (см. [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект]]) | + | Определяем название привязки типа "Объект", которая представляет нужное поле в отчёте (см. статью [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_объект|Пример определения названия привязки типа "Объект"]]). |
- | <code vb> | + | <code> |
VarName = "Статус_процесса_c9a10e8d" 'название привязки | VarName = "Статус_процесса_c9a10e8d" 'название привязки | ||
Строка 326: | Строка 334: | ||
</code> | </code> | ||
- | == Примечание == | + | == Примечание == |
Закладки, не относящиеся к привязкам, например, созданные пользователем самостоятельно, при копировании отчетов не изменяются. | Закладки, не относящиеся к привязкам, например, созданные пользователем самостоятельно, при копировании отчетов не изменяются. | ||
- | ====== ====== | + | ==== ==== |
===== Обращение к данным из базы ===== | ===== Обращение к данным из базы ===== | ||
Строка 337: | Строка 345: | ||
- Через использование механизма OLE. | - Через использование механизма OLE. | ||
- | ====Обращение к параметрам объекта==== | + | ==== Обращение к параметрам объекта ==== |
Обращение к параметрам объекта, от которого был вызван отчет, происходит таким образом: | Обращение к параметрам объекта, от которого был вызван отчет, происходит таким образом: | ||
Строка 346: | Строка 355: | ||
* "ob" - объект, от которого был вызван отчет; | * "ob" - объект, от которого был вызван отчет; | ||
- | * <СистемноеНазваниеПараметра> − это системное название параметра объекта, которое можно просмотреть в Объектной модели (см. [[ru/manual/report/object_model]]). | + | * <СистемноеНазваниеПараметра> − это системное название параметра объекта, которое можно просмотреть в **Объектной модели** (см. [[ru/manual/manual]] -> [[ru/manual/report/object_model]]). |
Например, при выводе отчета от процесса получить данные названия процесса можно таким образом: | Например, при выводе отчета от процесса получить данные названия процесса можно таким образом: | ||
- | <code vb> | + | <code> |
Name = ob.Название 'получаем Название объекта, от которого вызвали отчет | Name = ob.Название 'получаем Название объекта, от которого вызвали отчет | ||
Строка 356: | Строка 365: | ||
</code> | </code> | ||
- | ====Использование механизма OLE==== | + | ==== Использование механизма OLE ==== |
- | Механизм OLE предоставляет более широкие возможности по обращению к данным бизнес-модели и выводу этих данных в отчетах по сравнению с обращению просто как данным объекта, от которого был вызван отчет. | + | Механизм OLE предоставляет более широкие возможности по обращению к данным бизнес-модели и выводу этих данных в отчетах по сравнению с обращением просто как данным объекта, от которого был вызван отчет. |
- | Описание механизма OLE подробно описано в главе [[ru/technical_manual/work_via_ole]]. | + | Описание механизма OLE подробно описано в главе [[ru/technical_manual/technical_manual]] -> [[ru/technical_manual/work_via_ole]]. |
Для задействования OLE в отчетах конкретной базы нет необходимости во включении опции "Разрешено использование OLE". | Для задействования OLE в отчетах конкретной базы нет необходимости во включении опции "Разрешено использование OLE". | ||
- | ==Внимание! == | + | == Внимание! == |
- | В отчетах при работе с OLE недоступны все методы класса "Система.OleApplication". Поскольку в макросе "ПослеВыполненияОтчета" есть аргумент "app", который является приложением Business Studio, а не "Система.OleApplication". | + | В отчетах при работе с OLE недоступны все методы класса "Система.OleApplication", поскольку в макросе "ПослеВыполненияОтчета" есть аргумент "app", который является приложением Business Studio, а не "Система.OleApplication". |
- | ===== ===== | + | ==== ==== |
===== Несколько задач в одном макросе ===== | ===== Несколько задач в одном макросе ===== | ||
Бывают ситуации, когда: | Бывают ситуации, когда: | ||
- В рамках одного отчета необходимо решить более чем одну задачу. Например, форматирование полей типа RTF и вставка столбца в таблицу. | - В рамках одного отчета необходимо решить более чем одну задачу. Например, форматирование полей типа RTF и вставка столбца в таблицу. | ||
- | - Одну и ту же задачу необходимо применять к разным отчетам. Для этого необходимо скопировать код VBA, который решает поставленную задачу. И будет удобней если этот код не пересекается с кодами других задач. | + | - Одну и ту же задачу необходимо применять к разным отчетам. Для этого необходимо скопировать код VBA, который решает поставленную задачу. И будет удобней, если этот код не пересекается с кодами других задач. |
- Отладку кода удобно вести по одной из задач, на время отключив выполнение других задач. | - Отладку кода удобно вести по одной из задач, на время отключив выполнение других задач. | ||
- | В таких случаях каждую решаемую задачу удобно оформлять отдельным макросом. А в ключевом макросе "ПослеВыполненияКода" лишь вызывать по очереди нужные макросы. Все эти макросы оформляются в том же окне, где и ключевой макрос и делается так: | + | В таких случаях каждую решаемую задачу удобно оформлять отдельным макросом. А в ключевом макросе "ПослеВыполненияОтчета" лишь вызывать по очереди нужные макросы. Все эти макросы оформляются в том же окне, где и ключевой макрос и делается так: |
- | <code vb> | + | <code> |
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
Строка 393: | Строка 403: | ||
</code> | </code> | ||
- | Если такие макросы имеют одинаковые части кода, то их тоже можно (и рекомендуется) выносить в отдельные макросы или функции в том же окне с ключевым макросом. Например, функция для определения присутствия в отчете необходимой привязки типа список (см. [[#работа_с_копией_отчета_содержащим_макрос|Работа с копией отчета, содержащим макрос]]) может быть следующей: | + | Если такие макросы имеют одинаковые части кода, то их тоже можно (и рекомендуется) выносить в отдельные макросы или функции в том же окне с ключевым макросом. Например, функция для определения присутствия в отчете необходимой привязки типа "Список" (см. [[#работа_с_копией_отчета_содержащим_макрос|Работа с копией отчета, содержащим макрос]]) может быть следующей: |
- | <code vb> | + | <code> |
Function BookmarkIs(BookmarkName As String) As Boolean | Function BookmarkIs(BookmarkName As String) As Boolean | ||
Строка 419: | Строка 429: | ||
Использование этой функции из макроса может быть таким: | Использование этой функции из макроса может быть таким: | ||
- | <code vb> | + | <code> |
Sub MacrosN () | Sub MacrosN () | ||
Строка 432: | Строка 442: | ||
===== Отладка кода ===== | ===== Отладка кода ===== | ||
- | Разработка макроса, как и любая другая работа, это определенный путь, в котором будут допущены ошибки и будет их исправление. Ошибки могут быть обнаружены сразу или не видны при первом взгляде. Более детально в статье [[/ru/creating_user_reports/use_macros_in_reports/debug]]. | + | Разработка макроса, как и любая другая работа, это определенный путь, в котором будут допущены ошибки и будет их исправление. Ошибки могут быть обнаружены сразу или не видны при первом взгляде. Более детально об этом описано в главе [[/ru/creating_user_reports/use_macros_in_reports/debug]]. |
+ | |||
+ | ===== Примеры решения задач с использованием макросов ===== | ||
+ | |||
+ | Примеры работы с отчетами при использовании макросов приведены в статье [[/ru/creating_user_reports/use_macros_in_reports/examples]]. | ||
- | =====Примеры решения задач с использованием макросов===== | ||
- | Примеры работы с отчетами при использовании макросов приведены в статье [[/ru/manual/report/use_macros_in_reports/examples]]. | ||
===== Ресурсы по VBA ===== | ===== Ресурсы по VBA ===== | ||
Строка 442: | Строка 454: | ||
*[[http://msdn.microsoft.com/ru-ru/library/office/ee814737(v=office.14).aspx|http://msdn.microsoft.com]] - Начало работы с VBA в Excel 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]] | * [[https://www.google.ru/?q=vba#q=vba|http://google.com]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | [<contextnavigator>] | ||
+ |