В отчете формата Word по всем оргединицам необходимо решить 2 задачи:
Бывают ситуации, когда необходимо выводить значения некоторых параметров у объектов. При этом значения некоторых из этих параметров могут быть не заполнены. В свойствах объектов это видно и понятно, а в отчетах может быть не столь очевидным. Поэтому будет полезно вместо пустого значения выводить какое-то пояснение.
В таблице, в которой выводится количество должностей по категориям, необходимо указать текст "Категория должности не выбрана".
В отчете существует привязка типа "Фильтр", которая выводит информацию о том, какие категории должностей есть у должностей, а также их количество. Так же показывается количество должностей, у которых категория не выбрана.
Для должностей, у которых категория не выбрана, название категории пустое.
Необходимо определить длину текста для каждой ячейки 2го столбца таблицы. Если длина 2 символа (т.е. только 2 служебных символа), то в эту ячейку необходимо вставить указанный текст.
Управлять отображением данных можно как в фильтрах, так и в настройках привязок. Например, сортировку можно указать для списков как в фильтре, так и в настройках сложной привязки, задав направление сортировки и параметр, по которому будет происходить сортировка. При этом, бывают случаи, когда для вывода информации используется несколько фильтров и задание направления сортировки средствами Business Studio невозможно.
В таблице, которая выводит информацию о количестве процессов, с которыми связаны должности, необходимо сделать сортировку по столбцу с количеством процессов – от наибольшего к наименьшему.
В отчете существует привязка типа "Фильтр", которая выводит список должностей, имеющих хотя бы одну связь с процессами. В параметрах этой привязки задана другая привязка типа "Фильтр", которая выводит количество должностей, с которыми связана конкретная должность.
Установка задания условий сортировки по каким-либо параметрам не дает ожидаемый результат – сортировку по количеству процессов должностей.
В Word имеется функционал для сортировки данных в таблицах (лента "Макет"). Мы сделаем тоже самое, но кодом VBA.
Для ситуации, когда у разных должностей будет одинаковое количество процессов, необходимо будет сделать сортировку должностей по алфавиту. Это будет второй столбец сортировки. Будем считать, что она находится перед столбцом с количеством процессов.
После проведенной сортировки столбец с нумерацией не будет соответствовать действительности. Поэтому необходимо для каждой ячейки этого столбца проставить последовательную нумерацию.
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