Различия

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

Ссылка на это сравнение

ru:creating_user_reports:use_macros_in_reports:examples:table_on_page [2013/10/25 09:39]
— (текущий)
Строка 1: Строка 1:
-====== Таблица на страницу ====== 
  
-===== Текущая ситуация ===== 
- 
-Отчет для разных объектов строится по одному и тому же шаблону. При этом количество страниц выполненных отчетов разных объектов будут отличаться. Это связано с тем, что разные объекты (Процессы, Субъекты) объективно имеют разное количество данных (количество подпроцессов, количество подчинённых). Поэтому могут быть ситуации, когда, например, таблица с подпроцессами для одного процесса будет размещена целиком на одной странице, а для другого -- на 2х или более. 
- 
-===== Постановка задачи ===== 
- 
-В отчете формата Word по процессу необходимо, чтобы таблица с описанием подпроцессов умещалась на одну страницу. При этом допускаемся изменение внешних параметров шрифта. Минимальный допустимый размер шрифта -- 7. 
- 
-В случае невозможности размещения таблицы на одной странице необходимо разместить ее на меньшем количестве страниц. 
- 
-===== Исходные данные ===== 
- 
-Решение описывается с момента, когда уже есть привязка типа "Список" с описанием подпроцессов. Размер шрифта всей таблицы - размер шрифта заголовка таблицы. 
-[{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:tablepage1.png?nolink |Рисунок 1. Вид привязки типа "Список" для отображения данных о подпроцессах}}] 
- 
-Для некоторого процесса таблица с заполненными данными получается более чем на одну страницу. 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:tablepage2.png?nolink }}] 
-[{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:tablepage3.png?nolink |Рисунок 2. Таблица с описанием подпроцессов располагается почти на 2х полных страницах }}] 
-===== Концепция решения ===== 
- 
-Начало таблицы будет определяется по положению указателя в первой левой ячейке таблицы. 
- 
-Для определения конца таблицы добавит в ее конец разрыв раздела (без разрыва страницы). Когда курсор будет находиться в следующем разделе от текущего (где находится таблица), то будем определять номер страницы. Этот номер и будет принимать за номер страницы конца таблицы. 
- 
-Определяя разницу между номерами страниц начала и конца таблицы, будем находить ответ на вопрос: "На 1й странице находится таблица?". 
- 
-Далее изменяем формат текста для всей таблицы до тех пор, пока не получим таблицу на одной странице или не сделаем максимум из доступного. 
- 
-Возможные варианты изменения формата, которые приводят к уменьшению таблицы, в порядке приоритета: 
- 
-  - Уменьшение размера шрифта текста всей таблицы, но не ниже минимально допустимого. 
-  - Изменение величины "Интервал после" до 0 в свойствах Абзаца. 
-  - Автоподбор по содержимому для таблицы. 
- 
-===== Шаги решения ===== 
- 
-Сразу после таблицы добавляем раздел раздела без разрыва страницы: лента "Разметка страниц", группа "Параметры страницы", меню "Разрывы", группа меню "Разрывы разделов" -- пункт "Текущая страница". 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:tablepage4.png?nolink |Рисунок 3. Сразу после таблицы добавили разрыв раздела}}] 
- 
-Для более точного определения конца таблицы уменьшим размер шрифта в первых двух строках после таблицы до 1. Это так же заденет и метку разрыва раздела. 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:table_on_page:tablepage5.png?nolink |Рисунок 4. Высоту строк после таблицы уменьшили до 1}}] 
- 
-Определяем название привязки типа "Список", которая представляет нужную таблицу (см. [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список ]]). 
-<code vb> 
- 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:tablepage6.png?nolink |Рисунок 5. Результат выполнения отчета -- таблица на одной странице }}] 
Driven by DokuWiki