咨询:生成员工部门、姓名及可用日期Excel表格需用VBA还是Lookup?
员工可用日期明细生成方案
函数公式实现
不需要用Lookup函数,用TEXTJOIN+IF的组合就能搞定,适合数据量不大的场景:
- 假设原表结构:A列=部门,B列=姓名,C到Y列=2025年各日期(表头是日期值),且已安排任务的日期单元格有内容,可用日期单元格为空
- 在目标表的可用日期列(比如C列)输入数组公式:
=TEXTJOIN("、",TRUE,IF(原表!C2:Y2="",TEXT(原表!C$1:Y$1,"yyyy年m月d日"),"")) - 输入后按
Ctrl+Shift+Enter完成数组公式确认(新版Excel支持直接回车),然后下拉公式批量生成所有员工的可用日期字符串 - 目标表的部门、姓名列直接引用原表对应单元格即可
VBA脚本实现
如果员工或日期数量较多,函数公式运行效率低,用VBA更高效:
- 打开Excel,按
Alt+F11打开VBA编辑器 - 插入新模块:右键当前工作簿→插入→模块
- 粘贴以下代码:
Sub GenerateAvailableDates() Dim srcSheet As Worksheet, targetSheet As Worksheet Dim lastRow As Long, lastCol As Long, i As Long, j As Long Dim availableDates As String ' 设置原数据工作表和目标工作表(根据实际名称修改) Set srcSheet = ThisWorkbook.Sheets("原数据") Set targetSheet = ThisWorkbook.Sheets("目标明细") ' 清空目标表已有数据(保留表头) targetSheet.Range("A2:C" & targetSheet.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' 获取原表最后一行和最后一列 lastRow = srcSheet.Cells(Rows.Count, 1).End(xlUp).Row lastCol = srcSheet.Cells(1, Columns.Count).End(xlToLeft).Column ' 遍历每位员工 For i = 2 To lastRow availableDates = "" ' 遍历所有日期列 For j = 3 To lastCol If srcSheet.Cells(i, j).Value = "" Then ' 拼接可用日期字符串 If availableDates = "" Then availableDates = Format(srcSheet.Cells(1, j).Value, "yyyy年m月d日") Else availableDates = availableDates & "、" & Format(srcSheet.Cells(1, j).Value, "yyyy年m月d日") End If End If Next j ' 写入目标表 targetSheet.Cells(i, 1).Value = srcSheet.Cells(i, 1).Value ' 部门 targetSheet.Cells(i, 2).Value = srcSheet.Cells(i, 2).Value ' 姓名 targetSheet.Cells(i, 3).Value = availableDates ' 可用日期 Next i MsgBox "可用日期明细已生成!" End Sub - 修改代码中
srcSheet和targetSheet的工作表名称为实际名称 - 按F5运行脚本,即可自动生成目标明细表格
方案选择
- 数据量小(几十到上百条员工):优先用函数公式,操作简单无需代码
- 数据量大(几百条以上员工/日期列多):用VBA,运行速度更快,批量处理更省心
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

