我想要做的是这样的:
- 用一个单元格计算特定列中存在的项目数,例如 C1 = 129
- 让第二个单元格使用该数字作为定义的一部分,例如 D1 = AVERAGE($A$1:$A$(C1)),意思是 ($A$1:$A$129)
我这样做的原因是:
我有一个从另一个网站抄袭来的公式,用于计算列中不同项目的数量。此公式不允许空白,并且(据我所知)也无法允许空白。我在每周报告中使用此公式,列中的项目数量每周都在变化。我不想像现在这样在多个使用位置手动更改值,而是直接放入新数据,让工作表计算项目数量,然后在抄袭的公式中使用该数字。
以下是所讨论的抄袭公式:
=SUM(IF(FREQUENCY(MATCH(Data!A2:A100,Data!A2:A100,0),MATCH(Data!A2:A100,Data!A2:A100,0))>0,1))
其中“A100”是本周数据填充列的底部范围。下周可能是 A200 或 A50。但是,对于本周,如果我将 A100 更改为 A101(其中不存在数据),公式将失败,并出现“值不可用错误”。
有什么方法可以满足我的需要吗?
答案1
简而言之,该公式=INDIRECT("A1")
返回任何价值包含在单元格中A1
。因此,您需要做的就是,用"A1"
您用来计算单元格行/列的任何计算结果来替换该静态值,而不是替换该静态值。整个公式的结果将是价值包含在工作表函数参数中指定的单元格内INDIRECT()
。
这是一个简单的例子
单元格 A1 的值 = 1
单元格 A2 的值 = 2
单元格 A3 的值 = 3
单元格 A4 的值 = 空白/空 单元
格 A5 的值 = =COUNT(A1:A3)
(将其替换为您抄袭的公式)
单元格 A6 的值 ==AVERAGE($A$1:INDIRECT("$A$" & INDIRECT("A5")))
如果您想了解其工作原理,请转到公式 -> 计算公式并逐步执行计算。基本上,它将字符串“$A$”与值“3”连接起来。“3”来自价值单元格 A5 的值为 3,因为在本例中,计数 3 个单元格返回 3。然后我们INDIRECT()
第二次调用,以获得价值,$A$3
但实际上返回的是单元格引用!如果您不相信我,请评估公式并观察 ExcelINDIRECT("$A$3")
在评估过程中将调用转换为什么。这很奇怪,但它有效——INDIRECT()
根据它是输出到范围引用还是输出到值,其行为会有所不同。
答案2
可以修改原始公式以允许(但不计算)空白,即此版本
=SUM(IF(FREQUENCY(IF(Data!A2:A100<>"",MATCH(Data!A2:A100,Data!A2:A100,0)),ROW(Data!A2:A100)-ROW(Data!A2)),1))
使用 CTRL+SHIFT+ENTER 确认
.....但你可能也想尝试这个 - 更短,不需要“数组输入”
=SUMPRODUCT((Data!A2:A100<>"")/COUNTIF(Data!A2:A100,Data!A2:A100&""))
答案3
您也INDIRECT
可以考虑使用INDEX
。假设您的计数在 J3 中,数据在 A 列中,此公式将对所有元素求和:=SUM(A2:INDEX(A2:A10000,J3))
对于您的具体问题,这应该有效:
=SUM(IF(FREQUENCY(MATCH(数据!A2:INDEX(A2:A10000,J3),数据!A2:INDEX(A2:A10000,J3),0),MATCH(数据!A2:INDEX(A2:A10000,J3),数据!A2:INDEX(A2:A10000,J3),0))>0,1))
INDEX
相比而言,其巨大优势INDIRECT
在于非挥发性并且通常计算速度更快。非易失性意味着 Excel 仅在任何前任发生更改时才需要计算公式。INDIRECT
但是,将在工作簿中进行任何计算/更改时进行计算 - 因此,尤其是在大型模型中,这会显著减慢模型速度!