Итог: узнаете, как изменить форматирование даты для сгруппированного поля в сводной таблице.
Уровень мастерства: Средний

Изменение формата для дат не работает
Когда мы группируем поле «Дата» в сводной таблице с помощью функции «Группировать», форматирование чисел для поля «День» фиксируется. Он имеет следующий формат «день-месяц» или «d-ммм».
Если мы попытаемся изменить числовой формат поля День/Дата, это не сработает. Ничего не меняется, когда мы заходим в Настройки поля> Числовой формат и меняем числовой формат на пользовательский или формат даты.
Почему?

Форматирование чисел не работает, потому что элемент сводки — это фактически текст, а НЕ дата.
Когда мы группируем поля, функция группирования создает элемент Дни для каждого дня одного года. Он сохраняет название месяца в именах полей Day, и фактически это группа номеров дней (1-31) для каждого месяца.
На самом деле можно увидеть этот список текстовых элементов в файле pivotCacheDefinition.xml. Чтобы увидеть, что вы можете изменить расширение файла Excel на .zip и перейти к папке PivotCache.

Поскольку это текстовые элементы, представляющие дни года, мы не сможем изменить форматирование ячеек непосредственно в Excel. Однако есть несколько обходных путей.
Решение № 1 — Не используйте группы дат
Первым решением является создание полей (столбцов) в диапазоне исходных данных с различными группами по году, кварталу, месяцу, дням и т.д
Я подробно объясняю это в своей статье «Группировка дат в сводной таблице». Источник данных.

Использование собственных полей из исходных данных для разных групп дат даст вам контроль над форматированием чисел поля в сводной таблице. Вы также можете создать таблицу календаря с группировками, если вы используете Power Pivot.
Автоматическая группировка полей даты
Если вы используете Excel 2016 (Office 365), то поле даты автоматически группируется при добавлении его в сводную таблицу.
Разгруппировать поле даты:
- Выберите ячейку внутри сводной таблицы в одном из полей даты.
- Нажмите кнопку «Разгруппировать» на вкладке «Анализ» ленты.

Автоматическая группировка является настройкой по умолчанию, которую можно изменить. См. мою статью «Даты группирования в сводной таблице». Даты группирования VERSUS приведены в исходных данных, чтобы узнать больше.
Как только поле даты будет разгруппировано, вы можете изменить форматирование поля.

Чтобы изменить форматирование чисел в несгруппированном поле Дата:
- Щелкните правой кнопкой мыши ячейку в поле даты сводной таблицы.
- Выберите настройки поля …
- Нажмите кнопку «Числовой формат».
- Измените форматирование даты в окне «Формат ячеек».
- Нажмите ОК и ОК.
Опять же, это работает только для полей, которые НЕ сгруппированы. Если вы снова сгруппируете поле после изменения форматирования, форматирование элементов в поле «Дни» изменится на «1 января».
Решение №2. Изменение имен элементов сводки с помощью VBA
Если вы действительно хотите использовать функцию Group Field, то мы можем использовать макрос для изменения имен элементов сводки. Создается впечатление, что изменилось форматирование даты, но на самом деле меняется текст в каждом названии элемента сводки.

