簡體   English   中英

如何比較(不同)工作表上的兩個(數據透視表)表數據?

[英]How to compare two (pivot) tables data on (different) worksheets?

1個excel文件中有2個工作表,它們的列結構相同:

BuildIndex | Phase | Module | Duration

BuildIndex列用作主鍵

假設以下示例數據:

工作表1:

1 | Phase 1 | Module 1 | 5
1 | Phase 2 | Module 1 | 3
1 | Phase 3 | Module 1 | 10
1 | Phase 1 | Module 2 | 6
1 | Phase 2 | Module 2 | 2
1 | Phase 3 | Module 2 | 5

工作表2:

2 | Phase 1 | Module 1 | 3
2 | Phase 2 | Module 1 | 7
2 | Phase 3 | Module 1 | 9
2 | Phase 1 | Module 2 | 2
2 | Phase 2 | Module 2 | 10
2 | Phase 3 | Module 2 | 4

現在,我創建不同的數據透視表和圖表,並“手動”分析差異以做出決策,例如

  • 對於構建索引1模塊2的構建速度比構建索引2快X秒
  • 對於構建索引2階段3 (所有模塊的總和)比構建索引1的構建快Y秒

那就是我想做的:

由於存在多個階段,並且模塊的數量不斷增加,因此上述過程花費了太多時間,我認為有一種自動方法可以執行此類分析。

那么,您是否知道是否有辦法實現我的意圖? 隨時為excel公式或數據透視表或vba或or或or :-)提供提示

我使用VBA解決了它。 以前從未使用過它,因此我的代碼可以得到改進;-)

調用AllInOne進行階段(使用的任何變量都聲明為String ):

Option Explicit

Sub ExtractUniquePhasesAndModules()
    '--------------------------------------
    '| Perform calculations for TEST DATA |
    '--------------------------------------
    srcSheet = "CompareData"
    destSheet = "CompareResults"
    destPkColumn = "A"
    destColumn = "B"
    calculateColumn = "C"

    'Phases 1
    srcPkCell = "A2"
    srcColumn = "B"
    sumValuesColumn = "D"
    AllInOne srcSheet, srcColumn, destSheet, destColumn, calculateColumn, sumValuesColumn, srcPkCell, destPkColumn

    'Phases 2
    srcPkCell = "F2"
    srcColumn = "G"
    sumValuesColumn = "I"
    AllInOne srcSheet, srcColumn, destSheet, destColumn, calculateColumn, sumValuesColumn, srcPkCell, destPkColumn
End Sub

這是解決問題的功能:

Private Sub AllInOne(srcSheetName As String, srcColumnName As String, destSheetName As String, _
                    destColumnName As String, calculateColumnName As String, sumValuesColumnName As String, _
                    srcPkCellName As String, destPkColumnName As String)

    Dim srcSheet As Worksheet
    Dim destSheet As Worksheet
    Dim srcColumn As Range
    Dim destColumn As Range
    Dim srcPkCell As Range
    Dim destPkColumn As Range
    Dim sumValuesColumn As Range
    Dim wsf As WorksheetFunction

    Set srcSheet = Worksheets(srcSheetName)
    Set srcColumn = srcSheet.Range(srcColumnName + ":" + srcColumnName)

    Set destSheet = Worksheets(destSheetName)
    Set destColumn = destSheet.Range(destColumnName + ":" + destColumnName)

    Set srcPkCell = srcSheet.Range(srcPkCellName)
    Set destPkColumn = destSheet.Range(destPkColumnName + ":" + destPkColumnName)

    Set sumValuesColumn = srcSheet.Range(sumValuesColumnName + ":" + sumValuesColumnName)

    Set wsf = WorksheetFunction

    '-----------------------
    'Copy all unique values|
    '-----------------------
    destSheet.Select
    Dim ctr As Range
    'find the first empty cell
    For Each ctr In destColumn.Cells
        If ctr.Value = "0" Then
            'do nothing
        ElseIf ctr.Value = Empty Then
            Exit For
        End If
    Next
    'start copying
    srcColumn.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ctr, Unique:=True

    'set destination range to only the new cells
    Set destColumn = destSheet.Range(ctr.Address + ":" + destColumnName & destColumn.Count)

    Dim cell As Range
    Dim calcCell As Range
    Dim destPkCell As Range
    For Each cell In destColumn.Cells
        'end of list reached?
        If cell.Value = Empty Then
            Exit For
        End If

        'Fill in primary key
        Set destPkCell = destSheet.Range(destPkColumnName & cell.Row)
        destPkCell.Value = srcPkCell.Value

        'Perform the sum-calculation and show the result
        Set calcCell = destSheet.Range(calculateColumnName & cell.Row)
        calcCell.Value = wsf.SumProduct(wsf.SumIf(srcColumn, "=" & cell.Value, sumValuesColumn))
    Next

End Sub

首先,在目標列上進行迭代以找到第一個空單元格。 然后將此單元格用作AdvancedFilter函數中的CopyToRange參數。

然后,它為每行插入主鍵(在我的情況下為BuildIndex )和SumProduct的結果。

使用問題數據的階段結果是這樣的:

1 | Phase   | 0
1 | Phase 1 | 11
1 | Phase 2 | 5
1 | Phase 3 | 15
2 | Phase   | 0
2 | Phase 1 | 5
2 | Phase 2 | 17
2 | Phase 3 | 13

現在,我可以按照需要創建圖表了:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM