ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用自定义函数求某年某月的第几个星期几?

如何用自定义函数求某年某月的第几个星期几?

作者:绿色风 分类: 时间:2022-08-17 浏览:143
楼主
wcymiss
Q:生活中常有类似感恩节、母亲节等情况的节日,它们表示在每年的第几个星期的周几。如何编写一个自定义函数,含有年、月、周次、周几这四个参数,返回对应的日期?如:当在输入函数: 日期(2011,5,2,7 )时,就表示是2011年5月第二个星期的周日,即母亲节。
A:代码如下:
  1. Function 日期(Optional ByVal Yea As Integer = 0, Optional ByVal Mon As Integer = 0, _
  2.     Optional ByVal Num As Integer = 0, Optional ByVal Wee As Integer = 0) As Date
  3.     '定义四个参数:Yea为年,Mon为月,Num为周次,Wee为周几。
  4.     '参数省略时默认为0
  5.     If Yea = 0 Then Yea = Year(Now()) '如果参数为0,就默认为当年
  6.     If Mon = 0 Then Mon = Month(Now()) '如果参数为0,就默认为当月
  7.     If Num = 0 Then Num = 1 '如果参数为0,就默认为第一周
  8.     If Wee = 0 Then Wee = 7 '如果参数为0,就默认为周日
  9.     日期 = Num * 7 - 7 + Wee Mod 7 + 1 - Int((Wee Mod 7 + 1 - DateSerial(Yea, Mon, 1)) / 7) * 7
  10. End Function

 
代码思路如下:
1、首先要了解,当 a 为正数时, - Int ( - a / 7 ) * 7  就相当于函数里的ceiling(a,7)的效果。
2、假设a为日期, - Int ( -a / 7 ) * 7,就是求得日期a之后(含a当天)的第一个周六的日期。
     如果要求a之后的第n个周六,那就是 : - Int ( -a / 7 ) * 7 + ( n - 1 )*7
3、如果要需要求出周五的日期,因为:周五 = 周六+6 或者 周六 -1,公式的最后势必要 +6 或 -1,此时沿用”有借有还“的法则,公式最后 加6 了,公式前面就要先减6,也就是说, -int(-(a-6)/7)*7 +6才是a之后(含a当天)的第一个周五的日期。
4、套用公式: -int (- ( a - 6 ) / 7 ) * 7 + 6 + ( n - 1 )*7
    a 为 指定月份的第一天,即为:DateSerial(Yea, Mon, 1))
    n 为 Num
    有借有还的参数,当求周六时,为0或7,当求周五时,为6(前减后加,下同),当求周四时,为5,……即为:wee mod 7 +1
5、套用后公式稍加变形即得出自定义代码里的公式。
6、参考:如何计算某月第三个星期日的日期?
http://www.exceltip.net/thread-749-1-1.html



自定义日期.rar

其他补充:在工作表里使用此函数时,如果要省略参数,写成:=日期() 或 =日期(,,,) 都是可以的。
但如果在代码里需要调用该函数,省略参数时必须连逗号一起省略。如:日期(),日期(2011,,3)。但 日期(,,,)、日期(2011,,3,)的写法将会出错。
2楼
danysy
这个好,谢谢楼主分享
3楼
chenlifeng
可以就评分呀,感谢楼主对我的问题进行总结和分析,我正要问呢!
4楼
CheryBTL
哈哈 坐个板凳学习~~~~
5楼
liuguansky
学习了。吴姐对日期 函数的理解很深。学习,我看到日期函数就头晕。
6楼
ppl2011
学习了,呵呵~~~
7楼
jinsan
很好!收藏了!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap