Excel ultra-dynamic 使用 OFFSET(...COLUMN()) 转换为 non-volatile 的范围

Excel ultra-dynamic ranges with OFFSET(...COLUMN()) to convert to non-volatile

我想我在“ultra-dynamic”范围内取得了突破。我就是这样称呼它们的,因为它们不仅是动态的;但它们也根据写入它们的单元格地址引用不同的范围!现在我需要进一步推进这个突破。那些在 Excel 中使用动态范围的人,尤其是 dynamic-range-gurus 中的人,将会很高兴阅读下面的内容,并可能有助于这一进步:

免责声明:如果您不熟悉动态范围,请不要尝试阅读下文!

背景: 我们的 sheet 单元格在顶部进行计算,在下方有一个枢轴 table。 上面的每个单元格都引用同一列中下面的主元table个单元格。 数据透视表 table 的第一列(默认标题为“行标签”)按降序从上到下排序。接下来的每一列都有不同测试的结果。 在枢轴中间行的某个位置 table 有一条“标记线”将枢轴的顶部与底部分开。 让我们将顶部称为“Uppers”,将底部称为“Downers”。 让我们将这两个部分统称为“人口”。人口是一个 non-contiguous 范围,因为将 Uppers 与 Downers 分开的“标记线”介入。

对于枢轴上方的每个单元格,都有针对恰好位于其下方的枢轴列的计算,需要引用该列本身的 Uperpers 或 Downers 或 Population。

以前,我在上面所有单元格中的公式都是下面这样的重复:

= MAX( OFFSET($A,$B+1,COLUMN()-1,$B,1) )

这个例子给出了下面同一列中唐氏体面积的最大值。

其中:

  • A79是枢轴的左上角table,
  • B5 具有标记线的行号(相对于 A79)表示我们列的 Downers 区域从该标记行下方的第一行开始(因此是“+1” ).该单元格的公式有一个 XMATCH 公式来生成结果行号。例如,如果 Uppers 是正数而 Downers 是负数,全部按降序排列,则 XMATCH 正在搜索将人口的两部分分开的 0 行。
  • COLUMN()-1 returns 当前向右偏移的列号,-1 是必需的,因为第一列是 0 而不是向右偏移 1,并且
  • B6 的行数(“高度”)到我们的 Downers 结束的枢轴的最后一行数(相对于 B5)。该单元格包含通常的 COUNTA 函数,该函数计算枢轴 table 中的行数,并从该数字中减去 B5 中标记行的数量以获得“高度”唐氏范围。

将公式的 OFFSET... 部分复制到计算高于枢轴的任何单元格时,将始终在同一列中给出唐纳区。

我们来到“超”动态部分:我测试了(它有效!)将范围命名为:

ColDowners:=OFFSET($A,$B+1,COLUMN()-1,$B,1)

然后我用涉及唐纳氏症的计算替换了所有单元格,例如:

= MAX( ColDowners )

奇迹般地,具有此命名范围 ultra-dynamic 的所有单元格都使用正确的唐氏 同一列 下方的正确值进行计算!有时,当最初加载工作簿时,单元格显示为 0 值,但当您按 F9 进行计算时,它们会立即获得正确的值(这当然不是问题)。

所以这个范围在两个方面是“动态的”:(1) 因为开始行和结束行是动态的(像往常一样)和 (2) 因为它会根据写入位置产生不同的范围!!

现在是进步。 dynamic-range-guru 的任何意见都将非常有价值:

OFFSET 是一个不稳定的函数,具有已知的性能问题。我们可以用冒号(“:”)分隔的两个 non-volatile INDEX 函数代替它吗?我知道如何命名一个范围,该范围从一个特定的单元格开始,每次都以不同的单元格结束(例如 =A5:INDEX(...COLUMN()...))。但是范围的开始和结束都可以被索引化吗?即它可以是 =INDEX(...COLUMN()...):INDEX(...COLUMN()...) 之类的东西吗?因此,如果我们用这个公式命名一个范围,它会起作用吗?

答案必须排除 INDIRECT 之类的易变函数,并且必须尽可能简单。 ultra-dynamic 范围公式的结果范围将必须不同,具体取决于它在 sheet 中写入的 COLUMN() (如上面的 OFFSET )并且将必须“能够”从 A79 以下的特定行数开始(上例中写在 B5 中的行数)并以 B6.[= 中写的行结束38=]

定义用于替换'OFFSET'公式的超动态范围的正确公式:

=OFFSET($A,$B+1,COLUMN()-1,$B,1)

是:

=INDEX($A:$XX,ROW($A)+$B+1,COLUMN()):INDEX($A:$XX,ROW($A)+$B,COLUMN())

  • 其中B7中是枢轴最后一行的编号。 (=类似于 B5+B6 plus/minus 1 或 2 - 针对您的情况进行测试)

如果您使用这个超动态公式定义动态范围的名称,它会根据您将其复制到的单元格的位置调整为您提供不同的范围!!它总是会在您的列中为您提供相同的平行范围,并且会在不同的列中产生不同的结果!我对其进行了测试,它运行良好,而且它使我的计算速度更快,因为 INDEX 是非易失性的(与 OFFSET 相对)。

以上示例的另一个提示:我还尝试了嵌套范围名称并且它们起作用了!例如,我将 ColPopulation 的范围定义为:

=(ColUppers,ColDowners)

请注意,这是一个超动态嵌套范围名称!当然,它只能对简单的函数(如=MAX(ColPopulation))起作用,而对SUMPRODUCT等需要连续范围的函数不起作用。不过,知道您可以通过添加其他带逗号的范围名称来定义范围是一件非常有用的事情!

所有相关人员的大力帮助!非常感谢!