【问题标题】:How to compare two (pivot) tables data on (different) worksheets?如何比较(不同)工作表上的两个(数据透视表)数据?
【发布时间】:2014-03-20 11:28:29
【问题描述】:

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 或或或 :-) 的提示

【问题讨论】:

    标签: excel excel-2010 pivot-table worksheet-function vba


    【解决方案1】:

    我使用 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
    

    现在我可以随心所欲地创建图表了 :-)

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 2018-03-11
      • 1970-01-01
      • 2018-03-30
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多