用VBA计算两个日期之间的工作日(去掉周末两天)

最近公司HR和Finance想算员工的工作天数,想让我帮忙写些VBA,自己从网上找了下代码,自己再改改,以下来自网络。

计算两个日期之间的工作日,用VBA,因量大,最好用数组做

复制代码
Sub kk()
Dim arr, i&, j&, m&
arr = Sheet2.Range("b3:f4")
For i = 1 To UBound(arr)
    m = 0
    For j = arr(i, 1) To arr(i, 3)
       If Weekday(j) <> 1 And Weekday(j) <> 7 Then m = m + 1
    Next
    arr(i, 5) = m
Next
Sheet2.Range("b3").Resize(UBound(arr), 5) = arr
End Sub
复制代码

根据他提供的方法,其实就是判断某个日期是星期一到星期五就日期计数加1,一直到结束,自己改良了下:

复制代码
Sub m1()
For i = 2 To 5000
    days = 0
    
    If Range("b" & i) <> "" And Range("c" & i) <> "" Then
        
        Dim d1, d2 As Date
        d1 = Cells(i, "b")
        d2 = Cells(i, "c")
        
        Do While d1 <= d2
        If Weekday(d1, vbMonday) < 6 Then
            days = days + 1
        End If
            d1 = DateAdd("d", 1, d1)
        Loop
        
        Range("d" & i) = days
        
    End If
Next
End Sub
复制代码

上面的这个方法只算是可以运行,如果计算的天数多并且员工数多,则效果就差了,所以又有了下面的改良。

计算两个日期的整周数,然后乘5,在加上前后不够整周的零头。

复制代码
Sub m2()
For i = 2 To 5000
    If Range("b" & i) <> "" And Range("c" & i) <> "" Then
        Dim d1, d2 As Date
        d1 = Cells(i, "b")
        d2 = Cells(i, "c")
        days1 = 0
        days2 = 0
        weekcount = 0
        
        Do While Weekday(d1, vbMonday) < 7 And d1 <= d2
        If Weekday(d1, vbMonday) < 6 Then
            days1 = days1 + 1
        End If
            d1 = DateAdd("d", 1, d1)
        Loop
        
        weekcount = DateDiff("w", d1, d2, vbMonday)
        days2 = Weekday(d2, vbMonday)
        days2 = IIf(days2 = 6, 5, IIf(days2 = 7, 0, days2))
        Range("d" & i) = IIf(d1 >= d2, days1, days1 + 5 * weekcount + days2)
        
    End If
Next

End Sub
复制代码

以上代码可以通过测试验证效率,如下代码

Sub Button2_Click()
    d1 = Timer
    m1
    'm2
    d2 = Timer
    MsgBox d2 - d1
End Sub

 

参考出处:http://www.excelpx.com/thread-299850-1-1.html

posted on   jack_Meng  阅读(7127)  评论(0编辑  收藏  举报

编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