Содержание

Опции шаблонов Excel: группировка, итоги и остальные опции

Эта страница — дополнение к основной: «Опции шаблонов Excel». Там описаны опции, которые используются чаще всего. Здесь — то, чего там нет:

служебные опции листа и книги).

Правила записи опций (разделители ; и \, перевод строки через Alt+Enter, регистр не важен) — те же, что на основной странице, и здесь не повторяются.

1. Как устроена группировка

Понимание механики экономит много времени: почти все «странности» группировки объясняются тем, что её делает сам Excel, а шаблон только задаёт параметры.

Что происходит по шагам

  1. Сортировка. Область сортируется по колонкам группировки — если не задан GroupNoSort.
  2. Промежуточные итоги. Для каждого уровня группировки выполняется команда Excel

«Промежуточные итоги» (Range.Subtotal). Она вставляет строки итогов и строит структуру

  (те самые «плюсики» слева).
- **Оформление.** На строки итогов накладываются формат и формулы **строки-образца** —
  нижней служебной строки области (см. раздел 4).
- **Объединение подписей** (''mergelabels'') — ключ группы объединяется по строкам блока.
- **Структура и свёртка** (''disableoutline'', ''collapse'').
- **Общий итог** — его тоже делает Excel, одной строкой на всю область.

Три действующих лица

Что Где задаётся Роль
Колонка-ключGroup в служебной строке под колонкойПо её значениям данные делятся на группы. Колонок может быть несколько — это уровни, они идут слева направо
Колонки агрегатовSum, Avg, Count и т. д. под колонкамиЧто именно считать в строках итогов
Строка-образецнижняя служебная строка областиЕё формат (и её формулы) переносятся на каждую строку итогов

Подпись строки итога

Текст подписи формирует Excel, а не шаблон. Он зависит от функции агрегата и от языка Excel:

Агрегат Подпись группы Подпись общего итога
SumКабель ВВГ ИтогОбщий итог
Count / CountNumsКабель ВВГ КоличествоОбщее количество
AvgКабель ВВГ СреднееОбщее среднее

Подпись пишется в колонку своего уровня — ту, под которой стоит Group. Переадресовать её в другую колонку можно параметром placetocolumn (см. ниже).

Если в колонке-ключе значение пустое, подпись получается просто « Итог» — это нормально
и означает «группа без значения ключа». Такие строки группируются отдельно и получают свои
подытоги, как любые другие.

2. Опция Group — все параметры

Ставится в служебной строке области, под колонкой, по которой группируем. Параметры добавляются через \ и могут сочетаться:

Group\MergeLabels\DisableSubtotals
Параметр Что делает
Asc / DescНаправление предварительной сортировки по этой колонке
MergeLabelsОбъединить ячейки ключа по строкам группы
MergeLabels2То же, но в объединение входит и строка итогов этого уровня
MergeLabels3Как MergeLabels2, см. оговорку ниже
WithHeaderВыводить подпись группы отдельной строкой над блоком
PlaceToColumn=NПисать подпись группы не в свою колонку, а в колонку N области
CollapseСвернуть структуру до этого уровня
DisableSubtotalsУ этого уровня не выводить строки итогов
DisableOutlineНе строить структуру («плюсики») по этому уровню
PageBreaksРазрыв страницы после каждой группы этого уровня
SummaryAbove / SummaryBelowПозиция строки итогов именно этого уровня

MergeLabels, MergeLabels2, MergeLabels3

Самый частый вопрос — чем они отличаются.

MergeLabels — объединяются ячейки ключа по строкам данных группы. Строка итогов этого уровня в объединение не входит: в ней остаётся собственная подпись («Кабель ВВГ Итог»).

MergeLabels2 — в объединение входит и строка итогов этого уровня. В объединённой ячейке остаётся значение ключа (подпись итога при этом гасится, чтобы в объединении не всплыл текст «Итог» вместо наименования).

