高效的数据透视/数据比较

时间:2012-09-28 16:03:57

标签: excel vba excel-vba

我对VBA很新,但我有编程背景。我正在编写VBA来打开两个excel工作簿,复制数据透视表并将特殊值粘贴到一个临时工作簿中。从那里,我需要比较枢轴数据并输出差异。但是,我不知道从那里去哪里。

示例数据

Pivot 1

Sum of Fruits          YearMon
Category       Group   201205 201206 201207 201208 201209 ... 201401
Apples         Green                    1.3    2.1    3.0 ...
               Red                      1.0    1.5    2.0 ...
Apples Total                            ..     ..     ..  ...
Berries        Straw        1      1    1.1    2.0    2.1 ...
               Black        1      1    1.0    0.9    0.9 ...
Berroes Total                           ..     ..     ..  ...

Pivot 2

Sum of Fruits          YearMon
Category       Group   201206 201207 201208 201209 201210 ... 201402
Apples         Green                    1.5    2.3    3.2 ...
               Red                      0.8    1.3    1.9 ...
               Yellow              1    0.9    0.9      1 ...
Apples Total                            ..     ..     ..  ...
Berries        Straw        1      1    1.3    1.8    2.1 ...
               Black        1      1    0.9    0.8    0.8 ...
Berroes Total                           ..     ..     ..  ...

所需结果(Pivot 2 - Pivot 1)

Sum of Fruits          YearMon
Category       Group   201205 201206 201207 201208 201209 201210 ... 201402
Apples         Green                          -0.6   -0.7        ...
               Red                            -0.7   -0.7        ... 
Apples Total                            ..     ..     ..         ...
Berries        Straw               0   -0.1   -0.7   -0.3        ...
               Black               0      0      0   -0.1        ...
Berries Total                           ..     ..     ..         ...

我的第一个冲动是根据每个YearMonGroupCategory放入数组中,然后循环遍历它们以删除两个枢轴中不存在的属性(即黄色) Pivot 1中不存在apples,并且201402没有数据。然后我会遍历每个组并进行计算。听起来太乱了。

我目前正在考虑为YearMonGroup创建一个范围,然后为每个Category在垂直和水平范围内循环,以比较这些值。我不确定如何确切地找到每个Category停止的位置,或者我是否可以使用VLOOKUP?或者是否有一些更简单的方法来比较两个支点?

更新1

大多数评论建议我尝试使用数据透视后面的源数据来完成此任务。我能够获得数据并遵循上面的方案,如下所示:

数据1

Category Group YearMon Value
Apples   Green 201207  1.3
Apples   Green 201208  2.1
Apples   Green 201209  3.0
Apples   Red   201207  1.0
Apples   Red   201208  1.5
Apples   Red   201209  2.0
Berries  Straw 201205  1.0
Berries  Straw 201206  1.0
Berries  Straw 201207  1.1
Berries  Straw 201208  2.0
Berries  Straw 201209  2.1
Berries  Black 201205  1.0
Berries  Black 201206  1.0
Berries  Black 201207  1.0
Berries  Black 201208  0.9
Berries  Black 201209  0.9

数据2

Category Group YearMon Value
Apples   Green  201208  1.5
Apples   Green  201209  2.3
Apples   Green  201210  3.2
Apples   Red    201208  0.8
Apples   Red    201209  1.3
Apples   Red    201210  1.9
Apples   Yellow 201207  1.0
Apples   Yellow 201208  0.9
Apples   Yellow 201209  0.9
Apples   Yellow 201210  1.0
Berries  Straw  201206  1.0
Berries  Straw  201207  1.0
Berries  Straw  201208  1.3
Berries  Straw  201209  1.8
Berries  Straw  201210  2.1
Berries  Black  201206  1.0
Berries  Black  201207  1.0
Berries  Black  201208  0.9
Berries  Black  201209  0.8
Berries  Black  201210  0.8

按照以下建议尝试SUMIFS后,似乎我需要为每个数据集指定每个条件(Category,Group,YearMon)以进行比较。也许还有一些其他功能可行吗?

更新2

另一个建议是组合数据集来计算枢轴中的差异。在组合这两个数据集之后,我似乎无法找到一种方法来进行差异计算,而不包括标识每个数据集(1或2)的另一列。从那里我可以做比较。我做错了吗?

更新3

根据下面的答案,我只是否定了第二个数据集的值来获得差异。

2 个答案:

答案 0 :(得分:2)

这可能会对您有所帮助:

=INDEX($B$11:$H$14,MATCH($A18,$A$11:$A$14,0),MATCH(B$17,$B$10:$H$10,0))-(INDEX($B$3:$H$7,MATCH($A18,$A$3:$A$7,0),MATCH(B$17,$B$2:$H$2,0)))

我认为没有任何内置功能可以组合数据透视表。因此,通常问题似乎不是透视表特定的 - 而是如何组合/减去/添加两个单独的数据表。

SubtractTwoTables

不确定您是否在寻找VBA解决方案,但这是使用(极其冗长的)电子表格公式进行此操作的一种方法。您也可以使用像Scott所提到的SUMIF公式,或者只使用原始数据。祝你好运。

答案 1 :(得分:1)

要证明我的建议。获取数据1,将所有数量乘以-1,然后将数据2添加到其中,为您提供:

Combined Data

根据组合数据执行数据透视表可以:

New Pivot Table

对于您想要的任何行/列组合,数据透视表SUM会为您带来不同。诀窍是将一个数据集乘以-1

技巧:在新单元格中键入-1,在该单元格上键入Ctrl-C,然后选择数据1组中的所有值,然后选择“选择性粘贴”并选择“乘法”