excel - Excel 超动态范围与 OFFSET(...COLUMN()) 转换为非易失性
问题描述
我认为我在“超动态”范围方面取得了突破。我就是这样称呼它们的,因为它们不仅是动态的,而且是动态的。而且它们还根据写入它们的单元格地址来引用不同的范围!现在我需要进一步推进这一突破。那些在 Excel 中使用动态范围的人,尤其是动态范围专家,将会很高兴阅读下面的内容,并且可能有助于这一进步:
免责声明:如果您不熟悉动态范围,请勿尝试阅读以下内容!
背景:我们的工作表具有顶部的计算单元格和下方的数据透视表。上面的每个单元格指的是同一列中下面的数据透视表单元格。数据透视表的第一列(默认为“行标签”)按降序从上到下排序。接下来的每一列都有不同测试的结果。在数据透视表中间行的某处,有一条“标记线”将数据透视表的顶部与底部分开。让我们称顶部为“上部”,底部为“向下”。让我们将这两个部分统称为“人口”。人口是一个不连续的范围,因为将上部与唐纳分开的“标记线”介入。
对于枢轴上方的每个单元格,正好在下方的枢轴列的计算需要引用列本身的上层或下层或人口。
以前,我在上面所有单元格中的公式都是重复以下内容:
= MAX( OFFSET($A$79,$B$5+1,COLUMN()-1,$B$6,1) )
此示例在下面的同一列中给出了 Downers 的最大面积。
在哪里:
A79
是数据透视表的左上角,B5
具有标记线的行号(相对于A79
),表示我们列的 Downers 区域从该标记行下方的第一行开始(因此为“+1”)。该单元格的XMATCH
公式具有生成结果行号的公式。例如,如果 Uppers 是正数而 Downers 是负数,全部按降序排序,XMATCH
则搜索0
将人口的两个部分分开的行。COLUMN()-1
返回当前列的向右偏移的编号,并且 -1 是必需的,因为第一列是 0 而不是向右偏移 1,并且B6
有行数(“高度”)到B5
我们的 Downers 结束的枢轴(相对于 )的最后一行数。COUNTA
该单元格包含计算数据透视表中行数的常用函数,并从该数字中减去标记行的数量B5
以获得 Downers 范围的“高度”。
将公式的OFFSET...
一部分复制到具有高于枢轴的计算的任何单元格时,将始终在同一列中给出唐纳区域。
在这里,我们来到了“超”动态部分:我测试了(它有效!)将一个范围命名为:
冷饮:=OFFSET($A$79,$B$5+1,COLUMN()-1,$B$6,1)
我用引用 Downers 的计算替换了所有单元格,例如:
= MAX( ColDowners )
奇迹般地,所有具有此命名超动态范围的单元格都在同一列中使用正确的 Downers 值进行计算!有时,当最初加载工作簿时,单元格显示为 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())
- 其中 in
B7
是枢轴的最后一行的编号。(=像B5+B6
加/减 1 或 2 之类的东西 - 针对您的情况进行测试)
如果您使用此超动态公式定义动态范围的名称,它将适应为您提供不同的范围,具体取决于您将其复制到的单元格的位置!它总是会在您的列中为您提供相同的平行范围,并且会在不同的列中产生不同的结果!我对其进行了测试,它运行良好,而且它使我的计算速度更快,因为INDEX
它是非易失性的(而不是OFFSET
)。
上面示例的另一个提示:我还尝试了嵌套范围名称并且它们有效!例如,我将 ColPopulation 的范围定义为:
=(ColUppers,ColDowners)
请注意,这是一个超动态嵌套范围名称!当然,它只能用于简单的函数(例如=MAX(ColPopulation)
),而不能SUMPRODUCT
用于需要连续范围的函数。尽管如此,知道您可以通过使用逗号添加其他范围名称来定义范围是一件非常有用的事情!
来自所有相关人员的大力帮助!非常感谢!
推荐阅读
- excel - 我需要在多张纸上复制特定范围并将它们粘贴到最后一张纸上
- r - how to design a reactive visualization graph for a time series using shiny?
- git - Index size exceeded 5GB
- reactjs - Firebase UI stops changing language in React app
- excel - Excel:如何在运行 context.sync() 之前确定单元格是否处于编辑模式
- mysql - 重新索引MySQL数据库相关表的主键
- flutter - 将 StatelessWidget 与方法变量或有状态小部件一起使用?
- java - 查找特定字符串正则表达式
- geometry - 有没有办法在二十面体的所有面上都有相同的图案?
- python - 如何在 IPython 笔记本中运行单元后清除内存