来源:新浪众测
作者:波导终结者
大家好我是波导终结者,这次跟大家分享一下10个实用的EXCEL技巧。跟那些烂大街的什么提取生日不一样,可能会比较复杂,所以我会附上详细的函数解释、说明和思路。
使用环境以EXCEL默认安装为准。强烈建议大家抛弃,因为新格式比旧格式优秀太多,这个放到最后讲。
1.统计不重复项数
以前在开发ERP的时候,曾经有一个需求,就是从庞大的数据中统计出SKU。当时研究了半天,最后用Hashtable然后取其个数实现了,这个属于编程范畴,就有点扯远了。
那如果我们在EXCEL中需要这么做,用什么函数可以做到呢?毕竟工具所限,不太可能用哈希表。
方法很简单:
=SUMPRODUCT(1/COUNTIF(B2:B15,B2:B15))
这个方法用到了两个函数,一个是大家很熟悉的COUNTIF,另一个是没怎么见过的SUMPRODUCT。
先来讲SUMPRODUCT,这个函数拆开来看就是SUM和PRODUCT,即“把乘积求和”。
它接受的参数,是N个数组(重要),每个参数数组的大小必须是一样的,然后这个函数就会把对应的项先相乘,最后相加。
比如SUMPRODUCT(A1:A5,B1:B5),那么就会计算A1*B1,然后是A2*B2……一直到A5*B5,最后相加。
而如果参数只有一个,那就没得乘,直接变成简单的数组内元素相加,我们利用的就是这一点。
接下来再来看COUNTIF。COUNTIF一般的应用我们见过挺多,但是COUNTIF(B2:B15,B2:B15)这是个什么操作,条件竟然是个区域,而且与值域一样?
对于这样的写法,COUNTIF会返回一个数组,里面存储着B2在B2:B15中的个数,B3在B2:B15中的个数……类推。
这样一来,这个值在范围内出现过N次,它在数组里也就会返回N次值,值还是为N。比如B2的“波导一”,它出现过3次,并且也被数到3次。
而1/COUNTIF(B2:B15,B2:B15)则会将1除以这个数组内的每个N,作为一个新的数组返回。这样,“波导一”出现3次,在数组里就会有3个1/3,“波导三”出现2次,就会有2个1/2……
大家发现了吧,N个的1/N相加,结果肯定是1。然后1的个数有几个呢?四个。也即范围内不重复的项数。
2.快捷生成大写数字
有时候需要生成大写数字,如果自己一个一个敲还是很烦的,其实EXCEL有这么个函数:
NUMBERSTRING这个函数简直是本地化的典范,中文专用,第2个参数可以取1、2、3,效果直接在图上演示了,就不凑字数了。
不过这个函数也有缺点:不支持小数。
如果有小数的话,函数会自动四舍五入取整,注意,会四舍五入。
一般情况下,我们的小数只有两位,可以用上图方式分别取出来,然后转成大写的伍和陆,后面自己手动接X角X分。
或者直接把小数部分弄成整数,然后中间自己加“点”,变成一二三四点五六。
具体方法还有很多,看实际需求再具体改函数。
写这点也是有感而发。一个是之前初入职场的时候手动写过这种函数,现在回头来看蠢死了。
另一个就是提醒大家四舍五入一定要注意。以前我开发ERP的时候,就和公司里的财务扯过蛋。
之前公司里的折扣都是2位数,后来扩展到3位数了,这时候问题出现:你要全程保持可见数值的精度,就得全程保留3位小数,这很好理解吧。
举个最简单的例子:0.+0.=1.,如果只保留两位小数会出现什么问题呢?1.00+0.10=1.00或者1.10。为什么会或者?一个是后台相加的实际值,一个是前台已经四舍五入过一次之后的值相加。如果前面已经四舍五入过了,精度损失,这两个数不可能兼得呀。
而当时的财务却要求:不将2位精度改为3位精度,同时结果既满足后台实际值,又满足前台可见值,而且还只能有一个结果。这明显就不可能。说白了那个财务懒得一逼,啥也不想做罢了;而且也蠢得一逼,连EXCEL函数都不懂得改。
3.查找某行或者某列的特定值
VLOOKUP这个函数,很多人都有听过,但经常有人用不明白。
这函数说白了,从某个区域内找到某个数,但是使用上却有以下几个要点:
1.VLOOKUP是竖着从参数2的范围内,找第一列值,如果想横着找,请用HLOOKUP。
2.参数3返回对应的,另一列的值。这个数字是范围内的第几列,而不是整个表格的第几列。当然你可以试试设为1……另外,这个数必须为正数,不能反着找。你可以把目标列复制一列,放后头隐藏起来。
3.参数4设为FALSE为精确匹配,TRUE为近似匹配。然而,近似匹配却有两个弱点,如上图▲
近似匹配时,第一列必须为升序排列,否则报错。数值的话好理解,字符串就会有些头痛。
另外,近似匹配很容易得到无法预料的效果。不管是字符串还是数字,它取的都是“相近”的值,而这个相近很容易得到你不想要的结果。所以一概建议大家使用精确匹配。
另外要注意,字符串前后有空格,或者查找数字但目标区域是字符串格式都会导致得到错误结果,一定要检查仔细。
4.VLOOKUP的高级应用
首先我们来看多重查找。比如现在东哥想找出所有不能拼命的员工,列成一个表,或者丁哥想把所有患重病的员工找出来,列成一个表。
这个需求我们当然可以直接用现成的筛选或者过滤来做,但是这样有时候会破坏原表格。而且有的领导不太会用EXCEL,到时候乱搞一通,显示结果乱了,咱又得背锅。
这里我们用添加辅助列的方式来做。辅助列也是学好EXCEL必备的方法,有点类似数学题里的辅助线。有的题不加,还能做,有的题不加还真的做不了。
A列和H列分别为公式文本。
首先看一下这个:(D2=F2)+B1。利用到了EXCEL里,TRUE为1,FALSE为0的特性。如果是男员工,则数字加1,如果不是,就一直保持之前的数字。而绝对引用和相对引用这些我真的不想再说一遍了。
这样,我们在B列就生成了一个数组,每个目标行的数值都会比之前的大1。
再来看:IFERROR(VLOOKUP(ROW(B1),B1:D6,2,0),无)。IFERROR只是为了防止、过滤报错结果,你可以填成空字符串,这样结果就直接可拷走。
ROW(B1)返回1,ROW(B2)返回2,往下拉类推。而查找1,就是找到第一个目标员工。
下拉之后,ROW(B2)返回2,B1:D6变为B2:D6,即从剩下的单元格中,查找第2个目标员工。以此类推。
第二个,通配符查找。刚才我提到过了,用近似匹配很难得到你想要的值,但是你想要模糊查找怎么办呢?
很简单,VLOOKUP支持通配符,比如我在后面加个问号,查找的就是“波导1”后面再跟一个字符的数值。问号代表一个,星号代表任意,这些DOS时代过来的了,不再多讲。
最后再来分享一下反向查找。刚才提过,VLOOKUP不支持反向查找,前提是不用其他函数做辅助处理。
这里我们用:VLOOKUP(C12,CHOOSE({2,1},C2:C6,D2:D6),2,FALSE)。核心要点在CHOOSE函数,说白了就是把第二列先返回,再返回第一列,则生成一个临时表,性别列排在名字列前面。
然后我们就找出第一个女员工了。
个人不推荐这么做,很容易乱,后面如果改个东西,函数就很麻烦,还是辅助列好用。
VLOOKUP可以嵌套非常多函数,根据使用场景来实际操作比较直观,有需要的可以