Следующий макрос перебирает все сводные элементы сгруппированного поля «Дни» и изменяет форматирование чисел на пользовательский формат. По умолчанию я установил «m/d», но вы можете изменить его на любой формат даты для месяца и дня. Просто помните, что элемент НЕ будет содержать год, так как элемент не является фактической датой.
Скачать файл
Загрузите файл Excel, который содержит макрос.
Pivot Table Date Field Group Number Formatting Macro.xlsm (54.2 KB)
Макрос форматирования поля «Дни»
Sub Change_Days_Field_Formatting()
' Измените форматирование чисел в поле Дни
' для поля даты сгруппированной сводной таблицы.
Dim pt As PivotTable
Dim pi As PivotItem
' ВАЖНО: Измените следующее имя
' Сгруппированное поле Дни. Обычно это дни или название
' вашего поля даты.
Const sDaysField As String = "Days"
' Установить ссылку на первую сводную таблицу на листе
' Это может быть изменено для ссылки на имя сводной таблицы
'Set pt = ActiveSheet.PivotTables("PivotTable1")
Set pt = ActiveSheet.PivotTables(1)
' Установите имена обратно к их имени источника по умолчанию
For Each pi In pt.PivotFields(sDaysField).PivotItems
' Обходит первый и последний пункты "<01.01.2015" ...
If Left(pi.Name, 1) <> "<" And Left(pi.Name, 1) <> ">" Then
pi.Name = pi.SourceName
End If
Next pi
' Установите имена в произвольном формате чисел
For Each pi In pt.PivotFields(sDaysField).PivotItems
If Left(pi.Name, 1) <> "<" And Left(pi.Name, 1) <> ">" Then
' Измените приведенный ниже формат «m / d» на пользовательский числовой формат.
' 2020 год используется для високосного года.
pi.Name = Format(DateValue(pi.SourceName & "-2020"), "m/d")
End If
Next pi
End Sub
Как работает макрос
Макрос сначала зацикливает элементы сводки в поле Дни, чтобы восстановить имя элемента сводки в его исходное имя по умолчанию. Два разных элемента не могут иметь одинаковое имя. Так что это должно предотвратить любые ошибки при изменении или попытке разных форматов.
Второй цикл меняет каждый элемент сводки на новый формат. Он использует функцию DateValue для изменения названия элемента сводки «1-Jan» на дату. Затем он использует функцию «Формат», чтобы изменить форматирование даты на текст. По умолчанию используется формат «m / d». Это может быть изменено на другой формат с месяцем и днем. Каждый элемент должен быть уникальным, поэтому вы можете использовать месяц и день в названии элемента.
Возможно, вы могли бы разделить этот макрос на два макроса и запускать только первый цикл сброса по мере необходимости. Макрос занимает около 15 секунд для запуска на моем компьютере из-за всех циклов. Но это не тот, который вам придется часто бегать.
Также важно упомянуть, что это выполняется на элементах сводки, а не на сводном кеше. Таким образом, только что названные элементы будут изменены только в сводной таблице, на которой вы запускаете макрос.
Макрос форматирования сгруппированных элементов
Был задан большой вопрос в комментариях об изменении форматирования для сгруппированных чисел. Это та же проблема, что и для групп дат. Имена групп — это текст, а не цифры. Тем не менее, мы можем использовать макрос, чтобы изменить их.

Вот код макроса. Вам просто нужно изменить значение константы sGroupField вверху на имя вашего сгруппированного поля. При необходимости вы также можете изменить формат чисел в sNumberFormat.
Sub Change_Grouped_Field_Number_Formatting()
' Изменить форматирование номера поля сгруппированных номеров
Dim pt As PivotTable
Dim pi As PivotItem
Dim sGroup() As String
Dim sGroupName As String
' ВАЖНО: Измените следующее имя
' поле сгруппированного номера в области строк или столбцов.
Const sGroupedField As String = "Quantity"
Const sNumberFormat As String = "$#,###"
' Установить ссылку на первую сводную таблицу на листе
' Это может быть изменено для ссылки на имя сводной таблицы
'Set pt = ActiveSheet.PivotTables("PivotTable1")
Set pt = ActiveSheet.PivotTables(1)
' Установите имена обратно к их имени источника по умолчанию
For Each pi In pt.PivotFields(sGroupedField).PivotItems
' Обходит первый и последний пункты "<01.01.2015" ...
If Left(pi.Name, 1) <> "<" And Left(pi.Name, 1) <> ">" Then
pi.Name = pi.SourceName
End If
Next pi
' Установите имена в произвольном формате чисел
For Each pi In pt.PivotFields(sGroupedField).PivotItems
If Left(pi.Name, 1) = "<" Or Left(pi.Name, 1) = ">" Then
sGroupName = "<" & Format(Mid(pi.Name, 2, Len(pi.Name)), sNumberFormat)
Else
sGroup = Split(pi.Name, "-")
sGroupName = Format(sGroup(0), sNumberFormat) & " - " & Format(sGroup(1), sNumberFormat)
End If
If sGroupName <> "" Then pi.Name = sGroupName
Next pi
End Sub
Окончательный вердикт
Я надеюсь, что информация была полезной. Я бы предложил использовать решение № 1, если вы не хотите использовать функцию группы.
Пожалуйста, оставьте комментарий ниже с любыми вопросами или предложениями о том, как мы можем улучшить это. Спасибо! 🙂