乘法和加法你真的会吗?lookup求平均毛利率
1.求2015年每个月的平均毛利率
如下图所示,是2015年某产品毛利率的区间,求每个月的平均毛利率,具体算法就是下图的描述。我这里再说明一下,以9月为例,在3个区间中都有9月,分别是序号8,9,10的区间。在序号8的区间中,也就是2015/9/1到2015/9/15,9月占15天,对应的毛利率是20%;同样的,序号9的区间9月占7天,毛利率是11%;序号10的区间9月占8天,毛利率是10%;所以最后9月的平均毛利率是(15*20%+7*11%+8*10%)/30。其他月份也是同样的算法。
这个题目如果没有找到好的思路,还是挺难的;如果找到好的思路就会容易很多。先说公式吧,在G7单元格输入公式=AVERAGE(LOOKUP(ROW(INDIRECT(DATE(2015,ROW(A1),1)&":"&EOMONTH(DATE(2015,ROW(A1),1),0))),B$7:B$18,D$7:D$18)),按ctrl+shift+enter三键结束,向下填充。
其中ROW(INDIRECT(DATE(2015,ROW(A1),1)&":"&EOMONTH(DATE(2015,ROW(A1),1),0)))这一长串是为了得到2015年每个月的所有天数,现在是2015年1月份的所有天数,也就是从2015-1-1到2015-1-31。公式下拉就得到了2015年2月份的所有天数。
这里有2个日期函数,一个是date,一个是eomonth。其中eomonth在文章《多条件if嵌套计算房租费用,差点蒙了!》中简单说过,大家可以参考一下,日期函数以后还会单独讲解。那么今天就来简单说说date函数。它是由代表年月日的3个数字组成一个完整的日期。函数语法为DATE(year,month,day),有3个参数,分别代表年,月,日。如下图所示,D2就是由A2,B2,C2组成的一个日期。是不是很简单。
知道了date函数的意思,就来看看上面row函数那一串的意思,DATE(2015,ROW(A1),1)得到了2015-1-1,也就是1月份的第1天;EOMONTH(DATE(2015,ROW(A1),1),0)得到了2015-1-31,也就是1月份的最后1天。
DATE(2015,ROW(A1),1)&":"&EOMONTH(DATE(2015,ROW(A1),1),0)这部分是1月的第1天和最后1天连接起来,最后的结果为{"42005:42035"},得到了文本型单元格地址,因为在excel函数中日期的本质就是数字,只不过用日期的格式展示出来。然后用indirect返回引用,也就是42005行到42035行,最后用row函数得到了引用的行号,相当于row(42005:42035),这样就得到了2015年1月份的所有天数。
然后用lookup在B$7:B$18这个区域中,查找1月份的所有天数,然后返回对应的D$7:D$18。现在lookup的第1参数是个数组,其中2015-1-1到2015-1-15都找到了第2参数的2015-1-1,返回对应第3参数的15%;2015-1-16到2015-1-31都找到了第2参数的2015-1-16,返回对应第3参数的16%;这样的话就得到了15个15%,16个16%。
最后用average求平均值,就得到了1月份的平均毛利率,是不是和(15*15%+16*16%)/31是一样的呢?所以我说乘法和加法你真的会吗?其实是说我自己。因为最开始的思路一直是求每个月在各个区间各占多少天,然后再乘以对应的毛利率,求和,最后再除以每个月的天数。没有想到用lookup先求出每个月每一天的毛利率,然后再求平均值。思路决定出路。
如果用我上面说的每个月在各区间占多少天的思路来完成,公式为=SUMPRODUCT(MMULT(--TEXT(DATE(2015,ROW(A2),1)-COLUMN(INDIRECT("c1:c"&DAY(DATE(2015,ROW(A2),1)-1),)),"[<"&B$7:B$18&"]!0;[>"&C$7:C$18&"]!0;1"),ROW(INDIRECT("1:"&DAY(DATE(2015,ROW(A2),1)-1)))^0)*D$7:D$18)/DAY(DATE(2015,ROW(A2),1)-1),下拉填充。
文件链接:
ttps://pan.baidu.com/s/1dREJv3nIc52S1YbS1fwU6A
提取码:ewfw