Таблица на страницу

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

Отчет для разных объектов строится по одному и тому же шаблону. При этом количество страниц выполненных отчетов разных объектов будут отличаться. Это связано с тем, что разные объекты (Процессы, Субъекты) объективно имеют разное количество данных (количество подпроцессов, количество подчинённых). Поэтому могут быть ситуации, когда, например, таблица с подпроцессами для одного процесса будет размещена целиком на одной странице, а для другого – на 2х или более.

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

В отчете формата Word по процессу необходимо, чтобы таблица с описанием подпроцессов умещалась на одну страницу. При этом допускается изменение внешних параметров шрифта. Минимальный допустимый размер шрифта - 7.

В случае невозможности размещения таблицы на одной странице необходимо разместить ее на меньшем количестве страниц.

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

Решение описывается с момента, когда уже есть привязка типа "Список" с описанием подпроцессов. Размер шрифта всей таблицы - размер шрифта заголовка таблицы.

Рисунок 1. Вид привязки типа "Список" для отображения данных о подпроцессах

Для некоторого процесса таблица с заполненными данными получается более чем на одну страницу.

Рисунок 2. Таблица с описанием подпроцессов располагается почти на 2х полных страницах

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

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

Для определения конца таблицы добавим в ее конец разрыв раздела (без разрыва страницы). Когда курсор будет находиться в следующем разделе от текущего (где находится таблица), то будем определять номер страницы. Этот номер и будет принимать за номер страницы конца таблицы.

Определяя разницу между номерами страниц начала и конца таблицы, будем находить ответ на вопрос: "На 1й странице находится таблица?".

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

Возможные варианты изменения формата, которые приводят к уменьшению таблицы, в порядке приоритета:

  1. Уменьшение размера шрифта текста всей таблицы, но не ниже минимально допустимого.
  2. Изменение величины "Интервал после" до 0 в свойствах Абзаца.
  3. Автоподбор по содержимому для таблицы.

Шаги решения

Сразу после таблицы добавляем разрыв раздела без разрыва страницы: лента "Разметка страниц", группа "Параметры страницы", меню "Разрывы", группа меню "Разрывы разделов" – пункт "Текущая страница".

Рисунок 3. Сразу после таблицы добавили разрыв раздела

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

Рисунок 4. Высоту строк после таблицы уменьшили до 1

Определяем название привязки типа "Список", которая представляет нужную таблицу (см. Руководство пользователяПример определения названия привязки типа "Список").

 Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)

'Определим направление вывода отчета
Dim HTMLCreate As Boolean
HTMLCreate = Application.ActiveDocument.Variables("BSHtml").Value 'True или False

'Изменять размер таблицы имеет смысл только для файлов Word
If Not (HTMLCreate) Then
            
    'Вводная часть
        
        'название закладки для привязки типа Список, формирующей нужную таблицу
        PodProcBkmName = "Подпроцессы_4244cf23"
        MinFontSize = 7 'минимальный допустимый размер шрифта
        
        
            'Проверка на корректность
            Dim PodProcOk As Boolean
            StatusOk = False 'сначала считаем, что нужной закладки нет
            
            Dim Bkm As Bookmark 'переменная типа Закладка
            
            For Each Bkm In ActiveDocument.Bookmarks
                
                If Bkm.Name = PodProcBkmName Then 'если закладка есть
                
                     
                    PodProcOk = True 'отмечаем, что закладка есть
                    'будем работать с таблицей через закладку
                    Set tablePodProc = Application.ActiveDocument.Bookmarks(PodProcBkmName).Range.Tables(1)
                
                End If
            Next
        
    'Процедурная  часть
    
        If PodProcOk Then
    
            CurrentFontSize = tablePodProc.Cell(1, 1).Range.Font.Size 'текущий размер шрифта
            tablePodProc.Cell(1, 1).Range.Select 'выделяем первую ячейку в первом столбце
    
            'в этой переменной храним номер страницы таблицы
            Dim numberPageTable As Integer
            
            'номер страницы, на которой должна быть таблица целиком
            numberPageTable = Selection.Information(wdActiveEndPageNumber)
    
            'Определеяем конец таблицы
            Selection.GoToNext wdGoToSection 'переходим в следующий раздел
            Dim numberNextSection As Integer 'в этой переменной храним номер страницы конца таблицы
            'номер страницы следующего за таблицей раздела
            numberNextSection = Selection.Information(wdActiveEndPageNumber)
    
            'до тех пор, пока таблица целиком не на 1й странице
            'и пока размер шрифта не минимальный
            Do While (numberNextSection > numberPageTable) _
                And (CurrentFontSize > MinFontSize)
    
                tablePodProc.Select 'выделяем всю таблицу
                Selection.Font.Shrink 'уменьшаем весь ее текст на 1 пункт
    
                CurrentFontSize = CurrentFontSize - 1 'учитываем изменение шрифта
    
                'Определеяем конец таблицы
                Selection.GoToNext wdGoToSection
                numberNextSection = Selection.Information(wdActiveEndPageNumber)
    
            Loop
    
            'Если таблица не на 1й странице - меняем абзац
            If numberNextSection > numberPageTable Then
    
                tablePodProc.Select 'выделяем всю таблицу
    
                'В свойствах Абзаца указывает 0 для Интервала После
                With Selection.ParagraphFormat
                    .SpaceBeforeAuto = False
                    .SpaceAfter = 0
                    .SpaceAfterAuto = False
                    .LineUnitAfter = 0
                End With
    
            End If
    
            'Определяем конец таблицы
            Selection.GoToNext wdGoToSection
            numberNextSection = Selection.Information(wdActiveEndPageNumber)
    
            'Если таблица не на 1й странице - Автоподбор по содержимому страницы
            If numberNextSection > numberPageTable Then
    
                'Автоподбор таблицы по содержимому
                tablePodProc.AutoFitBehavior (wdAutoFitContent)
    
            End If
    
        End If
    
End If
    
End Sub

Результат

Рисунок 5. Результат выполнения отчета – таблица на одной странице
« ПредыдущаяНа уровень вышеСледующая »
Актуальные новости, публикации и практики для бизнес-архитекторов и аналитиков
Driven by DokuWiki