ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 妹妹MMult函数入门篇

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-10-18 01:14 | 显示全部楼层 |阅读模式
本帖最后由 佛山小老鼠 于 2016-10-18 01:49 编辑

大家好,我们一起学习妹妹函数Mmult,说心里话,以前一见到这个函数有三种感觉
一、心里就发怵,两腿发抖,自己心虚,因为自己不懂
二、看到群里,论坛里会用这个函数,打心里佩服、大神级别的人物
三、为什么自己学不会?,怀疑自己是有点傻,脑残

相信现在不会的同学,和我当时感觉差不多,闲话少说,我们现在一起来学习

这个函数作用:第1参数的每一行里的每一个单元格和第2参数每一列里的每一个单元格对应相乘再相加,这个对应是什么意思呢?打个比方,第1参数里的第1行有3个单元格,第2参数第1列里一定也要有3个单元格,稍微有点数组基础的学习一看就明白了,第1个位置和第1个位置相乘,第3个位置和第3个位置

首选来学习这个函数的参数,这个函数有2个参数=MMULT(array1,array2)
要注意的知识点
一、两个参数可以是单元格区域引用,也可以是常量数组
二.、第1参数的列数必须要和第2参数的行数保持一致
三、两个参数里的值只支持数值型数字,不支持文本型,逻辑值(True 、False)
四、Mmult函数得到的结果是一个新的数组-->这个新的数组行数:第2参数的行数;这个新的数组的列数:第1参数的列数
五、运算原理:第1参数的每一行里的每一个单元格和第2参数每一列里的每一个单元格对应相乘再相加

可能马上有人会打击我了,老鼠老师你说的云里雾里,雾里看花一样,我还是没有学会,天啊,这才刚开始,你学一个东西要有点耐心,慢慢来,接下来我们以案例来讲给大家,这样也许好理解一点

案例1:求各学员三科分数的总和
1.jpg

有的学员可能会说,老鼠老师你不会这么搞笑吧,这个这么简单,你还用妹妹函数Mmult,一个sum函数下拉就搞定了,
不是啦,我是通过这个案例让大家学习妹妹函数Mmult,不是要大家在工作表中用
当然在工作你用sum函数,接下来我们怎样构建妹妹函数Mmult的参数,这个是难点,也是重点

数据源现在有3行3列,得到的结果是3行1列,如果我们现在以数据源的3行3列作为第1参数,那么根据刚才我们上面的讲的第二条:第1参数的列数必须要和第2参数的行数保持一致,那么我们就要构建一个1列3行的常量数组{1;1;1}
2.jpg

根据我们上面说的第五条:运算原理 第1参数的每一行里的每一个单元格和第2参数每一列里的每一个单元格对应相乘再相加
80*1=80
70*1=70
90*1=90
先相乘,再相加80+70+90=240 这样就得到小老鼠的总分240分

接下来我们看天津丫头的,也就是数据源的第2行
3.jpg

80*1=80
90*1=90
100*1=100
相乘之后再相加
80+90+100=270 得到天津丫头的总分270

最后我们来看曹丽,放松一下,大家不要那么紧张,嘿嘿 ,曹丽是我女孩的名字
5.jpg

100*1=100
100*1=100
100*1=100
相乘之后然后我们进行相加
100+100+100=300,这样我们就得到了曹丽的总分是300

-----------------------------------------------------------------------
上面我们已把妹妹函数Mmult的运算原理有大家说一下,接下来,我们看它公式完整写出来,公式放在F8单元格=MMULT(C8:E10,F4:F6)

最后我们选中区域,把光标点到编辑栏里,三键一齐下Ctrl+Shift+Enter得到下面这张图的效果
6.jpg


妹妹函数Mmult.zip

20.64 KB, 下载次数: 315

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-18 01:27 | 显示全部楼层
本帖最后由 佛山小老鼠 于 2016-10-18 01:47 编辑

大家一起来看这个案例——多行多列查找
1.jpg
.......................................................................
解法1:sumif错位法
=SUMIF(A1:E4,A9,B1:F4)
当然这个方法最简单,也比较经典,因为数据的数字也没有重复
第1参数大家选择A1:E4,少选了F1:F4
第2参数大家也会发现少选了A1:A4
.......................................................................   
解法2:加权法
=INDIRECT(TEXT(MAX((A2:F4=A9)/1%%*ROW(A2:A4)+COLUMN(A1:F1))+1,"R0C0000"),)
公式解释:
如果A2:F4区域中有等于佛山小老鼠的,那么它们的行号乘10000,我这里写成除以1%%,嘿嘿,也是一种得瑟。也就是说除以/1%%和乘10000是一样的,高手就是这样的,就是让新手看不明白,其实我以前也脑火,现在也明白了,因为1%%是3个字符,而10000是5个字符,敲键盘要多敲2下,新手就不建议这样写了
还要加上列号COLUMN(A1:F1),其实我们加权的目的,是让行号和列号相连接,不要相加,让数字变了,为什么后面还要加1呢,因为我们得到结果是姓名右边那一列,所以要加1

