ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 从分析OFFSET函数开始

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-1-3 11:33 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
图片-1.png
一、分析公式1和公式2,主要分析公式返回什么类型的数值。
通过F9,我们发现公式1返回一个单值12,而公式2返回一个数组{12,0}。
原理1一个单元格只能保存一个单值,如果给单元格返回一个数组,则单元格的值为数组的第一个元素。

然而,单元格C4直接输入={12,0},却能返回12,为什么呢?
这是因为,OFFSET返回的只是单元格引用,而不是单元格的值,也就是说,OFFSET并不直接返回{12,0}!!!
原理2函数INDIRECT和OFFSET返回的都只是单元格引用,而不是单元格的值。

公式2返回#VALUE!,就跟单元格D4直接输入=(A2,B2)的结果一样:一个单元格不能同时引用多个单元格的值。

对公式1的正确理解是:第一步,OFFSET($A$1,1,)返回单元格引用A2;第二步,=A2返回结果12。
对公式2的正确理解是:第一步,OFFSET($A$1:$B$1,1,)返回单元格引用(A2,B2);第二步,=(A2,B2)返回#VALUE!。
offset-1.zip (7.52 KB, 下载次数: 28)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-3 11:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
图片-2.png
二、分析公式3和公式4,主要是分析公式有没有进行数组运算,OFFSET究竟返回了几个引用。
原理3在单元格的普通公式中,当给某个要求是单值的操作数提供了数组常量,则只取数组常量中第一个元素进行计算,其余的元素一律忽略。
OFFSET函数的第二个参数,是指定一个行的偏移量,是一个单值。
公式3的数组常量{1;2;3;4;5}中,只有第一元素1是有效的;公式3相当于=OFFSET($A$1,1,)。
公式3返回1个单元格引用;
而公式4进行数组运算后,返回1个数组,数组中包含5个元素,分别是5个单元格引用:{A2;A3;A4;A5;A6}。
根据原理1,尽管公式4返回一个包含5个元素的数组,单元格只保留数组第一个元素的值。
这里需要注意两点:
1、公式4返回的数组,其中的元素并不是常量(或者说,并不是确定的值),而是单元格引用,这与数组常量是不同的。
2、公式4返回的是5个引用,而不是1个引用,所以,G2:G6与H2:H6返回不同的值。
offset-2.zip (8.46 KB, 下载次数: 19)

TA的精华主题

TA的得分主题

发表于 2018-1-3 11:39 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-3 11:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
图片-3.png
三、为什么同样的公式4,在J2:J6区域内输入数组公式(以下简称区域数组公式),结果会不同呢?
原理4Excel公式是在工作表这样一个二维的空间里运行的,处理的数据一般不能超过二维。
区域数组公式与一般数组公式的区别在于:
1、在区域内,区域数组公式只有一条公式,而一般数组公式有多条公式;
2、在区域内,一条区域数组公式生成区域内所有单元格的值,而一般数组公式只生成一个单元格的值。
原理5区域数组公式为了在区域内所有单元格都返回值,需要对公式中的数据进行数组扩展。
{=OFFSET($A$1,{1;2;3;4;5},)}进行数组扩展后,
变成{=OFFSET({$A$1,$A$1,$A$1,$A$1,$A$1},{{1;2;3;4;5},{1;2;3;4;5},{1;2;3;4;5},{1;2;3;4;5},{1;2;3;4;5}},)}
从而造成OFFSET函数的第二个参数超出二维,所以公式返回#VALUE!。
offset-3.zip (12.81 KB, 下载次数: 16)



TA的精华主题

TA的得分主题

发表于 2018-3-7 11:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
大佬,你发的东西我都看不懂。。。。我好笨

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-29 14:58 | 显示全部楼层
1120933984 发表于 2018-3-7 11:08
大佬,你发的东西我都看不懂。。。。我好笨

数组这PART确实有点高端,你还是从基础的学起吧

TA的精华主题

TA的得分主题

发表于 2018-5-16 16:30 | 显示全部楼层
正确:公式2返回的是A2:B2。

TA的精华主题

TA的得分主题

发表于 2018-5-16 16:45 | 显示全部楼层
本帖最后由 r_zxf 于 2018-5-16 16:47 编辑
ZhouFfett 发表于 2018-1-3 11:43
三、为什么同样的公式4,在J2:J6区域内输入数组公式(以下简称区域数组公式),结果会不同呢?
原理4:E ...

正确:{=OFFSET($A$1,{1;2;3;4;5},)}扩展后成为{=OFFSET({$A$1;$A$1;$A$1;$A$1;$A$1;},{1;2;3;4;5},)}
如果可以这样{引用}表示的话,省略的参数同样省略。

TA的精华主题

TA的得分主题

发表于 2018-5-16 17:55 | 显示全部楼层
本帖最后由 r_zxf 于 2018-5-16 17:58 编辑
ZhouFfett 发表于 2018-1-3 11:43
三、为什么同样的公式4,在J2:J6区域内输入数组公式(以下简称区域数组公式),结果会不同呢?
原理4:E ...

正确:J2:J6数组公式出错是因为,系统不对OFFSET函数的多个结果进行数值转换。你换成INDEX函数试试,使其返回同样结果,看看出错否?

TA的精华主题

TA的得分主题

发表于 2018-5-17 09:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ZhouFfett 发表于 2018-3-29 14:58
数组这PART确实有点高端,你还是从基础的学起吧

怎么不回复?觉得我们够不上这种高度吗?很希望探讨。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-12 11:35 , Processed in 0.036767 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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