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

基于日期区间批量填充员工休假标记的VBA宏开发需求

Excel宏开发需求

现有按int编号区分的员工休假日期列表,需开发宏实现以下功能:

  • 判断员工的休假日期是否属于表格顶部标注的周日期区间
  • 每个员工的5个**整周休假(vac)**日期,匹配到对应周区间后,填入该周Weekdays下方的第一单元格
  • 每个员工的5个**弹性休假(FLEX)**日期,匹配到对应周区间后,填入该周Weekdays下方的第二单元格
  • 循环处理所有带int编号的员工

此前尝试使用Excel公式实现,但拖拽适配所有员工操作繁琐,希望通过宏直接在单元格写入文本,方便后续手动调整排班。

此前使用的Excel公式

整周休假匹配公式

=IF(OR(AND($I$82>=R78,$I$82<T78),AND($J$82>=R78,$J$82<T78),AND($K$82>=R78,$K$82<T78),AND($L$82>=R78,$L$82<T78),AND($M$82>=R78,$M$82<T78)),"vac"," ")

弹性休假匹配公式

=IF(OR(AND($C$82>=R78,$C$82<T78),AND($D$82>=R78,$D$82<T78),AND($E$82>=R78,$E$82<T78),AND($F$82>=R78,$F$82<T78),AND($G$82>=R78,$G$82<T78)),"FLEX"," ")

解决方案:VBA宏代码

以下是实现需求的VBA宏,可直接运行写入文本:

Sub FillLeaveStatus()
    Dim ws As Worksheet
    Dim empRange As Range, empCell As Range
    Dim weekStartCol As Range, weekStartColCell As Range
    Dim vacDates As Variant, flexDates As Variant
    Dim i As Integer, j As Integer
    Dim weekStart As Date, weekEnd As Date
    
    ' 设置目标工作表,根据实际情况修改Sheet名称
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ' 假设员工编号所在列是A列,从第2行开始(根据实际调整)
    Set empRange = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
    
    ' 假设周区间的起始日期在R列,结束日期在T列,从第78行开始(根据实际调整)
    Set weekStartCol = ws.Range("R78:R" & ws.Cells(ws.Rows.Count, "R").End(xlUp).Row)
    
    For Each empCell In empRange
        ' 获取当前员工的整周休假日期(I到M列)和弹性休假日期(C到G列)
        vacDates = Array(ws.Cells(empCell.Row, "I").Value, ws.Cells(empCell.Row, "J").Value, _
                        ws.Cells(empCell.Row, "K").Value, ws.Cells(empCell.Row, "L").Value, _
                        ws.Cells(empCell.Row, "M").Value)
        flexDates = Array(ws.Cells(empCell.Row, "C").Value, ws.Cells(empCell.Row, "D").Value, _
                          ws.Cells(empCell.Row, "E").Value, ws.Cells(empCell.Row, "F").Value, _
                          ws.Cells(empCell.Row, "G").Value)
        
        ' 遍历所有周区间
        For Each weekStartColCell In weekStartCol
            weekStart = weekStartColCell.Value
            weekEnd = ws.Cells(weekStartColCell.Row, "T").Value
            
            ' 检查整周休假日期
            For i = LBound(vacDates) To UBound(vacDates)
                If IsDate(vacDates(i)) Then
                    If vacDates(i) >= weekStart And vacDates(i) < weekEnd Then
                        ' 填入Weekdays下方第一单元格,假设为周区间行的下一行(根据实际调整)
                        ws.Cells(weekStartColCell.Row + 1, weekStartColCell.Column).Value = "vac"
                        Exit For ' 找到匹配后退出循环
                    End If
                End If
            Next i
            
            ' 检查弹性休假日期
            For j = LBound(flexDates) To UBound(flexDates)
                If IsDate(flexDates(j)) Then
                    If flexDates(j) >= weekStart And flexDates(j) < weekEnd Then
                        ' 填入Weekdays下方第二单元格,假设为周区间行的下两行(根据实际调整)
                        ws.Cells(weekStartColCell.Row + 2, weekStartColCell.Column).Value = "FLEX"
                        Exit For ' 找到匹配后退出循环
                    End If
                End If
            Next j
        Next weekStartColCell
    Next empCell
    
    MsgBox "休假状态填充完成!"
End Sub

代码说明

  • 请根据实际表格结构修改工作表名称、员工编号列、休假日期列、周区间列的位置
  • 代码会遍历所有员工,逐个检查休假日期与周区间的匹配关系,匹配后直接写入对应单元格
  • 若同一员工多个休假日期匹配同一周区间,仅写入一次(可根据需求调整逻辑)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:52:52