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

需要Excel小计有条件地使用不同列的总和,excel,subtotal,Excel,Subtotal,我有一个相当简单的Excel 2007工作表,有三列;名称(a列)、值1(B列)和值2(C列)。此工作表通常会按“名称”列自动筛选 在第2列的底部,我想对B列执行条件小计,以符合任何筛选器,并遵循以下规则:如果给定行的B列为0,则使用C列中该行的值,否则,应忽略C列 abc 1名称值1值2 2 Bob 100 6我放弃了,并向基于VBA的UDF辞职: Function DifColSubTotal(Range1 As Range, Range2 As Range) As Single Di

我有一个相当简单的Excel 2007工作表,有三列;名称(a列)、值1(B列)和值2(C列)。此工作表通常会按“名称”列自动筛选

在第2列的底部,我想对B列执行条件小计,以符合任何筛选器,并遵循以下规则:如果给定行的B列为0,则使用C列中该行的值,否则,应忽略C列

abc
1名称值1值2

2 Bob 100 6我放弃了,并向基于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
结果如下:


要使用公式执行此操作,诀窍是使用OFFSET返回一个“范围数组”,每个范围都是一个单元格,然后我们可以使用小计单独查询每个单元格,即使用此“数组公式”

编辑——根据Daniel Otykier的评论——最初没有看到

=总和(如果(小计(2,偏移量(B2,行(B2:B13)-行(B2,0)),如果(B2:B13=0,C2:C13,B2:B13)))

CTRL+SHIFT+ENTER确认

假设已根据给出的示例完全填充
B2:B13

编辑:您也可以使用此版本,它不需要“数组条目”

=SUMPRODUCT(小计(9,抵销(C2:C13)行-第(C2)行,0)),(B2:B13=0)+0)+小计(9,B2:B13)


小计/抵销的用法是由Laurent Longre开发的-见

我现在没有答案,但该死的图标…哈哈,这是我在大约18个月内接近的一个…该死的饮食:)为什么不简单地添加另一列
=IF(B2=0,C2,B2)
然后小计?用于说明的示例表是从一个更大的电子表格中提取的,该电子表格具有非常特定的格式,因此我没有添加列的选项。这是一个非常明显的考虑,我应该在最初的博文《好渔获量》中提到。也许这里有一个解决方案:我非常感谢你的时间和努力。非常感谢。我想对于单细胞方案,这是唯一可能的解决方案,公式对于这种情况是无能为力的+1.这似乎有效!我以前看过被引用的站点,并对行/偏移技巧进行了大量实验,试图在表达式中加入IF以利用每单元格的计算,但Excel不断对此提出抱怨。原来我只是把IF放错地方了!!非常感谢。这看起来正是我所希望的。没问题-我还添加了一个更接近您的原始版本,它不需要“数组条目”。。。。。。
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