需要Excel SUBTOTAL有条件地使用不同列的总和

我有一个相当简单的Excel 2007工作表,有三列; 名称(列A),值1(列B)和值2(列C)。 这个工作表通常会由名称栏自动过滤。

在第二列的底部,我想要执行一个有条件的B列,尊重任何filter,使用以下规则:如果对于给定的行列B是0,则使用列C中该行的值, 否则, C列应该被忽略。

ABC 1 Name Value1 Value2 2 Bob 100 6 <-- use 100, ignore 6 in Col C because B is non-zero 3 Bob 200 <-- use 200 4 Bob 0 50 <-- Col B=0, use C, thus 50 (and so on) 5 Bob 300 6 Ralph 10 7 Ralph 20 1 <-- use 20 from col B, ignore col 6. 8 Ralph 0 60 9 Ralph 50 10 Mary 1000 11 Mary 1200 12 Mary 0 250 13 Mary 1040 14 Subtotal 4280 

现在,我可以用公式得到我想要的总价值

= SUMPRODUCT( – (B2:B13 = 0),C2:C13)+ SUBTOTAL(9,B2:B13)

但是SUMPRODUCT的使用阻止它遵守隐藏/过滤的单元格要求,例如,过滤掉Mary不会导致总数减less3690. SUBTOTAL不能使用(B2:B13 = 0)数组引用。 所以我脑海中很大一部分都在试图告诉我,我可以变得亲近,但实际上不能到达那里。 但是我(太?)固执地放弃那个快:)

我的一部分是想说如果不深入研究VBA,就不能直接完成,如果可能的话,我宁愿避免使用这种解决scheme。 我认为值得在这个问题上寻求一些其他的眼球,以指出一个我可能看不到的解决scheme。

编辑1:我应该指出的一个显而易见的解决scheme是简单地添加一个简单的IFexpression式的第四列,然后SUBTOTAL。 这当然有效,但我不能适应这种情况。 这里所示的表格仅仅是一个更大的,高度结构化的工作表的代表性摘录,因此添加任意列不是一个选项。

编辑2:我提供的示例数据允许一个简单的推论,所有列的直SUBTOTAL将解决问题,但从中提取此数据的真实世界的数据可能包括列C的值,即使列B是non-零。 在这种情况下,C列必须被忽略 – B列(如果有的话)总是胜过。 我已经修改了相应的原始数据表。

要做到这一点公式诀窍是使用OFFSET返回一个“数组范围”,每一个单一的单元格,然后我们可以使用SUBTOTAL查询每个单元格,即使用这个“数组公式”

编辑 – 根据丹尼尔Otykier的评论 – 没有看到原来的…..

=SUM(IF(SUBTOTAL(2,OFFSET(B2,ROW(B2:B13)-ROW(B2),0)),IF(B2:B13=0,C2:C13,B2:B13)))

CTRL+SHIFT+ENTER

假设B2:B13按照给定的例子被完全填充

编辑:你也可以使用这个不需要“数组入口”的版本

=SUMPRODUCT(SUBTOTAL(9,OFFSET(C2,ROW(C2:C13)-ROW(C2),0)),(B2:B13=0)+0)+SUBTOTAL(9,B2:B13)

这个SUBTOTAL/OFFSET用法是由Laurent Longre开发的 – 请看这里

我放弃了,并辞去了基于VBA的UDF:

 Function DifColSubTotal(Range1 As Range, Range2 As Range) As Single Dim c As Range Dim sum As Single Dim col_offset As Long col_offset = Range2.Column - Range1.Column For Each c In Range1 If c.Height > 0 Then If ((c.Value = 0) Or (c.Value = "")) Then sum = sum + c.Offset(0, col_offset) Else sum = sum + c.Value End If End If Next DifColSubTotal = sum End Function 

结果在这里:

在这里输入图像说明