ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 胡剑0227

[讨论] 有志于成为数组公式高手的不要错过(功力修炼)(胡剑开课了...)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2010-5-6 00:31 | 显示全部楼层
本帖已被收录到知识树中,索引项:数组公式
原帖由 胡剑0227 于 2009-5-8 20:31 发表
恩,有些确实不行,这只是个指导思想,具体看情况。

不过如INDEX,函数即使不能生产内存数组,不过在直接使用多单元格公式时 数组之间的关联性还是很好地遵循了参数驱动的原则。
常用的有,SMALL,LARGE,LOOK ...


好久没来了,胡兄这个帖子很火啊,辛苦 辛苦!
其实我们在考虑生成内存数组时,往往需要首先考虑如何利用行列关系来构造数组,再利用构造数组的尺寸来生成新的数组,正如前面胡版给的Lookup变形法,这也是大家需要重点考虑的,这也是对于学习数组公式的初学者们应该重点掌握的。。。
但最后可能需要补充一点,像INDEX函数,如果只给出行参数或行参数(单值),其结果即取得INDEX 区域中的某行或某列,也是可以算内存数组的,但可惜的是行、列参数不支持数组常量或内存数组,遗憾啊。。。
而且 目前在MSO2010中也没有解决,我想MS可能是不打算让它支持内存数组了,呵呵。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-6 08:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢李版捧场...

TA的精华主题

TA的得分主题

发表于 2010-5-6 11:03 | 显示全部楼层
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)来说更合适,按了三键,成为数组公式,下达多项计算命令之后,“公式求值”过程是完全不一样的。

交集.jpg 没有交集.jpg

这个很容易理解。

但是对于语句描述的重点,我抽出来:

对单元格区域而不是单个单元格的引用按照单个单元格进行计算

也就是说,对于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}匹配的数组。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-6 12:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. 再返回来,INDEX(A1:C10,{1;3},0)——在第1行,仅仅是返回A1:C1,而没有按照LOOKUP数组变形“再利用构造数组的尺寸来生成新的数组”这一个原理,但是符合了“绝对交集”把{1;3}作为单个值来使用的原理。因而,此处的A1:C1作为“数组”并非彼“数组”,即,并非返回A1:C1、A3:C3。
复制代码
只是没有一次性返回数组而已,INDEX他是分步来返回的...但每一步都是数组,当然这个数组确实很特别。这个数组(暂且称为数组吧,否则又要造概念了,呵呵),大家可以用ROWS,COLUMNS去测试的,可以测试到是多列的。

另外,我的感觉是,概念这个东西本身就是不断发展的,不能用固定的思维来“固化”下来,谁知道我们还会发现什么,以后函数公式又会有什么变化,这个本身就和自然规律、法则所不同的。而即使是自然法则,我们也是在不断认识,我们只能更接近真理,而无法确信我们已抓住真理。当然也请不要因此就认为我对概念的态度是很随意的,呵呵

因此,概念解析非常重要,但还有更重要的东西...


另外,当INDEX第一参数是普通的数组时,比如直接常量数组好了,那么应该和“绝对引用”扯不上任何关系。
改成 绝对交集,呵呵。

[ 本帖最后由 胡剑0227 于 2010-5-6 12:40 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-5-6 12:38 | 显示全部楼层
再一次更正:是“绝对交集”不是“绝对引用”。


另,我并非是纠缠于概念而放弃其他。
只是不希望读者在看到同样“术语”,理解成不一样的问题。
“用”才是真正的目标,如果读者认为“INDEX(A1:C19,{1;3},0)"与OFFSET(A1:C1,{0;2},0)产生的是一个东西,那么用起来就会发现错了。

我也不是坚持原有定义一定准确,我自己在书中也曾对微软帮助文件的描述进行修正。但原则是:下新的定义之前,应该与约定俗成的东西有所区分,避免误解,或者新旧定义放在一起,并予以比较,让人明白你所指的A是A,而不是B。

[ 本帖最后由 gouweicao78 于 2010-5-7 08:47 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-5-6 15:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
需要认真学习一下

TA的精华主题

TA的得分主题

发表于 2010-5-12 08:51 | 显示全部楼层
再复习一次,这次感觉比第一次学习要容易理解得多,收获较大

TA的精华主题

TA的得分主题

发表于 2010-5-12 14:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-5-12 20:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
216楼作业
=SMALL(MID(MMULT(IF(A2:M9="",0,A2:M9),10^(6-ROUNDDOWN(ROW(1:13)/2,0))),TRANSPOSE(ROW(1:7)),1)+100*ROW(1:8),7*(ROW(1:8)-1)+TRANSPOSE(ROW(1:7)))-100*ROW(1:8)

TA的精华主题

TA的得分主题

发表于 2010-5-13 17:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 胡剑0227 于 2009-5-8 09:43 发表
数组是有方向的,行数组 以半角逗号间隔,列数组以半角分号间隔。在二维数组中可以把分号当换行符理解,一个分号间隔一行。二维数组可以理解成多列合并,也可以理解为多行合并。数组和一堆数的区别是有序性,即有坐标 ...

看到楼主17楼的附图我想到了一个好的应用:
构造乘法口诀表
公式是(选定10*10区域后输入公式后按数组三键一次搞定。)
=ROW(1:10)&"*"&TRANSPOSE(ROW(1:10))&"="&ROW(1:10)*TRANSPOSE(ROW(1:10))
太简单了,多单元格数组公式真神奇,剩下的任务就是格式的问题了。看看实用吗?
构造乘法口诀表.rar (4.61 KB, 下载次数: 28)
====================================================
呵呵,很好,呵呵

[ 本帖最后由 胡剑0227 于 2010-5-13 18:28 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-10-5 14:20 , Processed in 0.050612 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表