三分钟,提取指定日期范围的数据
就用生日举例子吧,最终的效果是介样婶儿的:
所有信息都是随机生成的,如有雷同,纯属巧合。
那么我们来看看原表吧,如下图所示:
表一:
表二:
姓名、日期纵向排列,没有空行或者合并单元格,生日列也都是日期格式。太好了,这才是原始数据应有的自觉!
在这里插一句:对于日期格式,Excel只认“/”、“-”做为间隔,“.”或者无间隔是不可以的。日期本身对Excel来说就是个数字,1900-1-1对应的是1,这样Excel才能进行日期的计算。
回到正题,首先我们要告诉Excel周一到周日的日期是哪两天
= TODAY()-WEEKDAY(TODAY(),2)+1
这个公式涉及两个函数:TODAY()告诉我今天是几号,WEEKDAY()第一个参数是指定日期,第二个参数是告诉我们该日期是所在周的第几天,下图为WEEKDAY()第二个参数所对应的返回值如下:
以2021-1-29星期五为例,上述公式得到的结果是:44225-5+1=44221,转换为日期格式就是2021-1-25,即本周一所对应的日期,这个日期得出后,我们就可以轻松的得出本周日的日期啦,只需要在G1单元格输入“=F1+6”,调整为日期格式就好啦~
再炫技拓展一下,我想要根据E列所选择的结果得到相应的日期,即上周、本周、下周分别对应的日期是什么。
首先,在E1单元格设置下拉菜单,为使用者提供特定的选择:
【E1】—【数据】—【数据验证】—【序列】—【本周,上周,下周】—【确定】
注意:间隔符是英文输入法下的逗号!
再将F2单元格公式改一下:
=TODAY()-WEEKDAY(TODAY(),2)+1+VLOOKUP(E1,{'本周',0;'下周',7;'上周',-7},2,0)
即在原有基础上加了一个VLOOKUP函数,该函数的作用是搜索表区域首列满足条件的元素,确定待检索单元格在区域中的行序号,再进一步返回选定单元格的值,翻译成普通话的意思就是:
VLOOKUP(找啥,在哪找,要第几列数据,怎么找)
在这个公式中的意思就是,如果E1为本周,该函数返回值为0;如果E1为下周,该函数返回值为7;如果E1为上周,该函数返回值为-7。这三个数与之前的公式相加,就能得出相应的日期啦!
好了,现在如何判断表一中的日期是否符合条件呢?
我在姓名列前插入了一列辅助列,用来将符合日期条件的信息筛选出来,公式如下:
=IF(AND(C2>=$F$1,C2<=$G$1),A1+1,A1)
IF函数的作用是判断是否满足条件,如果满足返回一个值,如果不满足返回另一个值,用法为:
IF(啥条件,是真的就给你一朵小红花,是假的就给你一个大嘴巴)
因为需要同时满足两个条件,所以我在IF里嵌套了AND函数,公式翻译过来就是:如果C列的日期在F1和G1所得出的日期中间,则返回值为上一单元格的值+1,否则与上一单元格内容一致,下拉/双击填充,就得到了表一中A列的结果。
从开篇的动图中可以看出,表二中序号列是动态取数的,这是怎么做到的呢?
E3单元格直接输入1,E4单元格中输入公式:
=IF(E3<MAX(A:A),E3+1,'')
意思是如果上一单元格的值小于A列最大值,那么就返回上一单元格+1的值,否则为空。换句话说,如果上一单元格的值等于A列最大值了,那这个单元格就为空。下拉/双击填充!这样序号就可以做到动态改变了,可能有点绕,你得细品品~
表二中的姓名列和生日列的公式就简单了:
=IFERROR(VLOOKUP($E3,$A:$C,COLUMN(B1),0),'')
最外面的IFERROR函数是避免返回错误值的;最里面COLUMN函数返回的是指定的列号,可用于生成序列1、2、3……,COLUMN(B1)返回的是2,如果我们需要取的列数比较多,就可以像我这样用—VLOOKUP第三参数嵌套COLUMN函数,而不用一个个公式去改。这个公式的意思是:查找在A列中查找序号列的对应值,返回相应的姓名和日期,由于VLOOKUP只能返回第一个符合条件的值,所以就分别得出了序号1、2、3……所对应的第一个结果:
右拉、下拉/双击填充,哦了!
是不是很简单呢?
原载公众号:Office问题粉碎机