Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:chart_insert [2013/10/17 12:00] belkin |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Вставка диаграммы ====== | ||
- | |||
- | |||
- | ===== Текущая ситуация ===== | ||
- | |||
- | |||
- | |||
- | Для вывода графических схем в отчеты используется привязка типа "Файл". При этом выводится графика, которая уже существует в бизнес-модели (диаграмма процессов, оргструктуры). Не существует привязок, которые бы выводили различные диаграммы на основе цифровых данных бизнес-модели. Для решения подобных задач могут использоваться средства MS Word. | ||
- | |||
- | |||
- | |||
- | ===== Постановка задачи ===== | ||
- | |||
- | |||
- | |||
- | В статическом отчете формата Word необходимо вывести диаграмму с отображением количества непосредственно подчиненных должностей. Исходная информация для построения диаграммы будет представлена в таблице, формируемой привязкой. | ||
- | |||
- | |||
- | |||
- | ===== Исходные данные ===== | ||
- | |||
- | |||
- | |||
- | Решение описывается с момента, когда в шаблоне отчета существует таблица -- привязка типа "Фильтр" с отображением необходимых данных. | ||
- | |||
- | |||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:chart_insert:chart1.png?nolink |Рисунок 1. Вид шаблона отчета}}] | ||
- | |||
- | |||
- | |||
- | ===== Концепция решения ===== | ||
- | |||
- | |||
- | |||
- | На основе таблицы необходимо построить диаграмму. Т.е. необходимо написать код, который вручную делался бы так: | ||
- | |||
- | - Выделить необходимые столбцы таблицы. | ||
- | |||
- | - Лента "Вставка", группа "Иллюстрации", кнопка "Диаграмма". | ||
- | |||
- | - Контекстное меню по диаграмме, меню "Объект Диаграмма", пункт "Изменить" и настроить по своему усмотрению. | ||
- | |||
- | |||
- | |||
- | ===== Шаги решения ===== | ||
- | |||
- | |||
- | |||
- | Все решение сводится к написанию макроса. | ||
- | |||
- | |||
- | |||
- | <code vb> | ||
- | |||
- | |||
- | |||
- | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
- | |||
- | |||
- | |||
- | 'ВВОДНАЯ | ||
- | |||
- | |||
- | |||
- | BookmarkName = "НепосредственныеПодчинен_a5acb153" 'название привязки-таблицы для диаграммы | ||
- | |||
- | Dim ColumnStart As Integer | ||
- | |||
- | ColumnStart = 2 'с какого столбца брать данные (и до конца таблицы) | ||
- | |||
- | Dim TableForChart As Table | ||
- | |||
- | |||
- | |||
- | 'Проверка на корректность названия привязки | ||
- | |||
- | |||
- | |||
- | Dim BookmarkIs As Boolean 'сначала считаем, что нужной закладки нет | ||
- | |||
- | Dim Bkm As Bookmark 'переменная типа Закладка | ||
- | |||
- | |||
- | |||
- | For Each Bkm In ActiveDocument.Bookmarks 'перебираем все закладки в документе | ||
- | |||
- | |||
- | |||
- | If Bkm.Name = BookmarkName Then 'если нашли закладку с нашим именем | ||
- | |||
- | |||
- | |||
- | BookmarkIs = True 'отмечаем, что закладка есть | ||
- | |||
- | 'получаем таблицу по названию привязки | ||
- | |||
- | Set TableForChart = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1) | ||
- | |||
- | End If | ||
- | |||
- | |||
- | |||
- | Next | ||
- | |||
- | |||
- | |||
- | 'ПРОЦЕДУРНАЯ ЧАСТЬ | ||
- | |||
- | |||
- | |||
- | If BookmarkIs Then 'если в документе закладка есть | ||
- | |||
- | |||
- | |||
- | countColumns = TableForChart.Columns.Count 'количество столбцов таблицы | ||
- | |||
- | countRows = TableForChart.Rows.Count ' количество строк таблицы | ||
- | |||
- | |||
- | |||
- | 'Выделяем нужные столбцы таблицы, на основании которых будет создана диаграмма | ||
- | |||
- | |||
- | |||
- | Dim DataColumns As Range | ||
- | |||
- | |||
- | |||
- | With ActiveDocument | ||
- | |||
- | Set DataColumns = .Range(Start:=TableForChart.Cell(1, ColumnStart).Range.Start, _ | ||
- | |||
- | End:=TableForChart.Cell(countRows, countColumns).Range.End) | ||
- | |||
- | DataColumns.Select | ||
- | |||
- | End With | ||
- | |||
- | |||
- | |||
- | WordBasic.InsertChart 'вставляем диаграмму с параметрами, указанными ниже | ||
- | |||
- | |||
- | |||
- | With Application.ActiveDocument | ||
- | |||
- | |||
- | |||
- | For i = 1 To Shapes.Count | ||
- | |||
- | |||
- | |||
- | If (Shapes(i).Type = msoEmbeddedOLEObject) Then | ||
- | |||
- | |||
- | |||
- | Shapes(i).Width = MillimetersToPoints(172.5) 'ширина диаграммы 17.25см | ||
- | |||
- | Selection.ShapeRange.WrapFormat.Type = 3 'обтекание вокруг рамки | ||
- | |||
- | Selection.ShapeRange.Left = wdShapeCenter 'горизонтальное выравнивание - по центру | ||
- | |||
- | |||
- | |||
- | Set gr = Shapes(i).OLEFormat.Object.Application | ||
- | |||
- | gr.Visible = False | ||
- | |||
- | gr.PlotBy = XlRowCol.xlColumns 'данные берутся из колонок | ||
- | |||
- | |||
- | |||
- | With gr.Chart | ||
- | |||
- | |||
- | |||
- | Set axX = .Axes(XlAxisType.xlValue) | ||
- | |||
- | |||
- | |||
- | 'горизонтальные линии сетки-линия-другая (короткий пунктир) | ||
- | |||
- | axX.MajorGridlines.Border.LineStyle = XlLineStyle.xlDot | ||
- | |||
- | |||
- | |||
- | With axX.TickLabels | ||
- | |||
- | .AutoScaleFont = False | ||
- | |||
- | .Font.FontStyle = "полужирный" | ||
- | |||
- | .Font.Size = 12 | ||
- | |||
- | End With | ||
- | |||
- | |||
- | |||
- | Set axY = .Axes(XlAxisType.xlCategory) | ||
- | |||
- | With axY.TickLabels | ||
- | |||
- | .AutoScaleFont = False | ||
- | |||
- | ' .Font.FontStyle = "полужирный" | ||
- | |||
- | .Font.Size = 10 | ||
- | |||
- | .Orientation = xlUpward | ||
- | |||
- | End With | ||
- | |||
- | |||
- | |||
- | .ChartArea.Border.LineStyle = 0 'без рамки для всей области диаграммы | ||
- | |||
- | |||
- | |||
- | 'гистограмма столбиковая, не объемная, столбцы значений рядом | ||
- | |||
- | .ChartType = XlChartType.xlColumnClustered | ||
- | |||
- | |||
- | |||
- | 'цвет фона для столбиков | ||
- | |||
- | '.PlotArea.Interior.Color = RGB(255, 255, 255) 'белый | ||
- | |||
- | .PlotArea.Fill.Visible = False 'или удаляем фон | ||
- | |||
- | |||
- | |||
- | 'цвет общего фона диаграммы | ||
- | |||
- | '.ChartArea.Interior.Color = RGB(255, 255, 255) 'белый | ||
- | |||
- | .ChartArea.Fill.Visible = False 'или удаляем | ||
- | |||
- | |||
- | |||
- | .Legend.Delete 'не нужна легенда, иначе надо писать то, что ниже | ||
- | |||
- | 'With .Legend 'настройка легенды | ||
- | |||
- | '.Position = XlLegendPosition.xlLegendPositionBottom 'снизу по центру | ||
- | |||
- | '.AutoScaleFont = False | ||
- | |||
- | '.Font.FontStyle = "полужирный" | ||
- | |||
- | '.Font.Size = 9 | ||
- | |||
- | 'End With | ||
- | |||
- | |||
- | |||
- | End With | ||
- | |||
- | |||
- | |||
- | Shapes(i).ConvertToInlineShape | ||
- | |||
- | |||
- | |||
- | End If | ||
- | |||
- | |||
- | |||
- | Next i | ||
- | |||
- | |||
- | |||
- | End With | ||
- | |||
- | |||
- | |||
- | End If | ||
- | |||
- | |||
- | |||
- | End Sub | ||
- | |||
- | |||
- | |||
- | </code> | ||
- | |||
- | |||
- | |||
- | ===== Результат ===== | ||
- | |||
- | |||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:chart_insert:chart2.png?nolink |Рисунок 2. Вид сформированного отчета}}] |