MergeLabels3 — в отчётах с агрегатами (там, где есть Sum и подобные) ведёт себя так же, как MergeLabels2. Разница проявляется только в отчётах без агрегатов: там MergeLabels2 оставляет значение в объединённой ячейке, а MergeLabels3 её очищает и при этом строит структуру. Вариант экзотический — если не уверены, используйте MergeLabels2.

Важно для уровня с DisableSubtotals. У такого уровня своих строк итогов нет, поэтому
MergeLabels и MergeLabels2 дают одинаковый результат: включать в объединение нечего.

WithHeader

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

Включение WithHeader хотя бы на одном уровне меняет режим у всех уровней выше него.

PlaceToColumn=N

Подпись группы пишется в колонку N области (не листа). Нумерация ведётся с нуля: PlaceToColumn=0 — первая колонка области. Удобно, когда группируем по технической колонке (например по GOOD_ID), а показать наименование нужно в другой.

Collapse

Сворачивает структуру. Если поставить у вложенного уровня — свернёт до этого уровня. Альтернатива с явным указанием глубины — опция области Outline\CollapseLevel=N.

DisableSubtotals

Уровень участвует в группировке (сортировка, объединение подписей, структура), но строк итогов по нему нет. Типовой случай: по товару нужны подытоги, а по разделу — только объединённая подпись.

Что при этом важно знать:

уровня итоги отключены;

но без подписи (подписывать единственную строку итогов незачем).

DisableOutline

Отключает структуру (группировку строк «плюсиками») по этому уровню. Сами строки итогов остаются. Нужно, когда документ уходит на печать и «плюсики» в нём не нужны.

PageBreaks

После каждой группы этого уровня ставится разрыв страницы. Не путать с опцией листа RangeBreaks — та режет страницы по вместимости и повторяет шапку; PageBreaks режет по смыслу, на границах групп.

SummaryAbove / SummaryBelow у колонки

Позиция строки итогов этого уровня: над данными группы или под ними. Задаётся параметром колонки и переопределяет общий режим области.

Group\MergeLabels\SummaryAbove

Типовой случай: общий режим — «итоги сверху» (так удобнее читать длинный отчёт), а у самой вложенной подгруппы итог нужен снизу, сразу после её строк.

Уровни без своего параметра берут режим области (SummaryAbove / SummaryBelow у области,
см. раздел 3). Если не задано ничего — итоги снизу, как в Excel по умолчанию.

3. Опции области, управляющие итогами

Ставятся в левой нижней ячейке области (там же, где RowsFit и AutoFilter).

Опция Что делает
SummaryAboveСтроки итогов над данными группы — для всей области
SummaryBelowСтроки итогов под данными (поведение по умолчанию)
DisableGrandTotalsНе выводить строку общего итога
GroupNoSortНе сортировать перед группировкой
Outline\CollapseLevel=NСвернуть структуру до уровня N
AutoFilterАвтофильтр по области (ставится по имени области, с группировкой совместим)

GroupNoSort можно поставить и шире — в A1 (на всю книгу) или в A2 (на лист). Это удобно, когда отчёт заведомо приходит отсортированным из запроса.

Когда GroupNoSort не просто ускоряет, а необходим — см. ограничение на три ключа
сортировки в разделе 7.

4. Оформление строк итогов

Строки итогов оформляются по строке-образцу — это нижняя служебная строка области (та самая, в которой написаны Group, Sum и прочие опции). Она не попадает в готовый отчёт: после построения её удаляют, а её оформление уезжает на строки итогов.

Что переносится:

итогов свою формулу вместо той, что пишет Excel.

Свой цвет на каждый уровень

Заливка и цвет шрифта строки итогов берутся из ячейки строки-образца в колонке своего уровня. Это значит:

Строка общего итога оформляется по колонке самого внешнего уровня.

Колонка X (группа):     Group\MergeLabels      ← ячейку залить, скажем, серым
Колонка AG (подгруппа): Group\MergeLabels      ← ячейку залить светло-серым
Колонка M (сумма):      Sum

Итоги группы получатся серыми, итоги подгруппы — светло-серыми, остальной формат (рамки, числовой формат, шрифт) — общий, из строки-образца.

5. Что происходит с «неудобными» значениями ключа

