ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-5-9 09:02 | 显示全部楼层
本帖已被收录到知识树中,索引项:数组公式
原帖由 胡剑0227 于 2009-5-8 23:20 发表


看了你的公式,2*5的,=LOOKUP(COLUMN()+(ROW()-1)*6-8,ROW(1:12),A1:A12)
虽然在单元格显示时是对的,但你试试 用F9查看一下,可以发现结果值是一个单元素数组。需要对COLUMN函数进行修正。
应该把 COLUMN()改 ...

十分感谢。确实如此。佩服佩服!!

TA的精华主题

TA的得分主题

发表于 2009-5-9 09:44 | 显示全部楼层
猪猪悟语(二)

楼主您好:
经过一小段时间的沉淀,我意识到在创建内存数组的过程中,先利用“常量数组”构建一个需要的数组结构是很方便的,之后再通过“技术手段”生成与“常量数组”结构相同的内存数组即可解决问题。此外,对于不同的函数,决定最终数组结构的参数不尽相同,准确把握“相应参数”也是相当关键的一步。例如:
在LOOKUP中,决定“返回数组”结构的参数是lookup_value
在SMALL中,相应的参数是k

=============================================================================
相应参数,其实就普通应用时的那个单值参数,是不是呀,呵呵

[ 本帖最后由 胡剑0227 于 2009-6-8 18:33 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-5-9 09:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请教:公式=IF((COLUMN(A:D)+4*(ROW(1:3)-1))^0,OFFSET(A1,COLUMN(A:D)+4*(ROW(1:3)-1)-1,),)返回的内存数组为何与显示不同?
见附件。

这个公式也可以写成
=IF(ROW($1:$3),OFFSET(A1,COLUMN(A:D)+4*(ROW(1:3)-1)-1,),)

=IF(TRANSPOSE(ROW($1:$4)),OFFSET(A1,COLUMN(A:D)+4*(ROW(1:3)-1)-1,),)
甚至!
=IF(1,OFFSET(A1,COLUMN(A:D)+4*(ROW(1:3)-1)-1,),)

都可以实现OFFSET的成功落地,先不展开了,否则会紊乱大家的思绪的。自己有兴趣可以悟一下内含什么规律。
当大部分同学对这部分都消化差不多了再继续。

就如林炳尧先生在《杨式太极拳架详解》中提到的,要练好太极,就要宁磨千遍,不改一招,慢就是快,快就是慢。


[ 本帖最后由 胡剑0227 于 2009-5-10 07:58 编辑 ]

LOOKUP数组变形.rar

8.06 KB, 下载次数: 606

TA的精华主题

TA的得分主题

发表于 2009-5-9 09:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主辛苦了......

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-9 12:24 | 显示全部楼层
原帖由 piggy_19840215 于 2009-5-9 09:00 发表
猪猪悟语(一)

楼主您好:
我现在看贴到26楼,目前感觉明白了您所说的:“需要得到怎样的数组反馈类型就构建对应的参数数组”的意思了。以下是我将我的理解用常量数组表达出来。余下的问题就是如何建立与“常量 ...


恩,看到这个真的很欣慰,也祝贺你。
现在就给你讲解怎么样得到和常量一样效果的内存数组。
2*6的那个:({1,2,3,4,5,6;7,8,9,10,11,12}={1,2,3,4,5,6}+{0;6}=COLUMN(A:F)+6*(ROW($1:$2)-1)
=TRANSPOSE(ROW($1:$6))+6*(ROW($1:$2)-1)
使用TRANSPOSE+ROW来替换COLUMN是因为ROW函数里面蕴含了数字,方便书写,COLUMN的参数是字母,当需要大数字的数组时,不方便书写。这里以实战为目标不需要考虑公式字符数,呵呵。

[ 本帖最后由 胡剑0227 于 2010-4-20 16:21 编辑 ]
递进解析内存数组构造目标数组.jpg

递进式解析用数组公式构建目标参数数组.rar

7.35 KB, 下载次数: 830

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-9 13:24 | 显示全部楼层
原帖由 piggy_19840215 于 2009-5-9 09:00 发表
猪猪悟语(一)

楼主您好:
我现在看贴到26楼,目前感觉明白了您所说的:“需要得到怎样的数组反馈类型就构建对应的参数数组”的意思了。以下是我将我的理解用常量数组表达出来。余下的问题就是如何建立与“常量 ...

恩,看到这个真的很欣慰,也祝贺你。
现在就给你讲解怎么样得到和常量一样效果的内存数组。
2*6的那个:({1,2,3,4,5,6;7,8,9,10,11,12}={1,2,3,4,5,6}+{0;1}=COLUMN(A:F)+6*(ROW($1:$2)-1)
=TRANSPOSE(ROW($1:$6))+6*(ROW($1:$2)-1)
使用TRANSPOSE+ROW来替换COLUMN是因为ROW函数里面蕴含了数字,方面书写,COLUMN要对应数字还要计算过,这里以实战为目标不需要考虑公式字符数,呵呵。
递进解析内存数组构造目标数组.jpg

递进式解析用数组公式构建目标参数数组.rar

7.35 KB, 下载次数: 331

TA的精华主题

TA的得分主题

发表于 2009-5-9 13:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复

授人已鱼,不如授人已渔!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-9 13:30 | 显示全部楼层
原帖由 piggy_19840215 于 2009-5-9 09:44 发表
猪猪悟语(二)

楼主您好:
经过一小段时间的沉淀,我意识到在创建内存数组的过程中,先利用“常量数组”构建一个需要的数组结构是很方便的,之后再通过“技术手段”生成与“常量数组”结构相同的内存数组即可解 ...


恩,总结的不错。一般来说就是平时使用单值的参数改成数组即可。对于本来都是单值参数的运算,那么可以有更灵活的应用,最简单的就比如 +, &,^,= 等运算,可以使用方向相同,方向垂直(行和列)的来测试一下看看效果。如果方向相同,那么请测试如果元素个数不匹配时将发生什么问题。

TA的精华主题

TA的得分主题

发表于 2009-5-9 13:43 | 显示全部楼层
我插一句,我们以前做数学题经常用的方法就是倒推法,呵呵。把要的结果分解,然后进行倒推,往往得到想要的结果,比如你要生成{1,0,0,0;-1,1,0,0;-1,-1,1,0;-1,-1,-1,1}这样的内存数组,那么就要对结果进行解,即{1-0,0,0,0;0-1,1-0,0,0;0-1,0-1,1-0,0;0-1,0-1,0-1,1-0},然后拆分,
{1,0,0,0;0,1,0,0;0,0,1,0;0,0,0,1}-{0,0,0,0;1,0,0,0;1,1,0,0;1,1,1,0}
为了方便说明用X1代表第一个数组,X2代表第二个内存数组,
要得出第一个数组,就要考虑Excel中数组的运算规则了,Excel中,运算一般是先行后列,那么要得到X1,可以考虑Row(1:4)=Column(A:D),row(1:4)生成垂直数组,即4*1列的数组,column(A:D)生成水平数组,即1*4的数组,那么两者相比较,根据规则,可以生成4*4的内存数组,得到X1。
X2,相反可以用row(1:4)<column(A:D)来生成,具体运算过程自己考虑,如果想清楚了,收获很大哦。
呵,另外谢谢版主这么好的解释,不过我工作中用不上这么复杂的东西,呵呵。

可能有人问,上面数组变化干吗用的?当然是用来变换数组喽,比如内存数组累加生成新的数组,递减生成新的数组。

上面只提供一个解题的思路,并不是楼主出的题目的解决办法。

其实说白了,Excel中就是要根据结果,构造各种条件,当然不同水平的人可能构造出来的条件是不同的,这取决于你的函数与公式基础,对函数的熟悉程度,你的思维方式等等。

[ 本帖最后由 jackeroo 于 2009-5-9 13:48 编辑 ]

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-9 13:51 | 显示全部楼层
原帖由 zhanhewang 于 2009-5-9 09:45 发表
请教:公式=IF((COLUMN(A:D)+4*(ROW(1:3)-1))^0,OFFSET(A1,COLUMN(A:D)+4*(ROW(1:3)-1)-1,),)返回的内存数组为何与显示不同?
见附件。


恩,呵呵。
是的,像OFFSET这类函数在基础应用时却是显得非常的灵活,容易掌握,但在数组公式应用时就会受很大限制,即使使用IF函数进行了 从空中到地面的 保护,还是不能作为内存数组传递的。

由于大家对OFFSET有比较深的感情吧,所以喜欢用OFFSET还尝试,我平时使用数组公式时一般不会去碰OFFSET函数,还有像COUNTIF等,这些函数在数组公式应用时都是受限的,不能进行深度加工。

注意观察可以发现OFFSET的第一参数是  Refence,单元格或区域引用,不是array(数组),这就限制了OFFSET函数不能接受来自其他公式传递过来的数组,所以在数组公式的应用中这类函数将会收起往日绚丽的光彩。一般使用LOOKUP来实现。

单元格区域毕竟是很特殊的数组,只有能接受内存数组的函数在数组公式中才会得心应手。到这里我想你一定对参数的类型有了新的理解。

[ 本帖最后由 胡剑0227 于 2009-5-10 07:51 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-5 03:01 , Processed in 0.047592 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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