基于日期区间批量填充员工休假标记的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
相关产品推荐
相关产品推荐

