3

我有一个相当简单的 Excel 2007 工作表,其中包含三列;名称(A 列)、Value1(B 列)和 Value2(C 列)。此工作表通常会按名称列自动过滤。

在第二列的底部,我想执行 B 列的条件小计,遵守任何过滤器,遵循以下规则:如果给定的行 B 列为 0,则使用 C 列中该行的值,否则,应忽略 C 列。

      A         B         C       
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)+小计(9,B2:B13)

但是使用 SUMPRODUCT 会阻止它满足隐藏/过滤单元格的要求,例如过滤掉 Mary 不会导致总数下降 3690。并且 SUBTOTAL 不能使用 (B2:B13=0) 数组引用。所以我大脑的一个很好的部分试图告诉我我可以接近,但真的无法到达那里。但我(也是?)固执地放弃了这么快:)

我的一部分试图说如果不深入研究 VBA 就无法直接完成,如果可能的话,我希望避免这种解决方案。我认为值得就这个问题征求其他一些人的意见,以便指出一个我只是看不到的(可能非常简单的)解决方案。

编辑 1:我应该指出的一个明显的解决方案是简单地添加带有简单 IF 表达式的第四列,然后 SUBTOTAL 。这当然有效,但我无法适应这种情况。此处所示的表格只是从更大的、高度结构化的工作表中提取的代表性摘录,因此不能选择添加任意列。

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

4

2 回答 2

3

我放弃并辞去了基于 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

结果在这里:

在此处输入图像描述

于 2013-01-28T18:21:02.353 回答
3

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

编辑- 根据 Daniel 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 开发的 - 见这里

于 2013-01-28T21:15:36.387 回答