【发布时间】:2020-08-17 18:57:10
【问题描述】:
我在 Excel 中有一个表,它经常使用OFFSET 来获取相对于另一列的列。这是允许我动态调整表格大小的必要条件。
例如,在MyTable 的单元格D5 中,我有一个这样的公式 - 其中 D$2 是表格的第一行
=INDEX(
OFFSET(
D$2,
0,
(- OffsetDistance ),
ROWS(
MyTable
)
),
MATCH(
LARGE(
OFFSET(
D$2,
0,
(- 1 ),
ROWS(
MyTable
)
),
ROW() -
ROW(
MyTable[#Headers]
)
),
OFFSET(
D$2,
0,
(- 1 ),
ROWS(
MyTable
)
),
0
)
)
现在我听说“OFFSET 很慢,因为它易变”。这就像说RAND() 很慢;生成随机数并不慢,与排序列表或搜索子字符串相比没有任何意义 - 缓慢是因为工作表经常重新计算。
我想知道,使用 OFFSET 函数比使用 Range 文字慢多少。基本上,我在灵活性和能够动态调整表格大小与更快的硬编码偏移之间进行权衡。
所以一般来说,OFFSET 本身是否可能是工作表中缓慢的根源?我想不会,因为我猜这是一个 O(1) 操作,只需将几个数字相加即可。但我想不出如何量化这个
【问题讨论】:
-
我认为大 O 与
OFFSET和RAND的缓慢程度无关 - 在修改工作表中的任何单元格后,它们都必须重新计算 => 他们可以减慢插入新数据、更改自动过滤条件和其他看似无关的操作 -
关键是,只要在工作表中计算任何内容,就会执行一个 volatile 函数。显然,您是执行一个这样的函数还是每行一个,以及您有 300 行还是 130 万行都存在差异。我建议您忽略警告,直到您觉得您的工作表反应迟缓。请记住,您最终可能会注意到的缓慢响应似乎与您怀疑的功能无关。 OFFSET() 本身很少会导致工作表计算。但是当其他事情发生时,它会重新计算。
-
OFFSET 本身非常快,其波动性可能是问题所在。我曾经用超过 10000 个 OFFSET 公式制作了一个工作簿,计算起来非常快。
-
它们不应该——如果结果没有改变,则依赖项不应该重新计算(除非 Excel 的优化非常糟糕,可能是这种情况,但我希望不会)
-
@Aprillion 刚刚测试过,你所说的对于带有
Application.Volatile的 UDF 来说是 True,但它每次都返回相同的值,但奇怪的是 OFFSET 不是。
标签: excel performance excel-formula offset excel-2019