楼主 gouweicao78 |
Excel官方帮助文件中对“三维引用”的描述为:对两个或多个工作表上相同单元格或单元格区域的引用被称为三维引用,指的是=SUM(Sheet1:Sheet3!A1:A10)。在此概念基础上,引申出一个“函数产生多维引用”的概念,指的是类似于OFFSET(A1:B2,{1;3;5},0)等由于OFFSET、INDIRECT的参数为数组返回的多个区域。 两者差异可以参考: 三维引用的概念、操作及使用范围 http://www.exceltip.net/thread-513-1-1.html 函数产生的多维引用 http://www.exceltip.net/thread-514-1-1.html 那么,什么是“维”呢?这个问题是许多人曾困惑的,以下部分内容摘自百度百科: 【维度概念】来源于百度百科 维度,又称维数,是数学中独立参数的数目。在物理学和哲学的领域内,指独立的时空坐标的数目。0维是一点,没有长度。1维是线,只有长度。2维是一个平面,是由长度和寛度(或曲线)形成面积。3维是2维加上高度形成体积面。 在Excel官方三维引用的概念上,也可以应用百科的这种说法,例如:把1张工作表看成是一个平面,它具有行、列2个方向(视为x、y轴),多个工作表则在“表”方向上(视为z轴)延伸,比如上面这个立方体围绕原点顺时针旋转90度后,不妨看作是Sheet1:Sheet3!A1:C3。 这种说法显然很容易理解,也被许多人接受。把这种理解也用到函数产生的多维引用上,大多数也容易理解,例如: A1单元格视为一个“点”,是0维; A1:A10比单元格A1多一个“竖向”的延伸,形成1维的线; A1:B2是单元格A1在行、列2个方向上延伸,形成2维的面; OFFSET(A1:B2,{1,3,5},0)则将2维的面在rows参数方向上偏移了,即不同于行、列方向的第3个维度,形成3维引用。 这些说法上,一般都容易理解为“n维加上1个维度就是n+1维”,从而让人比较容易混淆,例如:用这样的方式来解说OFFSET(A1,{1,3,5},0)这种将0维的“点”A1在rows方向上偏移,那么是否0维加上1个维度,得到1维呢?如果算1维,那么为何不能用像SUM(A1:A3)这样直接求和而需要SUM(N(OFFSET(A1,{1,3,5},0)))呢?许多特征表明这是个函数产生的多维引用。 下面,我谈一下我的理解:首先将某一工作表的行、列方向视为x、y轴,然后其它方向再视为其它坐标轴。 例1:Sheet1:Sheet3!A1,虽然A1是一个点,但此处需要动用除了x、y轴以外的第3个维度(姑且称为Sheet方向),因此是三维引用。Sheet1:Sheet3!A1:A2或Sheet1:Sheet3!A1:B10,虽然A1:A2、A1:B10分别是一维、二维的线、面,但是此处也仅仅动用了第3个维度,因此也是三维引用。 例2: OFFSET(A1,3,0)——因为A1是一个点,0维,而参数rows、columns都是单值(0维),未动用到其它维度,因此结果还是0维。 OFFSET(A1,{1,3,5},0)——虽然A1是一个点,但此处需要动用除了x、y轴以外的第3个维度即rows参数(一维数组,而非单值),因此是3维引用。 OFFSET(A1,{1;3;5},{2,3})——虽然A1是一个点,但此次需动用除了x、y轴以外的第3、4个维度(rows、columns参数),因此是4维引用。同理,OFFSET(A1:B10,{1;3;5},{2,3})也是4维。 例3:为什么没有5维的引用? 我们来尝试一下=OFFSET(INDIRECT({"A1","B2"}),{1;3;5},{2,4}) 这个公式返回的是将A1分别偏移2列和1、3、5行,将B2偏移4列和1、3、5行,并没有想象中的将A1、B2都分别偏移1、3、5行和2、4列,返回的也只有3*2个区域,而不是3*2*2个区域,因为参数之间的数组执行了数组之间的运算规则(参考:我对数组与数组运算的认识(欢迎探讨) http://www.exceltip.net/thread-3498-1-1.html )。 公式改为=OFFSET(INDIRECT({"A1";"B2"}),{1;3;5},{2,4}),则返回2*2个有效区域和1*2个#N/A无效区域,也是执行数组之间的运算规则。因此,在Excel中是无法构建5维及以上的多维引用的。 不过,不管是3维还是4维,算出这个数字并没有多大的意义,对于函数产生的多维引用,可以支持的函数(例如常见的SUMIF\COUNTIF\SUBTOTAL等)并不区分对待它是3还是4维。特别是对一些容易纠结的OFFSET(A1:B2,{1,2;3,4},0)、INDIRECT("A"&{1;3;5}&":B"&{2,4})之类的,动用了哪些维度,解释起来都挺累人。 因此,个人意见:只要动用到除x、y轴方向以外的其它维度(注意,单元素数组{1}算1维、单值1算0维),都可以统称为多维引用。 |
2楼 鬼狐 |
谢谢草版的分享,现在算是彻底的明白了到底什么是3维,什么是4维了 |
3楼 gouweicao78 |
1楼总结如下: 1、点、线、面、体已不易说清多维引用的维度。 2、可以按此方法来计算:先将某一工作表的行、列方向视为x、y轴,然后其它方向再视为其它坐标轴。只要动用其它轴,则在2维基础上增加维度。 3、参数中的数组,会执行数组间的运算规则,因而无法构建超过4维的引用。 4、大家只需要分清1、2维和多维即可,不需要分清具体的3、4维。 例1:=INDIRECT("A"&{1;3;5}&":B"&{2,4}) 的维度计算,因为参数为2个异向一维数组(都不在平面的x、y轴)因此算4维。返回A1:B2、A1:B4、A3:B2、A3:B4、A5:B2(实际就是A2:B5)和A5:B4(即A4:B5)共6个面。 例2:=INDIRECT("A"&{1,2;3,4}) 也是4维,因为在x、y之外,增加了2个维度,4个点可以视为4个不同空间上的点。 例3:=OFFSET(A1:B2,{1;3;5},0)——在我的算法中,是3维而不是4维,因为除了x、y轴之外,只增加了一个维度。 此时,不需要纠结于返回的是“面”还是“点”,是否计算“面为2维、点为1维”,再加参数中2个数组不同维度,而是动用了除x、y轴外的,都算上x、y两个维度再加参数中数组的维度。 例4:=INDIRECT("A"&{1,2;3,4}&":B"&{2,4,5})这里的参数{1,2;3,4}是2维的,与{2,4,5}这个1维数组会执行数组间运算规则,多出1列#N/A来。 这是以前做的一个动画演示: |
4楼 gouweicao78 |
很多人提到“降维”一词,我也很多次提出这个词并不准确,其实质是:返回每一个平面区域左上角单元格的值,并执行N/T的过滤功能(N可以将TRUE转为1、FALSE和文本转为0、其他数值返回本身;T可以将数值和逻辑值转为空、文本返回本身)。 N(OFFSET(A1,{1;3;5},0))、N(OFFSET(A1,{1,2;3,4},0)——返回将该多维引用的所有单元格返回成数组,并不意味着N就可以将3维降维到全部可以识别的1、2维,例如N(OFFSET(A1:B2,{1;3;5},0))——与N(OFFSET(A1,{1;3;5},0))的结果是一样的。因为N根本不管你是多少维,例如N(A1:B2)与N(A1)是一样的,它只处理每一个区域的左上角单元格。 |
5楼 laowuwyx |
比较抽象,特别是1楼的内容,慢慢消化了。3楼的动画相当漂亮,不知是用什么工具做的? |
6楼 鬼狐 |
在实际应用中,明白offset偏移出来的是哪个区域,也明白用n/t出来的是什么样的内存,很多都会用,但是一直不了解是那个维度,所以看别人的作品的时候,对里面说的维度一直把握不了,一直很是郁闷。 经常碰到这样一句话:对于函数产生的3维引用.........也不举个实际的例子,然后就是看的头晕晕的 要是像草版这样子,举个例子,说明一下这个公式产生的是几维的,那么就可以非常容易理解了~~ |
7楼 gouweicao78 |
我的指导意见是:既给出可以算的方法,又不提倡大家去具体计算到底是3、4维的哪一个。 这个算法不同于传统的点、线、面、体,因为如果按点的说法:OFFSET(A1,{1;3;5},0)可能要算1维、OFFSET(A1:B2,{1;3;5},0)可能算4维,也就是大家被困扰的是——原有的A1、A1:B2在x、y方向维度在多维中如何算的问题。 但事实证明这两者在用于SUMIF等函数时的特征是与其他函数产生多维引用一样的。 3楼的动画,做起来很简单: 步骤1、一个个截图、标注字样,按顺序命名1、2、3……之类的。 步骤2、用Acdsee或其他看图软件打开。 步骤3、使用滚轮滚动(必要时前滚),同时用GGG.exe录屏工具做成gif动画。 |
8楼 zm0115 |
草版:=INDIRECT("A"&{1;3;5}&":B"&{2,4}) 返回六个面:a1:b2,a1:b4,a2:b3,a3:b4,a2:b5,a4:b5 用=sum(N(INDIRECT("A"&{1;3;5}&":B"&{2,4}))) 只能将坐上角第一个单元格值相加,如果要把六个面的值相加如何处理呢? |
9楼 rongjun |
用支持多维引用的函数求和就可以了啊
或
|
10楼 鬼狐 |
对于8楼的问题,我都是用的rongjun版主的第一个公式,也就是subtotal合计完之后在sum~~ 至于第二个,没有用过,学习了 |
11楼 gouweicao78 |
解法荣版已经给了。基本上就是SUMIF\COUNTIF\ SUBTOTAL用的多一些。 在疑难千寻千解之《Excel 2010函数与公式》中的例子也有: |
12楼 zm0115 |
多谢荣版,嗯,这种方法以前见过,不常用,因此总是忘记。 草版啊,书买了一直就束之高阁,惭愧啊,惭愧 |
13楼 hjj0451 |
谢谢!来这儿看的第一贴 |
14楼 ggsmart |
以前看到别人公式里的N函数,问用它的作用时,往往都是“降维”,一直弄不明白,几个平面的东西,降维成二维数组时按什么规则降,看完版主的“实质”,从心底感到欣喜。 很好理解,也终于理解了 |
15楼 ggsmart |
这个动画做得很直观,容易理解。 |
16楼 ggsmart |
这个观点真让人长见识,谢谢,真的谢谢 |
17楼 peter_wm |
好贴,学习了 |
18楼 huangyun |
进来学习的。 |
19楼 海绵宝宝 |
我觉得根本没有必要区分到底是几维,其实只要是引用必定是二维,至于OFFSET这种用法只是一个嵌套罢了 |
20楼 海绵宝宝 |
草版写的真好 |
21楼 gouweicao78 |
单行、单列是一维;多行多列是二维。 这两者是很明确的,只有引用函数+数组参数产生的三维、四维很多人算不清,而事实又不需要明确到底是3还是4维,所以我才提出上面的意见。 |
22楼 海绵宝宝 |
草版,偶感觉单列单行的引用也是二维,因为表本身就是二维,单行单列只是二维的特殊状态,不知道我这样理解对哇 |
23楼 gouweicao78 |
你的理解是视觉层面的,呵呵。 如果要这么说,一条直线无限放大,那还都3D了。 |
24楼 海绵宝宝 |
谢谢,草版,我按自己的思路终于领会了点,首先,很多人说SUM函数不支持多维引用,SUM函数是支持多维引用的,而且支持函数返回的多维引用,只是它不能能够返回内存数组罢了,一句话核心是数组,值和数组是有区别的,这也验证了降维度的本质 |
25楼 gouweicao78 |
1、SUM函数直接支持三维引用——例如:=SUM(Sheet1:Sheet3!A1:B10) 2、SUM函数不直接支持函数返回的多维引用,例如=SUM(OFFSET(A1,{1;2;3},0))返回结果是A2的值,而需要用N来取出OFFSET产生的3个区域左上角单元格的值,例如用:=SUM(N(OFFSET(A1,{1;2;3},0)))才可以得到A2、A3、A4之和。 3、SUM、MAX、MIN、AVERAGE等本身求的结果都是一个单值,怎么会想过用它来“返回内存数组”呢? |
26楼 gouweicao78 |
不太明白这句话想表达的意思。 “降维”之说,我并不完全否认,但要严格说的话,是不是就有4维降到3维、3维降到2维、2维降到1维,或者4维可以降到3、2、1维,也就是“可以控制想降到几维”呢?目前没有办法吧。 而从函数N、T本身的实质,它只能返回引用区域的左上角单元格的那个值,区域内其它单元格都被无视了。 因而,我才选择——直接用N、T函数的特性来说,而不绕道去说“降维”。 |
27楼 gouweicao78 |
可能你是想举这个反例: =SUM(SUM(OFFSET(A1,{0;1;2},0)))——这个可以返回正确结果。 其中,内层嵌套的SUM起到了类似N函数的作用。 这个例子可以算是个“中间派”的,如果用它反驳“SUM不支持多维引用”可以,但同理也可反驳“支持”,因为为什么要多套1层?因而,我一般说“不直接支持”。 |
28楼 salem0000 |
国良老师真厉害 我最近研究excel研究了两个月 函数没经常用,一个都记不住 不知道是不是走火入魔了 |