我希望能够将表格粘贴到工作表中,然后计算每行之间的值差。但是表格的长度未知,所以我希望差值计算的行数自动更新为输入的新表格的长度。
我能够使用计数函数来获取表的长度,但是我不确定如何使用计算的长度来调整计算差异的行范围。
答案1
=INDIRECT(...)
将获取参数值(文本/字符串)并将其用作单元格引用或范围。
答案2
如果我正确理解了您想要实现的目标,那么您似乎正在寻找一个根据数据大小自动溢出的公式。假设您的值存储在范围内A1:A6
(请参阅下面的示例数据),您可以组合VSTACK()
、INDEX()
和,SEQUENCE()
如下所示(公式在单元格中B2
;输出在下表中):
=VSTACK("",
INDEX(A:A,SEQUENCE(COUNTA(A:A)-2,,2))-
INDEX(A:A,SEQUENCE(COUNTA(A:A)-2,,3)))
首先,VSTACK()
只需要将最终结果移动一行,前提是您不计算第一个值的差值,因为上面的值是“col_a”。第一个INDEX()
andSEQUENCE()
组合用于获取从第一个值到第 n-1 个值的所有值,即下表中的值 5 到 12。col_a
第二个INDEX()
andSEQUENCE()
组合用于获取从第二个值到最后一个值的所有值,即下表中的值 9 到 4 col_a
。
该INDEX()
函数非常简单,只是根据指定的行/列返回指定范围内的值。因此,在您的情况下,您想要返回范围中的值A:A
。在这种情况下,棘手的部分是动态性质,因为您想要根据输入数据的大小返回行。因此,我们使用一个COUNTA()
语句来计算指定范围内非空单元格的数量。根据下面指定的数据,将=COUNTA(A:A)
返回值 6。此值用于创建一个序列,特别是指定我们要在序列中使用的行数。假设我们有一个标题,并且不想分别包含最后一行(第一行)的值,我们需要将这个数字减少 2。此外,我们希望序列从第 2 行(3)开始以排除标题和第一个值(对于第二个序列)。因此,第一个=SEQUENCE(COUNTA(A:A)-2,,2)
语句将返回以下数组{2;3;4;5}
。这些正是我们想要在语句中返回的行INDEX()
。
结合这些语句,您将得到下表中指定的连续行之间的差异diff_a
。对于第一种情况,它将是 ,5-9 = -4
依此类推。
如果您现在在 A 列中添加/删除数据点,则存储在单元格中的公式B2
将自动溢出到数据的相应数组中。请注意,这假设 A 列仅包含您真正用于计算的值。如果该列包含以下其他值或表格,则会扰乱函数的计算COUNTA()
。
数据和结果:
可乐 | diff_a |
---|---|
5 | |
9 | -4 |
10 | -1 |
12 | -2 |
4 | 8 |