|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
原帖由 yuanlh 于 2011-2-13 12:45 发表
感谢您的帮助,查看了第一周的名称 第一周名称定义:
=IF(SUM(--(DAY>=1))>0,OFFSET(Sheet1!$B$3,MIN(IF(DAY=1,ROW-1)),,MAX(IF((DAY=7),ROW))-MIN(IF(DAY=1,ROW))+1),"")
1、我把上面这个IF函数粘到一个空 ...
1、我把上面这个IF函数粘到一个空单元格中 返回一个人名 不清楚怎么回事?——这实际是个数组公式,显示的只是第一个数据,如果把整个公式抹黑,再点F9,你将看到整个第一周的名单(有重复的);
2、DAY>=1永远为真 SUM(--(DAY>=1))的值岂不也是固定值?不明白这个判断条件是什么意思?——DAY>=1并不永远为真,当第一列全部为空时,SUM(--(DAY>=1))=0,如果不加这个条件,就会出错(引用出不该出现的“姓名”),同样,第二周的定义,如果A列还没有DAY>=8的日期数据时,若无IF(SUM(--(DAY>=8))>0条件,第二周里同样出现不该有的数据;
3、这个“第一周”究竟定义的是什么?我真是整不明白了,能帮我解释解释吗,多谢啦!——首先要说的是,公式并不是你上面引用的那样,而是这样的=IF(SUM(--(DAY>=1))>0,OFFSET(Sheet1!$B$3,MIN(IF(DAY=1,ROW-1)),,MAX(IF((DAY<=7)*(DAY>=1),ROW))-MIN(IF(DAY=1,ROW))+1),""):
⑴ IF(SUM(--(DAY>=1))>0,OFFSET(……),"")——如果第一列里有第一周的日期数据,则按offset(……)取值,否则赋以空。(第二周也然,IF(SUM(--(DAY>=8))>0,OFFSET(……),""),A列还没有第二周的日期数据,也赋以空,其余类似,不赘述)
⑵ OFFSET(Sheet1!$B$3,MIN(IF(DAY=1,ROW-1)),,MAX(IF((DAY<=7)*(DAY>=1),ROW))-MIN(IF(DAY=1,ROW))+1)——标准的offset公式:
① Sheet1!$B$3:(OFFSET的参数Reference )偏移量参照系。
② MIN(IF(DAY=1,ROW-1)):(OFFSET的参数Rows)上(下)偏移的行数。A列日期等于1号的最小行号-1,即0,行0偏移,本单元格起始。
③ OFFSET的参数Cols 左(右)偏移的列数为0,省0留逗号。
④ MAX(IF((DAY<=7)*(DAY>=1),ROW))-MIN(IF(DAY=1,ROW))+1:(OFFSET的参数Height)高度,即所要返回的引用区域的行数。日期小于等于7且大于等于1最大行号减去等于1的最小行号,再加上1,便是第一周日期区域的高度。(之所以用小于等于7且大于等于1((DAY<=7)*(DAY>=1)),是若没有后一项(DAY>=1),空白单元格也将作为0而小于7被统计在内,而前一项若只用DAY=7,则日期若未填满一周的日子,找不到7而出错。
⑤ OFFSET的参数Width 宽度,本列,省略。
⑥ 整个名称第一周,返回的就是第一周里的所有名字。
⑶第二周、第三周……公式一样、原理一样,只不过改动了日期的上下限。 |
|