Это старая версия документа.


Решение 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()
 
сняющий текст в пустые строки таблиц
'по типам подразделенкст в пустые строки таблиц
okmarkName As String 'название привязки нужной татегориям должностей
 
в_по__c209c161" ЧАСТЬ
Dim BookmarkName As String столбца где пустая ячейка
NeedColu нужной таблицы
BookmarkName = "Количество_субъектов_по__c209c161"
 
Dim NeedColumn As Integer еменные
Dim TypeSubjectTable As T пустая ячейка
NeedColumn = 2
 
Dim TypeSubjectTextIns As String  Then 'если в докумевставки
TypeSubjectTextIns = "(Категория должности не указана)"
 
ation.ActiveDocument.Bеременные
Dim TypeSubjectTable As Table
Dim RangeCell As Range
 
bjectTable.Rows.CouАЯ ЧАСТЬ
 
If BookmarkIs(BookmarkName) Then ntRow 'проходимся по всем строказакладка есть
 
    Next 'игнор error 5991, если какие-то яазванию привязки
    Set TypeSubjectTable = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1)
 
    countRow = TypeSubjectTable.Rows.Count  в ячейке только 2 служебнрок таблицы
 
    For i = 2 To countRow ем текст в ячейке
            RangeCстрокам таблицы
 
        On Error Resume Next eCell.Text = TypeSubjectTextIns
 
        End If
 
    Next i
 
End If
 
En вертикальное объединение
 
        Set RangeCell = TypeSubjectTable.Cell(i, NeedColumn).Range Задаем ключевыечейка
 
        If Len(RangeCell.Text) = 2 Then  цессов_у_Должно_30007b7b"
 
Dim ColumnFirst As Integer  'номераимвола, т.е. ячейка пустая
 
            еременные
Dim SortingTa в ячейке
            RangeCell.Select
            Selection.SelectCell
            RangeCell.Text = TypeSubjectTextIns
 
        End If
 
    Next i
 
End If
 
End Sub
 
 
 
Sub Sorting()
 
gTable = Application.ActiveDocument.Bookmarks(Bookmaу данных в нужных полях
таблицу
    'Сначала по столбцу с колиству по убыванию
 
  'Затем НАЯ
 
цу с название должностей -ые значения
Dim BookmarkName As String
BookmarkName = "Колво_процессов_у_Должно_30007b7b"
 
Dim ColumnFirst As Integer  rtFieldNumeric, _
        SortOrder:=wервой сортировки
ColumnFirst = 3
 
олбцам " & Str(ColumnFеременные
Dim SortingTable As Table
Dim TextNumber As String
 
 SortOrder2:=wdSortАЯ ЧАСТЬ
 
If BookmarkIs(BookmarkName) Then ountRow = SortingTable.Rows.Counзакладка есть
 
    r i = 2 To countRow
 
        Teазванию привязки
    Set SortingTable = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1)
 
         
        Sorti таблицу
    ange.Text = TextNumber 'вставляем номер
 
    Next i
 
о процессов - по убыванию
    e As String) As Boolean
 
'Проверка на корректность назолжностей - по алфавиту
    SortingTable.Sort _
        ExcludeHeader:=True, _
        FieldNumber:="столбцам " & Str(ColumnFirst), _
        SortFieldType:=wdSortFieldNumeric, _
        SortOrder:=wdSortOrderDescending, _
        FieldNumber2:="столбцам " & Str(ColumnFirst - 1), _
        SortFieldType2:=wdSortFieldAlphanumeric, _
        Sort

Результат

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

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

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

Рисунок 7 – Вид привязки, выводящей кол-во процессов у должностей, в выполненном отчете (после решения задачи)
Актуальные новости, публикации и практики для бизнес-архитекторов и аналитиков
Driven by DokuWiki