ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 876|回复: 1

[讨论] 关于choose函数与数组的一些分享和疑问

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-11-11 17:58 | 显示全部楼层 |阅读模式
本帖最后由 卢很肥 于 2021-11-11 18:00 编辑

最近在试图使用choose函数来选定一些数组的内容,但是发现其计算规则让人特别困扰,今天下午用大量例子测试总结了一下,顺便提一下疑问。

image.jpg
测试结果如上图所示,同时文档通过onedrive进行共享了,感兴趣的大佬可以打开在线编辑或打开下载,此处打开在线文档(https://nndog-my.sharepoint.com/:x:/g/personal/me_nndog_onmicrosoft_com/Eea4RRSy2cNMuXWiX9GV4GABQ03v3q4bBEedJ56HOnRuWg?e=fEgMqr),注意打开在线文档后新建一个sheet复制内容过去编辑测试

主要测试的方向为choose的index_num参数和value参数都为数组时的情况,所以A1:I1,A2:I2,A3:I3区域为三个用做value的数组,且为了方便观察取值位置把值分别填成1.1-1.9,2.1-2.9,3.1-3.9,这样可清晰分辨从哪个数组取到哪个位置的值。

K1:U14为计算结果区域,L列函数为实际运行的函数(值得关注的参数变化用红字表示),右侧M列开始为函数运行的结果,通过evaluate宏表函数计算的。

注:CHOOSE 函数语法具有以下参数:
  • index_num    必需。 用于指定所选定的数值参数。 index_num 必须是介于 1 到 254 之间的数字,或是包含 1 到 254 之间的数字的公式或单元格引用。
  • value1, value2, ...     Value1 是必需的,后续值是可选的。 1 到 254 个数值参数,CHOOSE 将根据 index_num 从中选择一个数值或一项要执行的操作。 参数可以是数字、单元格引用、定义的名称、公式、函数或文本。
__________________________________________________________________________________________

测试对比结果/结论:
从序号1和2测试,当index_num参数不为数组,为单个数值时,可见函数返回对应第几项的value参数,返回的数组长度也与实际返回value参数的长度相等,以上基本符合对运行结果的预期。

从序号3测试可见,当index_num为数组{1}时,返回为位置对应的value1数组,也符合结果预期。

从序号4测试可见,同样index_num为{1},对比3测试value1的数组缩减为仅有一个A1值,但此时结果得到了一个超出value1数组长度的数组,且整个数组被value1的第一个值填充,即1.1。

测试5,index_num为{2}时,结果为整个value2数据,符合预期。

测试6、7,接着研究测试4出现的:”结果返回超过预期长度的数组,其长度由什么控制?”  测试6中缩减了value1和value2的长度,但返回还是与value1数组长度不同,缺少长度的位置填充了NA,可见跟选取的value数组长度没有关系。而测试7,缩减了3个value的长度后,结果长度也变化了,可见结果长度等于value中数组最长的长度。

至此可以得出结论
1.index_num为数值时,结果返回长度为选取value的长度。
2.index_num为数组时,结果返回长度为所有value数组中,长度最大数组的长度。
3.index_num为数组且仅有一个值时(如{1}),选取的value数组长度为1,则它的值会填充返回整个结果,选取的value数组长度大于1,则value小于结果长度的部分会被NA填充


继续讨论测试8,当index_num参数为{1,2}时,可见仅返回两个结果,为value1的第1项(1.1),及value2的第2项(2.2),其余部分被NA替代。

结合测试9、10、11,当index_num变化时对结果产生的影响,可见结果实际取到数的长度为index_num的数组长度,其余部分被NA替代。其取值逻辑更为耐人寻味:
如index_num为{3,1}时,仅返回两个有效的结果为:3.1、1.2,首先确定index_num为长度不为1的数组时,仅返回对应value中的一项。而且可以看到其返回对应value中元素的在value中的位置与其在index_num被选取的位置相同,也就是如index_num为{3,1}中1所对应的value1(1.1-1.9),在{3,1}作为第2项被选取,其结果会出现在第2项,且选取的是value1中的第2个数(1.2)。结合测试12、13,可非常清晰地印证以上说法。

至此可以得出结论 :
4.index_num为数组且长度大于1时,结果仅返回index_num选取对应的value中与其被index_num选取位置相同位置的值,结果长度仍为所有value的最大长度,不足部分由NA填充。
(以上结论就远远超出了结果的预期,当index_num和value都为数组时,value被index_num选取的位置为N时,提取value中A元素到结果的位置也为N,A元素在value中的位置也为N,相当于用一个变量去控制两个不同实际意义的参数,例如要模拟某辆列车运行情况,时速 X km/h,以及车轮半径 Y cm,此时设定了X=Y=N,让你去控制N变量一样。即,1.你无法去控制需要的元素出现在结果对应的位置,2.在几个value数组中同一个位置的元素也无法同时返回到结果中

最后看一下14测试,注意value2仅设定了A2,  value3设定了A3:B3,当value2被index_num第二个选取,其仅有A2一个值时(2.1),长度不足无法取第二个元素时,则通过2.1填充。
但value3被index_num第三个选取,其有A3:B3两个值(3.1、3.2),长度不足无法取第三个元素时,却直接报NA。

综上所述,choose在index_num和value这两个参数都为数组时,却时产生了很多超出预期的结果,或者说显现了一些可以认为由缺陷的规则,希望各位大佬指点迷津。

留下个这个无法解决的问题,15中手动写了结果,没有写函数,如何在通过函数实现结果,要求value使用$A$1:$I$1,$A$2:$I$2,$A$3:$I$3?



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-11-11 23:50 | 显示全部楼层
逗号{1,2} 改分号 {1;2} ,比如

=CHOOSE({1;2},A1:I1,A2:I2,A3:I3)

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-6 04:45 , Processed in 0.031903 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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