我们把(A2:F4=A9)/1%%*ROW(A2:A4)+COLUMN(A1:F1)抹黑按F9
得到下图的结果,里面刚好20003是最大,我们用Max把它取出来,其实这个2是指2行,3是是指3列,再到后面嵌套一个text函数,20003作text函数的第1参数,“R0C0000"作它的第2参数,这样我们就构建R1C1引用样式
=text(20003+1,"R0C0000")这个返回"R2C0004"
最后我们在最外面嵌套一个indirect函数,"R2C0004"作为indirect的第1参数,由于indirect第1参数用了R1C1引用样式,所以它的第2参数用0,0也可以不写,但是前面那个逗号要保留

2.jpg
.......................................................................   
解法3:index+match+mmult
你可能会打击我,喷我,拿鸡蛋砸我,第1种方法这么简单,你弄得那么复杂,没有关系,我们是拿案例来学习,希望大家理解我
=index(A2:F4,match行,match列)
我们先来看match来定位行的位置总共3行
(A2:F4=A9)区域里有等于“佛山小老鼠的”返回的是一个二维数组3行6列
{FALSE,FALSE,TRUE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE,FALSE,FALSE}
3.jpg
因为我们要定位行的位置,那么根据我们上次讲妹妹函数Mmult规则:第1参数的列数必须要和第2参数行数一致,这样我们马上想到第2参数要是6行,第2参数要这样构建{1;1;1;1;1;1}
=mmult(A2:F4=A9,{1;1;1;1;1;1}
再根据妹妹函数Mmult另一条规则,参数不能是逻辑值,因此我们通过N函数转一下,把True转为1,把False转为0得到
下面的公式 =mmult(N(A2:F4=A9),{1;1;1;1;1;1}),把它抹黑,F9我们得到一纵向的一维数组{0;1;0;0}


接下来我们是来找1的位置,我们马上要想到match函数,在外面嵌套一个match函数,=MATCH(1,MMULT(N(A2:F4=A9),{1;1;1;1;1;1}),)这样找到佛山小老鼠在数据源第1行

现在我们来看Match列了,同样的道理,难在构建Mmult的参数,我们现在是用match来定位列,现在数据源有3行6列,结果是6个位置,那么我现在只有3行,所以我们把数据源通过转置函数Transpose来转置一下得到6行3列的数据
=TRANSPOSE(A2:F4=A9),由于mmult参数不支持逻辑值所以我在外面嵌套一个N函数得到=N(TRANSPOSE(A2:F4=A9)),现在数据源变成6行3列,我们现在把它作为mmult函数的第1参数,那么它的第2参数怎样构建呢?,我们死咬这句话第1参数的列数必须要和第2参数行数一致,这样我们要想到第2参数的3行1列{1;1;1},把它作为妹妹函数mmult的第2参数得到公式
=MMULT(N(TRANSPOSE(A2:F4=A9)),{1;1;1})

把它这个抹黑F9得到一个纵向的一维数组{0;0;1;0;0;0},我们接下来用match函数来找1的位置,1在第3个位置 ,=match(1,MMULT(N(TRANSPOSE(A2:F4=A9)),{1;1;1}),0),这个3也就是佛山小老鼠在数据源的第3列,我们要的是数量,数里在其后面一列,所以再加上
=match(1,MMULT(N(TRANSPOSE(A2:F4=A9)),{1;1;1}),0)+1
大功告成,最后我们把2个match嵌套在index 里得到最后完整的公式
=INDEX(A2:F4,MATCH(1,MMULT(N(A2:F4=A9),{1;1;1;1;1;1}),),MATCH(1,MMULT(N(TRANSPOSE(A2:F4=A9)),{1;1;1}),0)+1) 7.jpg


TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-18 01:46 | 显示全部楼层
本帖最后由 佛山小老鼠 于 2016-10-18 01:49 编辑

有的同学说,我还是没有学会,我是体育专业出身,尽力了
接下来,大家不能从字面上理解,不代表
我这个有多高深了,只是学习由浅入深而已,谢谢大家的理解
说到重点,妹妹函数Mmult两参数构建是难点
下面我们看一个案例——找出每个销售员最大的4个销量相加之后,再求出最大的销售量
   1.jpg
从上面的图我们可以看出天津丫头的前四个值是9,10,10,10,相加就是39
39就是我们想要的结果

接下来我们研究它解法,数据源总共有5行10列,要求提取每一行最大的4个数值
以前我们学习的large的第2参数一般都是用一维数组,今天我们来用一个二维数组
这也是这篇文章的一个亮点首先我们给数据源加权,=B3:K7+row(B3:B7)*10^6通过这样加之后,第1大必须在最后一行,第11大就会在倒数第2行,
第21大就会在倒数第3行,第31大就后在倒数第4行,第41大就会在顺数第1行了
本来我们的数据大顺序是乱的,通过加权之后,就有规律了,现在我们要从数据源的
每行提取前面4个最大值,因此我们要构建一个5行4行的数组来排第几大
(row(B3:B7)-2)*10这是一个一维纵向数组抹黑它,按F9得到{10;20;30;40;50},现在我们要
配合我们题要求要前4大,且有5行
因此用(row(B3:B7)-2)*10减去一个横向的常数组{9,8,7,6}得到是一个5行4列新数组
把它抹黑(row(B3:B7)-2)*10-{9,8,7,6}得到下面的
{1,2,3,4;11,12,13,14;21,22,23,24;31,32,33,34;41,42,43,44}
这刚好和我上面说的第1大在倒数第1行,第2大也在倒数第1行,第3大也在倒数第1行,第4大也在倒数第1行
同理
第11大在倒数第2行,第12大也在倒数第2行,第13大也在倒数第2行,第14大也在倒数第2行
第21大在倒数第2行,第22大也在倒数第2行,第23大也在倒数第2行,第24大也在倒数第2行
第31大在倒数第2行,第32大也在倒数第2行,第33大也在倒数第2行,第34大也在倒数第2行

第41大在顺数1行,第42大也在顺数第1行,第43大也在顺数第1行,第44大也在顺数第1行
   2.jpg
我们现在得到了每一行最大的4个值,现在我们又要把数据还原过过
通过取余函数mod,上面是乘以10^6,现在还原回去除以10^6
=mod(LARGE(B3:K7+ROW(B3:B7)*10^6,(ROW(B3:B7)-2)*10-{9,8,7,6}),10^6)
   3.jpg

把这个公式抹黑=mod(LARGE(B3:K7+ROW(B3:B7)*10^6,(ROW(B3:B7)-2)*10-{9,8,7,6}),10^6)
得到下图
   4.jpg
得到结果是5行4列,刚好是每一行最大的4个值
现在要每一行最大的4个值相加,这时谁出场了
人们常说,主角是最后才出场的,还真是这样的
这时漂亮的MM闪亮登场——mmult函数
用刚才得到5行4列新数据源作为妹妹函数mmult的第1参数
它有5行4列,那么它的第2参数怎样构建呢?,我们还是死咬着
那句话,第1参数的列数要和第2参数的行数一致
因此构建一个1列4行的常量数组{1,1,1,1,}
如果构建这样数据多,我们可以用row(1:4)^0
因为任何数的零次等于1
得到这样一个公式
MMULT(MOD(LARGE(B3:K7+ROW(B3:B7)*10^6,(ROW(B3:B7)-2)*10-{9,8,7,6}),10^6),row(1:4)^0)
5.jpg
  把这个公式=MMULT(MOD(LARGE(B3:K7+ROW(B3:B7)*10^6,(ROW(B3:B7)-2)*10-{9,8,7,6}),10^6),ROW(1:4)^0)
抹黑得到一个4行1列的数组{39;25;32;31;34},这刚好是每1行最大的4个值相加
最后我们在其外面嵌套一个最大值函数max得到最后我们要的完整公式
=MAX(MMULT(MOD(LARGE(B3:K7+ROW(B3:B7)*10^6,(ROW(B3:B7)-2)*10-{9,8,7,6}),10^6),ROW(1:4)^0))

6.jpg
温馨提示,如果大家添加一个辅助列L,公式写在L3,公式为=SUM(LARGE(B3:K3,ROW($1:$4)))
下拉到得到,最后我们在L8l输入最大值公式=max(L3:L7),这样解法就很简单了,我申明我们是
通过这个案例学习,不建议大家工作中这样用
到这里结帖,大家再见

TA的精华主题

TA的得分主题

发表于 2016-10-18 02:18 来自手机 | 显示全部楼层
从妹妹的发髻一直看到高跟鞋,更有其他让我两眼放光的地方,还得慢慢反刍。。。。

TA的精华主题

TA的得分主题

发表于 2016-10-18 09:48 | 显示全部楼层
本帖最后由 e表格学习 于 2016-10-18 09:54 编辑

版主讲得很细致/全面!辛苦了!不过,我还是强烈建议MMULT的初学者移步"知识树",去找到那个"盒子","盒子"会让你瞬间揭开"妹妹"的盖头.
http://club.excelhome.net/forum.php?mod=viewthread&tid=1111877&extra=page%3D1

TA的精华主题

TA的得分主题

发表于 2016-10-18 13:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
由浅入深,受益匪浅。

TA的精华主题

TA的得分主题

发表于 2017-10-27 11:06 | 显示全部楼层
刚学这个函数,还不知道怎么用

TA的精华主题

TA的得分主题

发表于 2017-10-28 13:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-13 23:05 | 显示全部楼层
谢谢版主,最后一个构建5行4列数据源受益颇深!

TA的精华主题

TA的得分主题

发表于 2018-7-17 09:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
入门好像有些难了,加权应该算进阶或中高级了吧,发现两个小瑕疵。。。

这时漂亮的MM闪亮登场——mmult函数
用刚才得到5行4列新数据源作为妹妹函数mmult的第1参数
它有5行4列,那么它的第2参数怎样构建呢?,我们还是死咬着
那句话,第1参数的列数要和第2参数的行数一致
因此构建一个1列4行的常量数组{1,1,1,1,}
如果构建这样数据多,我们可以用row(1:4)^0
因为任何数的零次等于1

1列4行的常量数组{1;1;1;1}
因为任何非零数的零次等于1
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 12:47 , Processed in 0.043893 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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