按颜色求和,算是一个老调重谈的Excel话题。方法常见的有3种
1、用查找颜色的方法。
2、自定义函数。需要写VBA代码。
3、宏表函数+SUMIF函数。添加辅助列用宏表函数get.cell提取每个单元格的颜色值,然后再用SUMIF函数求和。
第1种方法通用性差,第2种方法门槛高,而第3种方法更实用,但要添加辅助后再用SUMIF函数太麻烦。一直以来兰色很想对第3种方法进行简化,能不能不用辅助列,直接用公式计算出来。
在定义名称中试图用达宏表函数get.cell提取D2:E8区域中每个单元格的颜色值(63表示背景色)
=GET.CELL(63,Sheet2!$D$2:$E$8)
但结果只能提取选取区域的第1个格的颜色值。然后....就无法继续了
这个问题困扰兰色很多年,直到前两天脑海中突然灵光浮现。即然区域不行,把区域拆分成一个一个的是不是可以?
把一个区域拆分成若干个常用的函数有两个,一个是Offset,一个是Indirect。经过测试,indirect函数更适合。
不过接下来有点烧脑,没有函数基础的估计看起来有点吃力。因为这里要用到indirect的R1C1模式(第2个参数是0或FALSE)
=indirect("R行数C列数",0)
比如用=indirect("R1C1",0) 就可以把A1的值提取出来。
看似没有什么意义,但如果行数和列数都是一组值,就可以把一个区域拆分成苦干个独立的单元格。
=INDIRECT("r"&ROW(A1:B4)&"C"&COLUMN(A1:B4),0)
因为是多维引用,所以需要N函数(值为数字时)或T函数(值为文本时)查看结果。
=N(INDIRECT("r"&ROW(A1:B4)&"C"&COLUMN(A1:B4),0))
不过,在本例中不需要提取值,而是拆分成引用即可,所以也不需要用N函数。直接就可以用在宏表函数中。
=get.cell(63,INDIRECT("R"&ROW(D2:E8)&"C"&COLUMN(D2:E8),0))
单元格中输入=颜色求和 ,就可以提取所选区域所有单元格颜色值了。
这个关键难题搞定,就让它和指定的颜色值对比,然后就可以实现按颜色求和了。
选取颜色右边单元格,定义名称 Colsum
=SUM((GET.CELL(63,INDIRECT("R"&ROW($D$2:$E$8)&"C"&COLUMN($D$2:$E$8),0))=GET.CELL(63,$G2))*$D$2:$E$8)
定义名称后,在颜色单元格右侧输入=Colsum, 就可以按颜色求和了。而且源区域中数字发生改变,求和结果也会变。
只是修改颜色后,还需要双击任一个单元格后,求和结果才能改变。
如果你是OFF365版本,可以借助LAMBDA创建一个自定义函数,输入就很方便了。
=LAMBDA(A,B,SUM((GET.CELL(63,INDIRECT("R"&ROW(B)&"C"&COLUMN(B),0))=GET.CELL(63,A))*B))
在单元格使用很简单,输入以下公式即可按颜色求和
=Csum(颜色所在单元格,引用区域)
兰色说:很多同学一直想让兰色讲一下Indirect函数的高级用法,嘿嘿,本文只是其中一个用法,你看懂了吗?如果看不懂也没关系,直接套用即可。
领取专属 10元无门槛券
私享最新 技术干货