ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何获取某日期段中包含的所有节日?

如何获取某日期段中包含的所有节日?

作者:绿色风 分类: 时间:2022-08-17 浏览:99
楼主
amulee
Q:如何获取某日期段中包含的节日?
A:如下例,节日有元旦,春节、五一、国庆、店庆等。可以编写自定义函数,代码如下:
  1. Function CHoliday(Start_Date, End_Date)
  2.     Dim d As Object, arrHd, Year1, Year2, Temp, ArrTemp
  3.     Dim Date1, Date2
  4.     Date1 = CDate(Start_Date)
  5.     Date2 = CDate(End_Date)
  6.     If Date2 < Date1 Then
  7.         CHoliday = "#VALUE!"
  8.         Exit Function
  9.     End If
  10.     ReDim arrHd(1 To 5, 1 To 2)
  11.     arrHd(1, 1) = "1-1"
  12.     arrHd(2, 1) = ""
  13.     arrHd(3, 1) = "5-1"
  14.     arrHd(4, 1) = "10-1"
  15.     arrHd(5, 1) = "11-15"
  16.     arrHd(1, 2) = "元旦"
  17.     arrHd(2, 2) = "春节"
  18.     arrHd(3, 2) = "五一"
  19.     arrHd(4, 2) = "国庆"
  20.     arrHd(5, 2) = "店庆"
  21.     Year1 = Year(Date1)
  22.     Year2 = Year(Date2)
  23.     Set d = CreateObject("Scripting.Dictionary")
  24.     For k = Year1 To Year2
  25.         For i = 1 To 5
  26.             If i <> 2 Then
  27.                 Temp = CDate(k & "-" & arrHd(i, 1))
  28.             Else
  29.                 Temp = CDate(solar(k & "-1-1"))
  30.             End If
  31.             If Date1 <= Temp And Date2 >= Temp Then d(arrHd(i, 2)) = 1
  32.         Next i
  33.     Next
  34.     CHoliday = Join(d.keys)
  35. End Function
