【问题标题】:Finding week days in a month excel VBA查找一个月中的工作日excel VBA
【发布时间】:2021-12-27 11:26:57
【问题描述】:

我有一张包含开始日期和结束日期的表格。我想找出两个日期之间有多少个星期一、星期二、星期三、星期四、星期五、星期六和星期日。所以我写了以下函数。它工作正常,但每月的第一天正在跳过。

=ABS(INT((N($B$5)-L10)/7)-INT((N($B$4)-L10)/7))      'B4- Starting date and B5- Ending date

例如: 2021 年 1 月 10 日和 201 年 10 月 31 日开始和结束日期。

根据上述功能,周一至 4、周二至 4、周三至 4、周四至 4、周五至 4、周六至 5 和周日 5

但最初是 Mon-4、Tue-4、Wed-4。 Thu-4、Fri-5、Sat-5、Sun-5。

这里发生的事情是 2021 年 10 月 1 日是星期五。它会跳过一个月的第一天。

任何帮助......提前tqs......

【问题讨论】:

  • L10 中有什么内容?
  • @DarrenBartrup-Cook 很确定它是一周中的数字日期(例如 1..7 或 0..6)
  • @Darren Bartup-Cook L10 表示 Sun-1、Mon-2、Tue-3 等...,

标签: excel vba excel-formula


【解决方案1】:

您可以使用我所说的“蛮力”方法,创建一个包含所有相关日期的数组,然后检查匹配项:

=SUMPRODUCT(N(WEEKDAY(ROW(INDEX($A:$A,$B$4):INDEX($A:$A,$B$5)))=L10))

既然您要求 VBA 解决方案,这里有一种方法:

Mnth 可以是一个月中的任何日期
DOW 是一周中的哪一天,1=Sunday
该函数使用相同的算法 -- 测试范围内的每个日期以查看它是否与所需的星期几匹配。

Option Explicit
Function weekdaysInMonth(Mnth As Date, Optional DOW As Long = vbSunday) As Long
    Dim I As Long
    Dim dStart As Date, dEnd As Date
    Dim Cnt As Long
    
dStart = DateSerial(Year(Mnth), Month(Mnth), 1)
dEnd = DateSerial(Year(Mnth), Month(Mnth) + 1, 0)

For I = dStart To dEnd
    If Weekday(I) = DOW Then Cnt = Cnt + 1
Next I
weekdaysInMonth = Cnt

End Function

【讨论】:

  • .. 很棒的“SUMPRODUCT..”工作正常。我有个疑问。这里的“A:A”是什么(参考 INDEX($A:$A,....)
  • @Raj ROW(INDEX($A:$A,$B$4):INDEX...)) 返回来自B4..B5 的所有日期的数组。将公式的那部分放在一个单独的单元格中,然后查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2016-09-23
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多