我正在使用基于SUMPRODUCT
,SUBTOTAL
和OFFSET
的公式。仅使用条件启用可见行计数。我尝试如下简单的示例数据。数据从B4
标题B3范围内的B4:B12
开始:
B Column
HD
2
2
4
6
2
1
8
9
2
公式为:
=SUMPRODUCT((B4:B12=B4)*(SUBTOTAL(103,OFFSET(B4,ROW(B4:B12)-MIN(ROW(B4:B12)),0))))
对于2的值,它给出4个计数的正确结果。 我去评估该公式以完全理解其逻辑。我可以理解其逻辑的主要部分,但是某些步骤对我而言并不十分清楚。我在下面用我的评论复制评估步骤。
步骤-1
=SUMPRODUCT(({2;2;4;6;2;1;8;9;2}=2)*(SUBTOTAL(103,OFFSET(B4,ROW(B4:B12)-MIN(ROW(B4:B12)),0))))
好
步骤-2
=SUMPRODUCT(({TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE})*(SUBTOTAL(103,OFFSET(B4,ROW(B4:B12)-MIN(ROW(B4:B12)),0))))
好
STEP-3
=SUMPRODUCT(({TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE})*(SUBTOTAL(103,OFFSET(B4,ROW(B4:B12)-MIN(ROW(B4:B12)),0))))
好
STEP-4
=SUMPRODUCT(({TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE})*(SUBTOTAL(103,OFFSET($B$4,{4;5;6;7;8;9;10;11;12}-MIN({4;5;6;7;8;9;10;11;12}),0))))
好
STEP-5
=SUMPRODUCT(({TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE})*(SUBTOTAL(103,OFFSET($B$4,{4;5;6;7;8;9;10;11;12}-4),0))))
好
STEP-6
=SUMPRODUCT({TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE}*(SUBTOTAL(103,OFFSET($B$4,{0;1;2;3;4;5;6;7;8},0))))
为什么{0;1;2;3;4;5;6;7;8}
??
STEP-7
=SUMPRODUCT({TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE}*(SUBTOTAL(103,{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;})))
为什么{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;}
?
STEP-8
=SUMPRODUCT({TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE}*({1;1;1;1;1;1;1;1;1}))
如何用1
代替#VALUE!
步骤9
=SUMPRODUCT({1;1;0;0;1;0;0;0;1})
好
步骤-10
4
好
我在以下几点上不太清楚
STEP-6:为什么选择{0;1;2;3;4;5;6;7;8}
STEP-7:为什么选择{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;}
STEP-8:如何用1
代替#VALUE!
希望有人可以帮助阐明这些提到的问题背后的逻辑。请原谅我要求澄清这种琐碎的事情。
答案 0 :(得分:3)
STEP-6:为什么选择{0;1;2;3;4;5;6;7;8}
因为{4;5;6;7;8;9;10;11;12}-4
的值为{4-4;5-4;6-4;7-4;8-4;9-4;10-4;11-4;12-4}
的{{1}}
STEP-7:为什么选择{0;1;2;3;4;5;6;7;8}
在数组上下文中,公式求值器无法通过{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!}
= OFFSET($B$4,{0;1;2;3;4;5;6;7;8},0)
从9个单元格引用中获取值。但这没关系,因为:
STEP-8:如何用{$B$4;$B$5;$B$6;$B$7;$B$8;$B$9;$B$10;$B$11;$B$12}
代替1
#VALUE!
是一个SUBTOTAL(103,...
小计,对于在步骤7中获得的9个单元格引用中的每个单个单元格引用,如果未隐藏则为1,否则为0。因此无所谓是否评估单元格值。
顺便说一句:使用
可以实现相同的效果COUNTA
注释:
这些公式是反复试验的结果。我怀疑任何=SUMPRODUCT((B4:B12=B4)*(SUBTOTAL(103,INDIRECT("B"&ROW(B4:B12)))))
程序员都能够预测他们实现的功能的所有用法。 Excel
函数的用法很普遍,超出了原本他们的想象范围。
奖金:
Excel
使用您在=SUMPRODUCT(OFFSET(B4,ROW(B4:B12)-MIN(ROW(B4:B12)),0))
中的值得出0。
此处,公式求值器也无法从数组上下文中通过B4:B12
= OFFSET($B$4,{0;1;2;3;4;5;6;7;8},0)
获取的9个单元格引用中获取值。结果是{$B$4;$B$5;$B$6;$B$7;$B$8;$B$9;$B$10;$B$11;$B$12}
。但是现在很重要,因为我们需要这些值。
在这种情况下,我们可以使用{#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!}
函数来强制获取值
N
结果为36,即=SUMPRODUCT(N(OFFSET(B4,ROW(B4:B12)-MIN(ROW(B4:B12)),0)))
中的值之和。