具有偏移量的 Excel 超动态范围(..COLUMN()) 转换为非易失性



我想我在"超动态"范围方面取得了突破。这就是我所说的,因为它们不仅是动态的;但它们也根据写入它们的单元格地址引用不同的范围!现在我需要进一步推进这一突破。那些在Excel中使用动态范围的人,尤其是动态范围大师,将很高兴阅读以下内容,并可能有助于这一进步:

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

背景: 我们的工作表顶部有带有计算的单元格,下面是一个数据透视表。 上面的每个单元格都引用同一列中下面的数据透视表单元格。 数据透视表的第一列(默认情况下标题为"行标签")按降序从上到下排序。接下来的每一列都有不同测试的结果。 在数据透视表中间行的某个点上有一条"标记线",将透视表的顶部与底部分开。 让我们称顶部为"上部",下部称为"唐纳斯"。 让我们把这两部分一起称为"人口"。人口是一个不连续的范围,因为将上层与唐纳斯分开的"标记线"介入了。

对于透视表上方的每个单元格,正下方都有枢轴列的计算,这些计算需要引用列本身的上部或唐纳斯或人口。

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

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

此示例给出了下面同一列中唐纳斯面积的最大值。

哪里:

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

当公式的OFFSET...部分复制到任何具有枢轴上方计算的单元格时,将始终在同一列中给出唐纳的面积。

在这里,我们来到"超"动态部分:我测试了(它有效!)将范围命名为:

科尔唐斯:=OFFSET($A$79,$B$5+1,COLUMN()-1,$B$6,1)

我用引用唐纳斯的计算替换了所有单元格,如下所示:

= MAX( ColDowners )

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

因此,此范围在两个方面是"动态"的:(1) 因为开始和结束行是动态的(像往常一样)和 (2) 因为它根据写入的位置导致不同的范围!!

现在是进步。任何动态范围大师的输入都将非常有价值:

OFFSET是一个具有已知性能问题的易失性函数。我们可以用两个用冒号 (":") 分隔的非易失性INDEX函数替换它吗?我知道如何命名一个范围,该范围从特定单元格开始,每次都以不同的单元格结尾(例如。=A$155:INDEX(...COLUMN()...))。但是范围的开始和结束都可以索引化吗?即它可以像=INDEX(...COLUMN()...):INDEX(...COLUMN()...).因此,如果我们用这个公式命名一个范围,它会起作用吗?

答案必须排除像INDIRECT这样的易失性函数,并且必须尽可能简单。超动态范围公式的结果范围必须有所不同,具体取决于它在工作表中写入的COLUMN()(如上面的OFFSET),并且必须"能够"从A79以下的特定行数开始(上面示例中以B5书写的数字)并以B6书写的数字结束。

定义用于替换"偏移"公式的超动态范围的正确公式:

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

是:

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

  • 其中B7是透视表最后一行的编号。(=类似于B5+B6加/减 1 或 2 - 针对您的情况进行测试)

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

上面示例的另一个提示:我也尝试了嵌套范围名称,它们有效!例如,我将 ColPopulation 的范围定义为:

=(ColUppers,ColDowners)

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

所有相关人员的大力帮助!多谢!

相关内容

最新更新