当源数据包含日期的列标题时,如何构建合并的数据透视表?
-
07-07-2019 - |
题
我有一位客户目前正在使用 Excel 进行员工规划。他们有许多针对不同项目的工作簿,每个项目包含一张或多张包含实际人员配置数据的工作表:
客户希望将所有这些工作表和工作簿中的所有数据合并到一个数据透视表中。“合并”数据透视表不是一个选项,因为他们希望能够混淆源数据中的所有(非日期)字段。他们不想仅限于“行”和“列”。我当前的解决方案是一个宏,它通过相当复杂的复制和旋转过程来合并工作簿中的所有数据。我首先复制一行“元数据”(所有不是日期的内容),然后将元数据行的日期复制/转置到单个“日期”列中。然后我扩展元数据,以便为每个日期定义相同的数据。
我有一个单独的工作簿,它从每个工作簿中获取合并工作表,并从中构建一个数据透视表。
它确实有效,但效率相当低,因为任务/分配的总数有数千个。在我的梦想中,我希望完全消除整合步骤,但我不认为这种情况会发生。更有效的整合方法是我目前所希望的最好方法。
如果有人有一些“跳出框框”的想法,我洗耳恭听!该解决方案需要在 Windows XP、Office 2002 和 2003 上运行。
解决方案
我终于找到了一个 可接受的解决方案, ,如果有人感兴趣的话。它使用数据透视表和 文本到列 功能。一旦我掌握了这种方法,将其转化为代码就非常简单了。下面的代码确实引用了我使用的一些便利函数,例如“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
不隶属于 StackOverflow