Command disabled: index


Решение 2-х задач в одном макросе

В отчете формата Word по всем оргединицам необходимо решить 2 задачи:

  1. Добавить в указанную таблицу с пустой ячейкой текст.
  2. Сделать сортировку в указанной таблице.

Задача "Вставка текста в пустую ячейку"

Текущая ситуация

Бывают ситуации, когда необходимо выводить значения некоторых параметров у объектов.  При этом значения некоторых из этих параметров могут быть не заполнены. В свойствах объектов это видно и понятно, а в отчетах может быть не столь очевидным. Поэтому будет полезно вместо пустого значения выводить какое-то пояснение.

Постановка задачи

В таблице, в которой выводится количество должностей по категориям, необходимо указать текст "Категория должности не выбрана".

Исходные данные

В отчете существует привязка типа "Фильтр", которая выводит информацию о том, какие категории должностей есть у должностей, а также их количество. Так же показывается количество должностей, у которых категория не выбрана.

Рисунок 1. Вид привязки с кол-вом должностей по категориям в шаблоне отчета

Для должностей, у которых категория не выбрана, название категории пустое.

Рисунок 2. Вид привязки, выводящей кол-во должностей по категориям, в выполненном отчете (до решения задачи)

Концепция решения

Необходимо определить длину текста для каждой ячейки 2го столбца таблицы. Если длина 2 символа (т.е. только 2 служебных символа), то в эту ячейку необходимо вставить указанный текст.

Задача "Сортировка таблицы"

Текущая ситуация

Управлять отображением данных можно как в фильтрах, так и в настройках привязок. Например, сортировку можно указать для списков как в фильтре, так и в настройках сложной привязки, задав направление сортировки и параметр, по которому будет происходить сортировка. При этом, бывают случаи, когда для вывода информации используется несколько фильтров и задание направления сортировки средствами Business Studio невозможно.

Постановка задачи

В таблице, которая выводит информацию о количестве процессов, с которыми связаны должности, необходимо сделать сортировку по столбцу с количеством процессов – от наибольшего к наименьшему.

Исходные данные

В отчете существует привязка типа "Фильтр", которая выводит список должностей, имеющих хотя бы одну связь с процессами. В параметрах этой привязки задана другая привязка типа "Фильтр", которая выводит количество должностей, с которыми связана конкретная должность.

Рисунок 3. Вид привязки, выводящей кол-во процессов у должностей, в окне "Привязки отчета"
Рисунок 4. Вид привязки, выводящей кол-во процессов у должностей, в шаблоне отчета

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

Рисунок 5. Вид привязки, выводящей кол-во процессов у должностей, в выполненном отчете (до решения задачи)

Концепция решения

В Word имеется функционал для сортировки данных в таблицах (лента "Макет"). Мы сделаем тоже самое, но кодом VBA.

Для ситуации, когда у разных должностей будет одинаковое количество процессов, необходимо будет сделать сортировку должностей по алфавиту. Это будет второй столбец сортировки. Будем считать, что она находится перед столбцом с количеством процессов.

После проведенной сортировки столбец с нумерацией не будет соответствовать действительности. Поэтому необходимо для каждой ячейки этого столбца проставить последовательную нумерацию.

Шаги решения

  1. Согласно описанным концепциям решения, для каждой задачи реализуем свой код. Код каждой задачи оформим независимо друг от друга отдельными макросами.
  2. В макросе "ПослеВыполненияОтчета" лишь сделаем вызов каждого макроса по очереди.
  3. Общими для обоих макросов задач будет являться проверка наличия закладки (привязки) в отчете. Поэтому эту задачу реализуем через функцию. Вызов этой функции будет из каждого макроса задач.
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

Результат

Результат задачи "Вставка текста в пустую ячейку"

Рисунок 6. Вид привязки, выводящей кол-во должностей по категориям, в выполненном отчете (после решения задачи)

Результат "Сортировка таблицы"

Рисунок 7. Вид привязки, выводящей кол-во процессов у должностей, в выполненном отчете (после решения задачи)
« ПредыдущаяНа уровень вышеСледующая »
 
Driven by DokuWiki