Случай Поведение
Пустое значение ключаОбразует свою группу со своими подытогами. Подпись итога выглядит как « Итог»
В ключе формулаГруппировка идёт по результату формулы. Движок пересчитывает лист перед выполнением опций, поэтому «невычисленная» формула группировку больше не ломает
В ключе ошибка (#ЗНАЧ!, #Н/Д)Строки с ошибкой не роняют построение: такие значения сравниваются как текст. Но в отчёте ошибка останется видна — это дефект шаблона, его надо править
Разный регистр («Кабель» и «кабель»)Разные группы: сравнение регистрозависимое

6. Общий итог

Строку общего итога делает Excel, одну на всю область, в том же режиме (сверху/снизу), что и остальные итоги.

независимо от того, у каких уровней итоги отключены.

формулы в колонках агрегатов есть, текста нет. Если подпись нужна — напишите её в

  строке-образце, в нужной колонке: формулы и текст образца переносятся на строку итогов.

7. Ограничения и ловушки

Сортировка: три ключа, иначе не сортирует вовсе

Excel сортирует максимум по трём колонкам за один проход. Движок использует один проход, поэтому:

Если колонок с Sort / Asc / Desc и Group в сумме больше трёх —
область не сортируется вообще (не «по первым трём», а совсем).

Это самая частая причина «группировка порвалась на части»: при четырёх уровнях группировки данные приходят неотсортированными, и одна и та же группа встречается в отчёте несколько раз.

Что делать: сортировать данные в запросе отчёта (ORDER BY) и поставить области GroupNoSort. Это и правильнее, и быстрее.

Произвольные области

Group, Sort и AutoFilter работают только в тех областях, где одна запись занимает ровно одну строку шаблона. В произвольной области (запись на несколько строк, объединённые ячейки) они молча ничего не делают. Для таких областей есть отдельная опция GroupWithHeader (раздел 9).

Глубина структуры

Структура Excel ограничена 8 уровнями. Каждый уровень группировки с итогами занимает уровень структуры. Практический потолок — 3–4 уровня; дальше отчёт всё равно нечитаем.

Вложенные области (master/detail)

Опции области (RowsFit, SummaryAbove и т. п.) указывайте у самой внешней области.

Порядок уровней

Уровни группировки идут слева направо по колонкам шаблона. Чтобы поменять их местами, надо поменять местами колонки, а не порядок опций.

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

GroupRowID / GroupRowSum (схлопывание одинаковых строк, см. основную страницу) работают до подсчёта итогов. То есть итоги считаются уже по схлопнутым строкам — это обычно и нужно.

8. SmartGroup

Отдельный, независимый механизм группировки. Ставится так же — в служебной строке под колонкой-ключом.

Отличия от Group:

Параметры: MergeLabels, MergeLabels2, DisableSubtotals, PageBreaks. Параметры WithHeader, DisableOutline, DisableGrandTotals в коде зарезервированы, но не реализованы — рассчитывать на них не стоит.

Для новых шаблонов используйте обычную Group: она отлажена, покрыта параметрами и ведёт
себя предсказуемо. SmartGroup остаётся для совместимости со старыми шаблонами.

9. GroupWithHeader

Опция области для произвольных областей — там, где одна запись занимает несколько строк шаблона и обычная Group не работает.

GroupWithHeader\GroupCount=2

GroupCount=N — сколько первых строк блока считаются заголовком группы (по умолчанию 1). Итоги берутся из колонок, помеченных Sum, Avg и т. д.

Опция редкая и в шаблонах НЭП почти не встречается. Перед применением проверьте результат
на макете: поведение сильно зависит от геометрии области.

10. Прочие опции, которых нет в основной странице

Итоги

Опция Где Что делает
Sum\TotalOfRow=NстолбецДля произвольной области: считать итог только по тем строкам, которые порождены N-й строкой блока шаблона. По умолчанию 1

Лист и книга

Опция Где Что делает
HideA2Скрыть лист в готовом отчёте
SheetHideA2Скрыть лист «жёстко» (не виден в списке скрытых листов Excel)
DeleteA2Удалить лист из готового отчёта. Удобно для листов-справочников, которые нужны только при построении
AutoScaleA1 / A2Подогнать масштаб печати под ширину страницы
AutoSafeA1 / A2Автосохранение книги после построения
ShowPivotBarA1Показать панель сводных таблиц

Область и столбец

Опция Где Что делает
OnlyValuesстолбецЗаморозить формулы только в одном столбце области
RowsFit / RowsFit2A1 / A2Подгон высоты строк не по области, а на весь лист или всю книгу
ColsFitA1 / A2 / столбецПодгон ширины: на книгу, на лист или на отдельный столбец
DeleteColumnстолбецУдалить столбец из готового отчёта. Для технических колонок (ключи, служебные вычисления), которые нужны при построении, но не нужны получателю
Outline\CollapseLevel=NобластьСвернуть структуру до уровня N
Chart\Name=ИмяДиаграммыобластьПостроить диаграмму по данным области

11. Сводные таблицы (Pivot)

Отдельный пакет опций. Опция области:

Pivot\Name=ИмяСводной\Dst=Лист2!A1\RowGrand\ColumnGrand
Параметр Что делает
Name=Имя создаваемой сводной таблицы
Dst=Куда её поместить (адрес ячейки, можно на другом листе)
DataToRowsПоля данных — в строки, а не в столбцы
RowGrand / ColumnGrandОбщие итоги по строкам / по столбцам
MergeLabelsОбъединять подписи
NoPreserveFormattingНе сохранять форматирование при обновлении
Refresh=СводнаяNОбновить перечисленные существующие сводные таблицы
RefreshChart=ДиаграммаNОбновить перечисленные сводные диаграммы

Роль каждой колонки задаётся в служебной строке области:

Опция Роль колонки в сводной
RowВ строки
ColumnВ столбцы
DataВ значения
PageВ фильтр страницы

В сводной таблице также работают Group (с параметрами Asc, Desc, Collapse) и GroupNoSort.

12. Диагностика: группировка «не работает»

Симптом Проверьте
Группы повторяются по нескольку разДанные не отсортированы. Колонок с Sort+Group больше трёх → сортировки не было вообще. Сортируйте в запросе + GroupNoSort
Группировки нет совсемОбласть произвольная (запись занимает больше одной строки) — Group в таких не работает
Подытогов нет, а подписи объединилисьУ уровня стоит DisableSubtotals
Нет ни одного агрегата в строках итоговНе указан ни один Sum / Avg / … под колонками
Строки итогов «съели» формат данныхПроверьте строку-образец: именно её формат переносится на итоги
Итоги не того цветаЦвет берётся из ячейки строки-образца в колонке своего уровня, а не из всей строки
Объединённая подпись показывает «Итог» вместо наименованияТак ведёт себя MergeLabels2 в старых сборках; в актуальной подпись итога гасится автоматически
Отчёт строится заметно дольшеПереопределение позиции итогов по уровням (SummaryAbove / SummaryBelow у колонки) требует перестановки строк. Если разницы в позиции не нужно — не задавайте параметр

13. Готовые сочетания

Отчёт по разделам и товарам, итоги снизу

Служебная строка области:

Раздел:      Group\MergeLabels2
Товар:       Group
Количество:  Sum
Сумма:       Sum

Левая нижняя ячейка области:

RowsFit

Длинный отчёт: итоги сверху, свёрнутый по разделам

Раздел:      Group\MergeLabels2\Collapse
Товар:       Group
Сумма:       Sum

Левая нижняя ячейка области:

SummaryAbove

Разделы — только подписью, итоги только по товару

Раздел:      Group\MergeLabels\DisableSubtotals\DisableOutline
Товар:       Group
Сумма:       Sum

Печатная форма: каждый раздел с новой страницы

Раздел:      Group\MergeLabels2\PageBreaks
Товар:       Group
Сумма:       Sum

Данные уже отсортированы запросом

Левая нижняя ячейка области:

GroupNoSort

Обязательно, если уровней группировки и сортировки в сумме больше трёх.