近日看见网友hahahah3的求助帖: [求助]除数组公式外 多条件汇总 大意:使用SUM()数组公式进行多条件求和,速度很慢,求助更好的方法。我推荐了MMULT()函数,但是楼主却有很多不明白。为此我翻了一下论坛的老帖,发现有很多的人都对这个函数“打怵”。 所以,我想借用hahaha3朋友的这个帖子做例子,多用点时间,从头细说一下这个让人“双腿发抖”的MMULT。希望能让更多的人明白,能用好这个利器。 看帖入门考试 看帖还要考试?是的。因为MMULT是个比较难以理解的函数。如果没有一定的基础知识,下面说的就不大好理解。 “考试”很简单,就一题: 问:公式=A1:A3=B1:C1的结果是几行几列的数组?不要在excel运行而直接写出答案。 答案是三行两列:={FALSE,FALSE;FALSE,FALSE;FALSE,FALSE} 您的答案对吗?特别注意核对一下其中的逗号和分号的位置。 如果您的答案不对,那就先把这个题目好好琢磨一下。 答案正确,请跟我来,开讲了——
TRANSPOSE()是干什么的? 说起来很简单,TRANSPOSE()就是转置。帮助中说:“将一行单元格区域转置成一列单元格区域,反之亦然。” MMULT和TRANSPOSE就像是一对铁哥们,MMULT走到哪里,TRANSPOSE就跟到哪里。它在MMULT里干些什么? 我们从hahaha3朋友做的公式说起。这个公式是:MMULT(TRANSPOSE('Attendance Record'!B3:B271=B7:B13),('Attendance Record'!E3:E721=J4:L4)*'Attendance Record'!K3:K721) 这个公式的第一部分就错了('Attendance Record'!B3:B271=B7:B13) 错在哪里? 我们举个简化的例子: A1:A5=B1:B3 这个公式能得到想要的结果吗?不能。 你可以用F9来检验一下(假定A1=B1,A2=B2,A3=B3),得到的结果将是:={TRUE;TRUE;TRUE;#N/A;#N/A} 注意后面有两个#N/A。为什么?原来这个公式是这样比较的: A1=B1 A2=B2 A3=B3 A4=? A5=? 就是说两个数组(A1:A5和B1:B3)如果同样是行数组(EXCEL帮助中说的垂直数组),那么它的比较是第一数组的第一个元素和第二数组的第一个元素比较,第二个和第二个比较……问题是,第4个和第5个和谁比较?你既然没告诉它,它也就只好告诉你#N/A了。 如果两个数组都是列数组(水平数组),比较也是类似这样来进行的。 如果我们想比较的两个数组,一个是行数组,一个是列数组,那就不一样了。看这个: A1:A3=B1:C1(假定A1=B1,A2=C1,A3<>B1,A3<>C1) 这个公式会有什么结果?按F9看看:={TRUE,FALSE;FALSE,TRUE;FALSE,FALSE}
没有一个错误值,只有TRUE和FALSE,说明它们都比较过了。怎么比较的呢?3×2个数怎么出来6个结果的(或者说比较了6次)? 原来比较是这样进行的: A1=B1 A1=C1 A2=B1 A2=C1 A3=B1 A3=C1 : 好了,现在我们知道了:由于'Attendance Record'!B3:B271和B7:B13都是行数组,直接比较是比较不出结果来的。怎么办?要把其中的一个“转”过来(转置),就是用TRANSPOSE函数把行数组变成列数组,这样一个行数组和一个列数组就能比较了: 'Attendance Record'!B3:B271=TRANSPOSE(B7:B13) 原公式的后面一部分倒是对的:'Attendance Record'!E3:E721=J4:L4,等号前面是行数组,后面是列数组。 这就是TRANSPOSE的作用。 当然,反过来比较,公式也是成立的:TRANSPOSE('Attendance Record'!B3:B271)=B7:B13 那么,在MMULT公式中,TRANSPOSE应该怎么安排? 到底应该把TRANSPOSE放在哪里?这和MMULT有密切关系。这就需要从头说MMUTL了 下面就来看MMULT()函数 MMULT()函数是怎样工作的 先看MMULT()函数的帮助。 从帮助中,我们可以得到函数的以下特性: 1,这是个矩阵乘法; 2,MMULT()函数的两个参数都必须是数组,而且均为数值; 3,数组1的列数必须与数组2的行数相同; 4,得到的结果也是一个矩阵,这个矩阵的行数=数组1的行数,矩阵的列数=数组2的列数; 5,不满足以上2-4条件的公式返回错误值#VALUE! 那么什么是矩阵乘法?这是高等数学里线性代数的一个概念。我们试试通过一个简单的例子来理解它:
就是说数组1的第一个元素和数组2的第一个元素相乘,生成新矩阵的第(1,1)个元素; 数组1的第一个元素和数组2的第二个元素相乘,生成新矩阵的第(1,2)个元素; …… 这也是帮助中的那个复杂的公式的含义: 特别感谢qygszlb朋友给出的这个完整的多行多列矩阵乘法的说明图: 从上面的例子里,我们知道:1,为什么两个参数都必须是数值(特性2)?因为MMULT实际是在做乘法运算,而文本是不能相乘的。就连文本型数字和逻辑值也不行。其他一些情况下,EXCEL会把文本型数字和逻辑值变成数字参与运算,比如这两个公式="4"*3=12, =TRUE+1=2, 但MMULT()不会做这样的转换。 2,帮助中的这个公式值得我们牢记: 这个公式实际上就是上面说到的MMULT特性3,4的数学表达方式。如果能读懂、记住这个公式,MMULT的使用就很方便了。 我们希望得到什么?希望得到a(i,j),就是一个i行j列的矩阵;要求是什么?它要求MMULT第一个参数是i行的,而第二个参数是j列的;而且第一参数的列数和第二参数的行数相等(K) 或者,我们从另一个角度来简单地理解并记住:先看看我们要得到什么?如果我们希望得到 i 行 j 列的结果,那就要构造两个矩阵,第一个要 i 行的,第二个要 j 列的 这样说,是不是还显得太抽象了?那下面我们就结合一个实际的多条件求和的例子来看。看例子的时候,我们还会反复说到上面提到的这些。
[此贴子已经被作者于2007-10-29 13:04:44编辑过] |