另外需要一个模块添加以下农历转公历的代码:
  1. Type ConvDataA
  2.     leapmonth As Integer
  3.     month(1 To 13) As Integer
  4.     sp_month As Integer 'Solar month of Spring Festival
  5.     sp_day As Integer   'Solar day   of Spring Festival
  6. End Type
  7. Private Function LunarData(q_year) As ConvDataA
  8.     Dim d As Long
  9.     Dim month(1 To 13) As Integer
  10. '1901-2100
  11. LunarCal = Array(&H4AE53, &HA5748, &H5526BD, &HD2650, &HD9544, &H46AAB9, &H56A4D, &H9AD42, &H24AEB6, &H4AE4A, _
  12. &H6A4DBE, &HA4D52, &HD2546, &H5D52BA, &HB544E, &HD6A43, &H296D37, &H95B4B, &H749BC1, &H49754, _
  13. &HA4B48, &H5B25BC, &H6A550, &H6D445, &H4ADAB8, &H2B64D, &H95742, &H2497B7, &H4974A, &H664B3E, _
  14. &HD4A51, &HEA546, &H56D4BA, &H5AD4E, &H2B644, &H393738, &H92E4B, &H7C96BF, &HC9553, &HD4A48, _
  15. &H6DA53B, &HB554F, &H56A45, &H4AADB9, &H25D4D, &H92D42, &H2C95B6, &HA954A, &H7B4ABD, &H6CA51, _
  16. &HB5546, &H555ABB, &H4DA4E, &HA5B43, &H352BB8, &H52B4C, &H8A953F, &HE9552, &H6AA48, &H7AD53C, _
  17. &HAB54F, &H4B645, &H4A5739, &HA574D, &H52642, &H3E9335, &HD9549, &H75AABE, &H56A51, &H96D46, _
  18. &H54AEBB, &H4AD4F, &HA4D43, &H4D26B7, &HD254B, &H8D52BF, &HB5452, &HB6A47, &H696D3C, &H95B50, _
  19. &H49B45, &H4A4BB9, &HA4B4D, &HAB25C2, &H6A554, &H6D449, &H6ADA3D, &HAB651, &H93746, &H5497BB, _
  20. &H4974F, &H64B44, &H36A537, &HEA54A, &H86B2BF, &H5AC53, &HAB647, &H5936BC, &H92E50, &HC9645, _
  21. &H4D4AB8, &HD4A4C, &HDA541, &H25AA36, &H56A49, &H7AADBD, &H25D52, &H92D47, &H5C95BA, &HA954E, _
  22. &HB4A43, &H4B5537, &HAD54A, &H955ABF, &H4BA53, &HA5B48, &H652BBC, &H52B50, &HA9345, &H474AB9, _
  23. &H6AA4C, &HAD541, &H24DAB6, &H4B64A, &H69573D, &HA4E51, &HD2646, &H5E933A, &HD534D, &H5AA43, _
  24. &H36B537, &H96D4B, &HB4AEBF, &H4AD53, &HA4D48, &H6D25BC, &HD254F, &HD5244, &H5DAA38, &HB5A4C, _
  25. &H56D41, &H24ADB6, &H49B4A, &H7A4BBE, &HA4B51, &HAA546, &H5B52BA, &H6D24E, &HADA42, &H355B37, _
  26. &H9374B, &H8497C1, &H49753, &H64B48, &H66A53C, &HEA54F, &H6B244, &H4AB638, &HAAE4C, &H92E42, _
  27. &H3C9735, &HC9649, &H7D4ABD, &HD4A51, &HDA545, &H55AABA, &H56A4E, &HA6D43, &H452EB7, &H52D4B, _
  28. &H8A95BF, &HA9553, &HB4A47, &H6B553B, &HAD54F, &H55A45, &H4A5D38, &HA5B4C, &H52B42, &H3A93B6, _
  29. &H69349, &H7729BD, &H6AA51, &HAD546, &H54DABA, &H4B64E, &HA5743, &H452738, &HD264A, &H8E933E, _
  30. &HD5252, &HDAA47, &H66B53B, &H56D4F, &H4AE45, &H4A4EB9, &HA4D4C, &HD1541, &H2D92B5, &HD5349)
  31. startyear = 1901
  32. ng = LunarCal(q_year - startyear)
  33.     d = &H100000
  34.     LunarData.leapmonth = Int(ng / d)
  35.     ng = ng Mod d
  36.     d = &H80
  37.     mdata = Int(ng / d)
  38.     ng = ng Mod d
  39.     d = &H20
  40.     LunarData.sp_month = Int(ng / d)
  41.     LunarData.sp_day = ng Mod d
  42.     d = &H1000
  43.     i = 1
  44.     Do
  45.         LunarData.month(i) = 29 + Int(mdata / d)
  46.         mdata = mdata Mod d
  47.         If d = 1 Then Exit Do
  48.         d = d / 2
  49.         i = i + 1
  50.     Loop
  51.     If LunarData.leapmonth = 0 Then LunarData.month(i) = 0
  52. End Function
  53. Function solar(Lunar_date, Optional IS_lunar_leapmonth As Integer = 0) As String
  54. Dim a As ConvDataA
  55. Lunar_date = Split(Lunar_date, "-")
  56. s_year = Lunar_date(0)
  57. For Each C In Lunar_date
  58.     If C = "L" Then IS_lunar_leapmonth = 1
  59. Next
  60. a = LunarData(s_year)
  61. sp_date = DateSerial(s_year, a.sp_month, a.sp_day)
  62. If Lunar_date(1) <> a.leapmonth Then IS_lunar_leapmonth = 0
  63. x = Lunar_date(2)
  64. tm = Lunar_date(1) + IS_lunar_leapmonth - 1
  65. For i = 1 To tm
  66.     x = x + a.month(i)
  67.     If i = a.leapmonth And IS_lunar_leapmonth = 0 Then
  68.         x = x + a.month(13)
  69.     End If
  70. Next
  71. s_date = sp_date + x - 1
  72. solar = s_date
  73. End Function
函数用法:
  1. =CHoliday(起始日期,终止日期)



获取包含的节假日.rar
2楼
amulee
也可以用gouweicao78版主的数组公式,但是有缺陷。
  1. =IF(COUNT($A2:$B2)<2,,INDEX($J:$J,SMALL(IF(MMULT(N(TEXT(TRANSPOSE(ROW(INDIRECT($A2&":"&$B2))),"m-d")=$I$2:$I$6),ROW(INDIRECT($A2&":"&$B2))^0),ROW($2:$6),4^8),COLUMN(A:A))))&""
3楼
gouweicao78
愿闻其详?
4楼
amulee
跨年度时,春节判断有误
5楼
gouweicao78
春节是农历,目前除了自定义函数的方法,其他都有缺陷。

免责声明

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

评论列表
sitemap