更改数据透视表日期字段列格式然后排序字段

时间:2013-06-11 16:37:01

标签: excel excel-vba-mac

我有一个带有单个日期列字段的数据透视表。我希望将列分组为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 ......是在错误的位置。原因是,此时,该字段仅被识别为文本,而不是日期。

我尝试修复的方法是将日期格式更改为“mm / dd / yy”以更好地排序。例如,日期将显示为:05/01/13 - 05/07/13。但问题是,当我再次去组时,日期会自动改回原来的状态。

有没有办法按字母顺序对pivotTable列进行分组,但仍然保留该日期格式,以便它可以按顺序排序?

1 个答案:

答案 0 :(得分:0)

这应该是最后的手段,但最终我必须在我的日期范围中创建一个开始日期数组,将日期格式更改为mm/dd/yyyy,对其进行排序,然后调整pivotItems的位置基于数组索引定位。我通过将数组项作为映射中的键来实现此目的,其值为实际的pivotitem名称。

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