HotXLS 文档

INDEX 区域选择与引用身份

HotXLS 文档 · 计算与转换保真度

版本 2.384.101 扩展了 INDEX(source,row_num,column_num,area_num),让它对计算数组接受第四个参数,并通过定义名称与 LET 组合受支持的真实多区域引用;行、列与区域选择器可以一起广播

单个计算数组或多个引用区域

常量或计算数组算作一个源区域,因此 INDEX(SEQUENCE(2,2),2,2,1) 返回 4;完全省略第四个参数同样选择区域 1,而显式留空的第四个参数是无效的区域选择器

引用并集可以包含同一工作表上的多个真实工作表区域;area_num 按并集顺序选择区域,行号与列号在该选定区域内生效

下面的示例中,Source!A1:B2 包含 {1,2;3,4},Source!D1:E2 包含 {10,20;30,40};Other!A1:B2 包含 {100,200;300,400}

公式结果
INDEX((Source!A1:B2,Source!D1:E2),2,2,2)40,保留标量引用结果
SUM(INDEX((Source!A1:B2,Source!D1:E2),0,0,2))100,对完整的第二区域求和
INDEX(SEQUENCE(2,2),0,0,1){1,2;3,4},一个计算得到的值数组
INDEX(SEQUENCE(2,2),2,2,2)#REF!,因为计算数组没有第二个区域

定义名称、LET 与 CHOOSE

表达式为 (Source!$A$1:$B$2,Source!$D$1:$E$2) 的受支持本地定义名称保留两个区域;嵌套名称保留该身份,AREAS(NamedAreas) 返回 2

INDEX(NamedAreas,2,2,2) 返回 40,而 ISREF(INDEX(NamedAreas,0,0,2)) 返回 TRUE;ROW、COLUMN、ROWS、COLUMNS 与聚合类消费者继续使用选定引用的坐标

相对引用名称在每个使用位置解析,工作表级名称优先于同拼写的工作簿级名称;保留引用身份并不会把相对名称冻结在首次求值的位置

LET(areas,(Source!A1:B2,Source!D1:E2),INDEX(areas,2,2,2))
LET(areas,(Source!A1:B2,Source!D1:E2),ISREF(INDEX(areas,0,0,2)))

这两个表达式分别返回 40 与 TRUE;绑定到 SEQUENCE(2,2) 的仍是计算得到的值数组,不会获得引用身份

选择真实引用的标量 CHOOSE 保留被选中的引用,包括跨表选择:INDEX(CHOOSE(2,Source!A1:B2,Other!A1:B2),2,2) 返回 400,对应的标量引用结果能通过 ISREF

带数组选择器的 CHOOSE 按选择器方向组合值,而不是构建引用区域并集;CHOOSE({1,2},Source!A1:B2,Source!D1:E2) 返回 {1,20;3,40},此时再加值为 2 的 INDEX 区域选择器仍返回 #REF!

三个选择器数组

行、列与区域选择器都接受标量或数组;单元素维度广播,行与列方向相反时构成叉积,方向一致时按位置配对;形状不等时未匹配的位置包含独立的 #N/A 错误

INDEX((Source!A1:B2,Source!D1:E2),{1;2},2,{1,2})
INDEX((Source!A1:B2,Source!D1:E2),2,2,{2;1})

第一个表达式返回 {2,20;4,40},第二个返回 {40;4};被选中的值保留其字符串、布尔、数字和类型化错误表示

任一选择器是数组时,结果是值数组而不是引用;行或列为零、或者省略行/列选择器时,在每个结果位置选取该轴的第一个成员

这与纯标量提取不同:两个标量行零和列零返回整个选定区域,但 INDEX((Source!A1:B2,Source!D1:E2),0,0,{1,2}) 返回 {1,10},而不是两个嵌套的 2×2 数组;其和为 11

区域强制转换与错误

区域选择器把小数数值向零截断,并接受数字文本和布尔值;1.9、"1" 与 TRUE 都选择区域 1

区域零、FALSE、显式留空的第四个参数、负值以及截断后为零的小数都返回 #VALUE!;非数字文本同样返回 #VALUE!,而超出可用区域数的正区域编号返回 #REF!

类型化的选择器错误按其原有错误码传播;对数组选择器而言,无效区域只在其对应的结果位置产生错误,因此 INDEX(SEQUENCE(2,2),2,2,{1,2}) 返回 {4,#REF!}

既有错误不会被后续的边界检查覆盖:INDEX(#N/A,1,1,2) 返回 #N/A,INDEX(SEQUENCE(2,2),#N/A,1,#DIV/0!) 保留行选择器的 #N/A

由既有本地工作表限定的无效引用仍是 #REF!,包括 Source!#REF! 与 'Plan! O''Brien'!#REF!;包含该本地引用错误的定义名称传入 INDEX 或 ISFORMULA 时同样保留 #REF!

本地错误标记可以与百分号或隐式交集运算符一起使用,表分隔符之后的空白也被接受;工作表名称与其分隔符之间的空白则不在受支持的语法之内

"Source!#REF!" 这类带引号的公式字符串仍是文本;数组常量内部的带工作表限定引用标记超出了受支持的源语法

行与列选择器保持既有的零提取规则和负值校验;区域零从不表示对整个源做提取

存储、依赖与限制

XLSX 自动溢出计算可以让选择器数组结果增大或缩小,并释放锚点不再需要的从属单元格;受支持的表达式也能在显式固定 CSE 目标内求值,并在 XLSX 保存与重新打开后存活

命名选择器即使求值结果是标量,也可能需要保守的动态存储;单单元格动态标记不改变值,也不改变受支持引用结果的身份

被选中的源引用和嵌套名称参与依赖跟踪,重算之后能观察到后续的源编辑;选择器遍历与生成的矩阵负载消耗既有的计算步数与数组内存预算

边界

各区域分属不同工作表的直接并集返回 #VALUE!,即使请求的区域编号只会选中其中一个;选择单个引用的标量 CHOOSE 仍是受支持的跨表替代方案

计算数组、常量或值表达式构成的并集不是真实的多区域引用;LET 绑定的计算数组并集返回 #VALUE!,直接的数组套数组并集语法也不被接受为源形式

这份契约覆盖经过测试的本地引用与计算数组形式;不意味着支持所有外部引用图、所有产生引用的函数或任意嵌套数组容器

未知的工作表限定符不会被规范化为已知的本地引用错误;对 NoSuchSheet!#REF! 这类公式,Excel 可能创建外部链接图,匹配该图超出了这份本地计算契约的范围