Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:examples:table_on_page [2020/07/03 15:15] 127.0.0.1 внешнее изменение |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Таблица на страницу ====== | ||
- | |||
- | ===== Текущая ситуация ===== | ||
- | |||
- | Отчет для разных объектов строится по одному и тому же шаблону. При этом количество страниц выполненных отчетов разных объектов будут отличаться. Это связано с тем, что разные объекты (Процессы, Субъекты) объективно имеют разное количество данных (количество подпроцессов, количество подчинённых). Поэтому могут быть ситуации, когда, например, таблица с подпроцессами для одного процесса будет размещена целиком на одной странице, а для другого -- на 2х или более. | ||
- | |||
- | ===== Постановка задачи ===== | ||
- | |||
- | В отчете формата Word по процессу необходимо, чтобы таблица с описанием подпроцессов умещалась на одну страницу. При этом допускается изменение внешних параметров шрифта. Минимальный допустимый размер шрифта - 7. | ||
- | |||
- | В случае невозможности размещения таблицы на одной странице необходимо разместить ее на меньшем количестве страниц. | ||
- | |||
- | ===== Исходные данные ===== | ||
- | |||
- | Решение описывается с момента, когда уже есть привязка типа "Список" с описанием подпроцессов. Размер шрифта всей таблицы - размер шрифта заголовка таблицы. | ||
- | [{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:lang_tablepage1.png?nolink |Рисунок 1. Вид привязки типа "Список" для отображения данных о подпроцессах}}] | ||
- | |||
- | Для некоторого процесса таблица с заполненными данными получается более чем на одну страницу. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:lang_tablepage2.png?nolink }}] | ||
- | [{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:lang_tablepage3.png?nolink |Рисунок 2. Таблица с описанием подпроцессов располагается почти на 2х полных страницах }}] | ||
- | |||
- | ===== Концепция решения ===== | ||
- | |||
- | Начало таблицы будем определять по положению указателя в первой левой ячейке таблицы. | ||
- | |||
- | Для определения конца таблицы добавим в ее конец разрыв раздела (без разрыва страницы). Когда курсор будет находиться в следующем разделе от текущего (где находится таблица), то будем определять номер страницы. Этот номер и будет принимать за номер страницы конца таблицы. | ||
- | |||
- | Определяя разницу между номерами страниц начала и конца таблицы, будем находить ответ на вопрос: "На 1й странице находится таблица?". | ||
- | |||
- | Далее изменяем формат текста для всей таблицы до тех пор, пока не получим таблицу на одной странице или не сделаем максимум из доступного. | ||
- | |||
- | Возможные варианты изменения формата, которые приводят к уменьшению таблицы, в порядке приоритета: | ||
- | |||
- | - Уменьшение размера шрифта текста всей таблицы, но не ниже минимально допустимого. | ||
- | - Изменение величины "Интервал после" до 0 в свойствах Абзаца. | ||
- | - Автоподбор по содержимому для таблицы. | ||
- | |||
- | ===== Шаги решения ===== | ||
- | |||
- | Сразу после таблицы добавляем разрыв раздела без разрыва страницы: лента "Разметка страниц", группа "Параметры страницы", меню "Разрывы", группа меню "Разрывы разделов" -- пункт "Текущая страница". | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:lang_tablepage4.png?nolink |Рисунок 3. Сразу после таблицы добавили разрыв раздела}}] | ||
- | |||
- | Для более точного определения конца таблицы уменьшим размер шрифта в первых двух строках после таблицы до 1. Это так же заденет и метку разрыва раздела. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:lang_tablepage5.png?nolink |Рисунок 4. Высоту строк после таблицы уменьшили до 1}}] | ||
- | |||
- | Определяем название привязки типа "Список", которая представляет нужную таблицу (см. [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список|Пример определения названия привязки типа "Список"]]). | ||
- | <code> | ||
- | 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 | ||
- | |||
- | </code> | ||
- | |||
- | ===== Результат ===== | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:lang_tablepage6.png?nolink |Рисунок 5. Результат выполнения отчета -- таблица на одной странице }}] | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | [<contextnavigator>] | ||
- | |||