【问题标题】:How to build a consolidated pivot table when the source data contains column headings that are dates?当源数据包含日期列标题时,如何构建合并数据透视表?
【发布时间】:2009-11-06 10:01:33
【问题描述】:

我有一位客户目前正在使用 Excel 进行员工规划。他们有许多不同项目的工作簿,每个项目都包含一张或多张包含实际人员配备数据的工作表:

客户希望将所有这些工作表和工作簿中的所有数据合并到一个数据透视表中。 “合并”数据透视不是一个选项,因为他们希望能够处理源数据中的所有(非日期)字段。他们不想仅限于“行”和“列”。我目前的解决方案是一个宏,它通过一个相当复杂的复制和旋转过程来整合工作簿中的所有数据。我首先复制一行“元数据”(不是日期的所有内容),然后将元数据行的日期复制/转置到单个“日期”列中。然后我扩展元数据,以便为每个日期定义相同的数据。

我有一个单独的工作簿,它从每个工作簿中获取合并表并从中构建一个数据透视表。

它可以工作,但效率很低,因为任务/分配的总数有数千个。在我的梦想中,我很想完全消除整合步骤,但我不认为会发生这种情况。一种更有效的整合方法是我目前所希望的最佳方法。

如果有人有一些“跳出框框”的想法,我会全力以赴! 解决方案需要在 windows XP、Office 2002 和 2003 上运行。

【问题讨论】:

    标签: excel pivot consolidation


    【解决方案1】:

    我终于找到了acceptable solution,如果有人感兴趣的话。它使用数据透视表和TextToColumns 函数的组合。一旦我有了这个方法,把它变成代码就很简单了。下面的代码确实引用了我使用的一些便利功能,例如“DeleteSheet”和“LastRowOn”,但您明白了。

    Sub Foo()
        Dim ws As Worksheet
        For Each ws In Worksheets
            If IsStaffingSheet(ws) Then
                ws.Select
                DeleteSheet ws.Name & " - Exploded"
                TransposeSheet ws
            End If
        Next ws
    
    End Sub
    
    Sub TransposeSheet(ByVal ParentSheet As Worksheet)
        Dim ws As Worksheet
        Dim r As Range
        Dim ref As Variant
        Dim pt As PivotTable
    
        Set r = Range("StaffingStartCell")
        Set r = Range(r, r.SpecialCells(xlLastCell))
    
        ref = Array("'" & ActiveSheet.Name _
                        & "'!" & r.Address(ReferenceStyle:=xlR1C1))
    
        Application.CutCopyMode = False
        ActiveWorkbook.PivotCaches.Add(SourceType:=xlConsolidation, _
                                       SourceData:=ref).CreatePivotTable TableDestination:="", _
            tableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion10
    
        Set ws = ActiveSheet
        Set pt = ws.PivotTableWizard(TableDestination:=ActiveSheet.Cells(3, 1))
        pt.DataPivotField.PivotItems("Count of Value").Position = 1
        pt.PivotFields("Row").PivotItems("").Visible = False
    
        ExplodePivot ParentSheet
        Application.DisplayAlerts = False
        ws.Delete
        Application.DisplayAlerts = True
    
        Set ws = Nothing
    End Sub
    
    
    Sub ExplodePivot(ByVal ParentSheet As Worksheet)
        Dim lastRow As Long
        Dim lastCol As Long
    
        lastRow = LastRowOn(ActiveSheet.Name)
        lastCol = LastColumnBack(ActiveSheet, lastRow)
    
        Cells(lastRow, lastCol).ShowDetail = True
    
        Columns("B:C").Select
        Selection.Cut Destination:=Columns("S:T")
    
        Columns("A:A").Select
        Selection.TextToColumns Destination:=Range("A1"), _
                                DataType:=xlDelimited, _
                                Semicolon:=True
        Selection.ColumnWidth = 12
        ActiveSheet.Name = ParentSheet.Name & " - Exploded"
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2015-01-03
      相关资源
      最近更新 更多