Excel VBA:按客户端ID汇总发票,将结果复制到新工作表

时间:2010-03-31 16:29:10

标签: excel-vba vba excel

我在报告时遇到奇怪的问题:

我有很多客户有不同的已开具发票。当负数和加号中有发票时,问题就出现了:

A列包含客户唯一ID,B列发票编号,C列发票金额

A          | B          | C 

0010019991 | 1800149471 | 162.00 | 2010-03-12

0010019991 | 1800136388 | 162.00 | 2010-02-12

0010019991 | 1600008004 | -36.00 | 2010-03-15

0010021791 | 1800132148 | 162.00 | 2010-03-12

0010021791 | 1800145436 | 162.00 | 2010-02-12

0010021791 | 1600007737 | -12.00 | 2010-03-15

0014066147 | 1800119068 | 1,684.80 | 2010-03-12

0014066147 | 1800123702 | 1,684.80 | 2010-02-12

0014066147 | 1600007980 | -1,300.80 | 2010-02-15

0014066147 | 1600007719 | -1,286.40 | 2010-03-15

我需要删除带有否定发票的行,其方式是金额与没有负数的发票相加。 所以最终结果如下:

A          | B          | C      | D

0010019991 | 1800149471 | 126.00 | 2010-03-12

0010019991 | 1800136388 | 162.00 | 2010-02-12

0010021791 | 1800132148 | 150.00 | 2010-03-12

0010021791 | 1800145436 | 162.00 | 2010-02-12

0014066147 | 1800123702 | 782.40 | 2010-02-12

1 个答案:

答案 0 :(得分:0)

在G:J列中,为正行创建所有客户ID,发票编号和日期组合的列表(假设每张发票没有多行,可以通过复制粘贴A:D来完成在G:J中,按美元排序,删除负数,然后按客户ID进行排序)。

(G列:J必须按客户ID排序)然后在F列中放(从F2开始):

=SUMPRODUCT(--(G2=A$1:A$10),--(H2=B$1:B$10),--(J2=D$1:D$10),C$1:C$10)+IF(G2<>G1,SUMPRODUCT(--(G2=A$1:A$10),--(C$1:C$10<0),C$1:C$10))

上半部分找到所有具有匹配客户ID,发票和日期的行并将其相加。下半部分,如果此行客户ID不等于前一行,则必须是该客户的第一行,因此包括该客户ID的所有负美元金额,无论日期和发票编号如何。

现在在第一栏中,你将获得你真正想要的美元价值,从I2开始:

=Max(0,F2)

然后在I3(并向下拖动)Put

=MAX(SUMPRODUCT(--(G3=G$1:G3),F$1:F3)-SUMPRODUCT(--(G3=G$1:G2),I$1:I2),0)

这样做的第一步是检查在F列上方(以及包括)您当前行的客户已经归入了多少美元。然后在第I列中减去已归属于当前客户之上的当前客户的所有美元这些数字不得强制至少为0.这种方法有效地将任何负数减少到下面的线。你最终会得到:

F      G        H          I     J           
126    10019991 1800149471 126    2010-03-12 
162    10019991 1800136388 162    2010-02-12 
150    10021791 1800132148 150    2010-03-12 
162    10021791 1800145436 162    2010-02-12 
-902.4 14066147 1800119068 0      2010-03-12 
1684.8 14066147 1800123702 782.4  2010-02-12 

你仍然会有一些0左右的行,如果你想要那些消失,使用粘贴值将G:J复制到另一张表,按美元排序并删除所有0,然后按客户ID再次使用。

请注意,任何总金额为负的客户都会以全0的形式进入。