|
LOOKUP变形,在李兄这一帖就有了:[内存数组之数组构建应用详解]
对于“何谓内存数组”,胡兄心存异议,我仔细分析一下:
1、=SMALL(A1:A10,{1,2,3})——没有争议,内存数组
2、=INDEX(A1:C10,{1;2},0)——有争议,得到A1:C1,结果是一个1行3列的“数组”
3、选择B1:B3,输入=INDEX(A1:A10,{1;2;3})并按Ctrl+Shift+Enter结束,形成的“是一个多单元格数组公式”,但不是内存数组,基本上也没太多争议,因为结果是单值。
对于第2种情况,实际上与=INDEX(A1:C10,1,0)是一致的,也就是将{1;2}仅作为一个单值来考虑。
如果说{1;2}是连续的,换成{1;3},可能似乎更支持胡兄的看法。但是,我想再把“隐含交叉”(也就是Excel官方称为“绝对交集”)这个概念说明一下:
帮助文件中的定义:
绝对交集:对单元格区域而不是单个单元格的引用按照单个单元格进行计算。如果单元格 C10 包含公式 =B5:B15*5,则 Excel 将单元格 B10 中的值乘以 5,这是因为单元格 B10 和 C10 位于同一行。
【注意】这里是没有按ctrl+shift+enter的计算情况,不妨用=SUM(B5:B15*5)来说更合适,按了三键,成为数组公式,下达多项计算命令之后,“公式求值”过程是完全不一样的。
这个很容易理解。
但是对于语句描述的重点,我抽出来:
对单元格区域而不是单个单元格的引用按照单个单元格进行计算
也就是说,对于B5:B15,只是按照单个B10来计算。
再返回来,INDEX(A1:C10,{1;3},0)——在第1行,仅仅是返回A1:C1,而没有按照LOOKUP数组变形“再利用构造数组的尺寸来生成新的数组”这一个原理,但是符合了“绝对交集”把{1;3}作为单个值来使用的原理。因而,此处的A1:C1作为“数组”并非彼“数组”,即,并非返回A1:C1、A3:C3。
【对比示例】
OFFSET(A1:C1,{0;2},0)——这个则不然,返回了A1:C1、A3:C3——与{0;2}构造的数组的尺寸相匹配,并且可以作为一个整体模块,在内存中调用,比如
=COUNTIF(OFFSET(A1:C1,{0;2},0),"张三"))——可以分别返回A1:C1中有几个张三、A3:C3中有几个张三,得到的还是与{0;2}匹配的数组。
|
|