You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA如何统计指定月份指定工作日数量并乘以工时?

修复VBA统计指定月份工作日总数并计算工时的问题

原代码核心错误是完全没统计指定月份内目标工作日的实际天数,直接用var_month推测是月份总天数乘以工时,完全偏离需求逻辑。比如2023年1月有31天,但周一只有5天,原代码会算出31*1.2的错误结果。

实现步骤

  • 解析用户输入的月份字符串如Jan-2023,转换为该月份第一天和最后一天的日期
  • 提取目标工作日如Monday,映射为VBA对应的星期常量
  • 统计该月份内符合目标工作日的天数
  • 乘以D4单元格的工时值,输出结果

修正后的VBA代码

Sub CalculateWorkHours()
    Dim inputMonth As String
    Dim targetMonthStart As Date, targetMonthEnd As Date
    Dim targetWeekday As String
    Dim weekdayNum As Integer
    Dim dayCount As Integer
    Dim workHoursPerDay As Double
    Dim totalHours As Double
    
    ' 获取TEXTBOX中用户输入的月份,替换成你的TEXTBOX控件名
    inputMonth = txtMonth.Value
    
    ' 转换为目标月份的第一天和最后一天
    targetMonthStart = DateValue(inputMonth)
    targetMonthEnd = DateSerial(Year(targetMonthStart), Month(targetMonthStart) + 1, 0)
    
    ' 提取Input表B2中的目标工作日(如"Monday")
    targetWeekday = UCase(Split(ThisWorkbook.Sheets("Input").Range("B2").Value, " ")(1))
    
    ' 将工作日名称映射为VBA星期常量(vbSunday=1,vbMonday=2...vbSaturday=7)
    Select Case targetWeekday
        Case "MONDAY": weekdayNum = vbMonday
        Case "TUESDAY": weekdayNum = vbTuesday
        Case "WEDNESDAY": weekdayNum = vbWednesday
        Case "THURSDAY": weekdayNum = vbThursday
        Case "FRIDAY": weekdayNum = vbFriday
        Case "SATURDAY": weekdayNum = vbSaturday
        Case "SUNDAY": weekdayNum = vbSunday
    End Select
    
    ' 统计目标工作日的天数
    dayCount = 0
    Dim currentDate As Date
    currentDate = targetMonthStart
    Do While currentDate <= targetMonthEnd
        ' 统一以周一为一周起始,避免默认周日的逻辑干扰
        If Weekday(currentDate, vbMonday) = weekdayNum - vbMonday + 1 Then
            dayCount = dayCount + 1
        End If
        currentDate = currentDate + 1
    Loop
    
    ' 获取Input表D4的工时值
    workHoursPerDay = ThisWorkbook.Sheets("Input").Range("D4").Value
    
    ' 计算总工时并输出
    totalHours = dayCount * workHoursPerDay
    Debug.Print "Every " & LCase(targetWeekday) & " = " & totalHours
End Sub

代码说明

  1. 日期解析:用DateValue转换用户输入的月份字符串,再通过DateSerial快速获取月份最后一天
  2. 工作日映射:提取B2中"every XXXX"里的工作日名称,转大写后匹配VBA星期常量,避免格式和大小写问题
  3. 天数统计:遍历月份内所有日期,用Weekday函数判断是否为目标工作日,统一以周一为一周起始,避免默认周日的逻辑混乱
  4. 工时计算:将统计的工作日天数乘以D4的工时值,输出正确结果

注:你示例中写的"5*1.2=5"是笔误,实际正确结果应为6

内容的提问来源于stack exchange,提问作者NewDevOps01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:01:14