Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:two_tasks [2013/10/17 12:04] belkin [Исходные данные] |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Решение 2-х задач в одном макросе ====== | ||
- | В отчете формата Word по всем субъектам необходимо решить 2 задачи: | ||
- | |||
- | - Добавить в указанную таблицу с пустой ячейкой текст. | ||
- | - Сделать сортировку в указанном таблице. | ||
- | |||
- | ===== Задача "Вставка текста в пустую ячейку" ==== | ||
- | |||
- | ==== Текущая ситуация ==== | ||
- | |||
- | Бывают ситуации, когда необходимо выводить значения некоторых параметров у объектов. При этом значения некоторых из этих параметров могут быть не заполнены. В свойствах объектов это видно и понятно, а в отчетах может быть не столь очевидным. Поэтому, будет полезно вместо пустого значения выводить какое-то пояснение. | ||
- | |||
- | ==== Постановка задачи ==== | ||
- | |||
- | В таблице, в которой выводится количество должностей по категориям, необходимо указать текст "Категория должности не выбрана". | ||
- | |||
- | ==== Исходные данные ==== | ||
- | |||
- | В отчете существует привязка типа "Фильтр", которая выводит информацию о том, какие категории должностей есть у должностей, а также их количество. Так же показывается количество должностей, у которых категория не выбрана. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:two_tasks1.png?nolink |Рисунок 1 -- Вид привязки с кол-вом должностей по категориям в шаблоне отчета}}] | ||
- | |||
- | Для должностей, у которых категория не выбрана, название категории пустое. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:two_tasks2.png?nolink |Рисунок 2 -- Вид привязки, выводящей кол-во должностей по категориям, в выполненном отчете (до решения задачи)}}] | ||
- | |||
- | ==== Концепция решения ==== | ||
- | |||
- | Необходимо определить длину текста для каждой ячейки 2го столбца таблицы. Если длина 2 символа (т.е. только 2 служебных символа), то в эту ячейку необходимо вставить указанный текст. | ||
- | |||
- | ===== Задача "Сортировка таблицы" ===== | ||
- | |||
- | ==== Текущая ситуация ==== | ||
- | |||
- | Управлять отображением данных можно как в фильтрах, так и в настройках привязок. Например, сортировку можно указать для списков как в фильтре, так и в настройках сложной привязки -- задав направление сортировки и параметр, по которому будет происходить сортировка. При этом, бывают случаи, когда для вывода информации используется несколько фильтров и задание направления сортировки средствами Business Studio невозможно. | ||
- | |||
- | ==== Постановка задачи ==== | ||
- | |||
- | В таблице, которая выводит информацию о количестве процессов, с которыми связаны должности, необходимо сделать сортировку по столбцу с количеством процессов -- от наибольшего к наименьшему. | ||
- | |||
- | ==== Исходные данные ==== | ||
- | |||
- | В отчете существует привязка типа "Фильтр", которая выводит список должностей, имеющих хотя бы одну связь с процессами. В параметрах этой привязки задана другая привязка типа "Фильтр", которая выводит количество должностей, с которыми связана конкретная должность. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:two_tasks3.png?nolink |Рисунок 3 -- Вид привязки, выводящей кол-во процессов у должностей, в окне "Привязки отчета"}}] | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:two_tasks4.png?nolink |Рисунок 4 -- Вид привязки, выводящей кол-во процессов у должностей, в шаблоне отчета}}] | ||
- | |||
- | Установка задание условий сортировки по каким-либо параметрам не дает ожидаемый результат -- сортировку по количеству процессов должностей. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:two_tasks5.png?nolink |Рисунок 5 -- Вид привязки, выводящей кол-во процессов у должностей, в выполненном отчете (до решения задачи)}}] | ||
- | |||
- | ==== Концепция решения ==== | ||
- | |||
- | В Word имеется функционал для сортировки данных в таблицах (лента "Макет"). Мы сделаем то же самое, но кодом VBA. | ||
- | |||
- | Для ситуации, когда у разных должностей будет одинаковое количество процессов, необходимо будет сделать так сортировку должностей по алфавиту. Это будет второй столбец сортировки. Будет считать, что она находится перед столбцом с количеством процессов. | ||
- | |||
- | После проведенной сортировки столбец с нумерацией не будет соответствовать действительности. Поэтому, необходимо для каждой ячейки этого столбца проставить последовательную нумерацию. | ||
- | |||
- | ===== Шаги решения ===== | ||
- | |||
- | - Согласно описанным концепциям решения, для каждой задачи реализуем свой код. Код каждой задачи оформим независимо друг от друга отдельными макросами. | ||
- | - В макросе "ПослеВыполненияОтчета" лишь сделаем вызов каждого макроса по очереди. | ||
- | - Общими для обоих макросов задач будет являться проверка наличия закладки (привязки) в отчете. Поэтому эту задачу реализуем через функцию. Вызов этой функции будет из каждого макроса задач. | ||
- | |||
- | <code vb> | ||
- | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
- | |||
- | Call AddTextCleanRow | ||
- | Call Sorting | ||
- | |||
- | End Sub | ||
- | |||
- | |||
- | |||
- | Sub AddTextCleanRow() | ||
- | |||
- | 'Макрос добавляет поясняющий текст в пустые строки таблиц | ||
- | 'по типам подразделений и категориям должностей | ||
- | |||
- | 'ВВОДНАЯ ЧАСТЬ | ||
- | Dim BookmarkName As String 'название привязки нужной таблицы | ||
- | BookmarkName = "Количество_субъектов_по__c209c161" | ||
- | |||
- | Dim NeedColumn As Integer 'номер столбца где пустая ячейка | ||
- | NeedColumn = 2 | ||
- | |||
- | Dim TypeSubjectTextIns As String 'текст для вставки | ||
- | TypeSubjectTextIns = "(Категория должности не указана)" | ||
- | |||
- | 'Служебные переменные | ||
- | Dim TypeSubjectTable As Table | ||
- | Dim RangeCell As Range | ||
- | |||
- | 'ПРОЦЕДУРНАЯ ЧАСТЬ | ||
- | |||
- | If BookmarkIs(BookmarkName) Then 'если в документе закладка есть | ||
- | |||
- | 'получаем таблицу по названию привязки | ||
- | Set TypeSubjectTable = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1) | ||
- | |||
- | countRow = TypeSubjectTable.Rows.Count 'количество строк таблицы | ||
- | |||
- | For i = 2 To countRow 'проходимся по всем строкам таблицы | ||
- | |||
- | On Error Resume Next 'игнор error 5991, если какие-то ячейки имеют вертикальное объединение | ||
- | |||
- | Set RangeCell = TypeSubjectTable.Cell(i, NeedColumn).Range 'нужная ячейка | ||
- | |||
- | If Len(RangeCell.Text) = 2 Then 'если в ячейке только 2 служебных символа, т.е. ячейка пустая | ||
- | |||
- | 'меняем текст в ячейке | ||
- | RangeCell.Select | ||
- | Selection.SelectCell | ||
- | RangeCell.Text = TypeSubjectTextIns | ||
- | |||
- | End If | ||
- | |||
- | Next i | ||
- | |||
- | End If | ||
- | |||
- | End Sub | ||
- | |||
- | |||
- | |||
- | Sub Sorting() | ||
- | |||
- | 'Макрос производит сортировку данных в нужных полях | ||
- | 'Сортировка по количеству по убыванию | ||
- | |||
- | 'ВВОДНАЯ | ||
- | |||
- | 'Задаем ключевые значения | ||
- | Dim BookmarkName As String | ||
- | BookmarkName = "Колво_процессов_у_Должно_30007b7b" | ||
- | |||
- | Dim ColumnFirst As Integer 'номера столбца для первой сортировки | ||
- | ColumnFirst = 3 | ||
- | |||
- | 'Служебные переменные | ||
- | Dim SortingTable As Table | ||
- | Dim TextNumber As String | ||
- | |||
- | 'ПРОЦЕДУРНАЯ ЧАСТЬ | ||
- | |||
- | If BookmarkIs(BookmarkName) Then 'если в документе закладка есть | ||
- | |||
- | 'получаем таблицу по названию привязки | ||
- | Set SortingTable = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1) | ||
- | |||
- | 'Сортируем таблицу | ||
- | 'Сначала по столбцу с количество процессов - по убыванию | ||
- | 'Затем по столбцу с название должностей - по алфавиту | ||
- | SortingTable.Sort _ | ||
- | ExcludeHeader:=True, _ | ||
- | FieldNumber:="столбцам " & Str(ColumnFirst), _ | ||
- | SortFieldType:=wdSortFieldNumeric, _ | ||
- | SortOrder:=wdSortOrderDescending, _ | ||
- | FieldNumber2:="столбцам " & Str(ColumnFirst - 1), _ | ||
- | SortFieldType2:=wdSortFieldAlphanumeric, _ | ||
- | SortOrder2:=wdSortOrderAscending | ||
- | |||
- | 'Приводим в порядок нумерацию | ||
- | countRow = SortingTable.Rows.Count 'количество строк таблицы | ||
- | |||
- | For i = 2 To countRow | ||
- | |||
- | TextNumber = Str(i - 1) + "." 'формируем номер | ||
- | TextNumber = Right$(TextNumber, Len(TextNumber) - 1) 'убираем первый пробел | ||
- | |||
- | SortingTable.Cell(i, 1).Range.Text = TextNumber 'вставляем номер | ||
- | |||
- | Next i | ||
- | |||
- | End If | ||
- | |||
- | 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 | ||
- | |||
- | </code> | ||
- | |||
- | ===== Результат ===== | ||
- | |||
- | ==== Результат задачи "Вставка текста в пустую ячейку" ==== | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:two_tasks6.png?nolink |Рисунок 6 -- Вид привязки, выводящей кол-во должностей по категориям, в выполненном отчете (после решения задачи)}}] | ||
- | |||
- | ==== Результат "Сортировка таблицы" ==== | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:two_tasks7.png?nolink |Рисунок 7 -- Вид привязки, выводящей кол-во процессов у должностей, в выполненном отчете (после решения задачи)}}] |