Измените формат столбца поля даты сводной таблицы, затем сортируйте поле

У меня есть сводная таблица с одним полем столбца даты. Я хочу, чтобы столбец был сгруппирован по 7 дням, а затем отображался в порядке возрастания. Проблема в том, что при группировании элементы отображаются следующим образом:

5/1/13 - 5/7/13, 5/16/13 - 5/21/13, 5/22/13 - 5/29/13, 5/8/13 - 5/15/13

Как видите, 5/8... не в том месте. Причина в том, что в этот момент поле распознается только как текст, а не как дата.

Моя попытка исправить было изменить формат даты на "мм / дд / гг" для лучшей сортировки. Так, например, дата будет выглядеть так: 05/01/13 - 05/07/13, Но проблема заключалась в том, что когда я снова собирался в группу, дата автоматически возвращалась к тому, что было.

Есть ли способ программно сгруппировать столбцы сводной таблицы, но при этом сохранить этот формат даты, чтобы он мог сортировать по порядку?

1 ответ

Решение

Предполагалось, что это будет последнее средство, но в итоге мне пришлось создать массив дат начала в моих диапазонах дат, изменить формат даты на mm/dd/yyyyотсортируйте его, а затем отрегулируйте положение сводных элементов на основе позиционирования индекса массива. Я сделал это, используя элементы массива в качестве ключа на карте со значением, являющимся фактическим именем сводного элемента.

Sub TryAndSort()

 Dim w As Worksheet, p As PivotTable, pi As PivotItem
 Dim arr() As Variant
 Dim map As New collection

     Set w = Sheets("data")
        i = 0
        For Each pi In w.PivotTables(1).PivotFields("date").PivotItems
            If pi.Visible Then
                i = i + 1
            End If
        Next

     ReDim arr(1 To i)
        i = 1
        For Each pi In w.PivotTables(1).PivotFields("date").PivotItems
            If pi.Visible Then
                j = Split(pi.Name, " - ")(0)
                k = Format(j, "mm/dd/yyyy")
                    arr(i) = k
                    map.Add CStr(pi.Name), CStr(k)
                    i = i + 1
            End If
        Next

    Call QuickSort(arr, 1, UBound(arr)) '<--- the sorting method

    For Each p In w.PivotTables
        For t = 1 To UBound(arr)
            p.PivotFields("date").PivotItems(map.Item(arr(t))).Position = t
        Next
    Next

End Sub
Другие вопросы по тегам