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

如何按指定次数重复数据行并同步修改日期类变量?

如何按指定次数重复数据行并同步修改日期类变量?

嗨,我完全get到你的需求了——就是要把每个人的年假记录拆成每天一行,同时把日期范围展开成具体的单日日期,还要让年假天数统一显示为1对吧?之前你试了VLOOKUP的方法可能只解决了重复行的问题,但日期拆分这块没搞定,我给你几个实用的Excel本地方案,不用跳转到其他网站就能搞定:

方法一:用Power Query可视化操作(最省心)

这个方法不用写复杂公式,全程点鼠标就能完成:

  • 第一步:选中你的原始数据区域(包括表头),点击Excel顶部的「数据」选项卡→「从表格/区域」,把数据导入Power Query编辑器
  • 第二步:选中「Date from dd/mm to dd/mm」列,点击「添加列」→「自定义列」,输入以下公式(作用是把日期范围转成连续的日期序列):
    {Number.From(Date.FromText([#"Date from dd/mm to dd/mm"], "dd/MM-"))..Number.From(Date.FromText(Text.AfterDelimiter([#"Date from dd/mm to dd/mm"], "-"), "dd/MM"))}
    
  • 第三步:点击这个新生成的自定义列旁边的小箭头(展开按钮),选择「到新行」,这样就把日期范围拆成了每天一行
  • 第四步:把原来的「Number of days of Annual leave」列替换成固定值1,或者直接添加一个新列输入1
  • 第五步:点击编辑器顶部的「关闭并上载」,就能得到你想要的展开后的数据了

方法二:用公式组合实现(适合喜欢函数的朋友)

先准备一个辅助列来标记累计的行数,再用索引函数匹配生成数据:

  1. 生成辅助列:在原始数据的D2单元格输入公式=SUM($B$2:B2),然后下拉填充到所有数据行。这个列会累计总天数(比如Amy的3天会显示3,Iris的2天会显示5)
  2. 生成展开后的姓名列:在空白区域的F2单元格输入公式:
    =INDEX($A$2:$A$3,MATCH(ROW(A1),$D$2:$D$3,1))
    
    下拉填充直到出现错误值(说明所有行都生成完了)
  3. 生成年假天数列:直接在G2单元格输入1,下拉填充即可
  4. 生成单日日期列:在H2单元格输入公式(注意这里默认年份是2024,你可以根据实际情况修改):
    =TEXT(DATE(2024,MID(INDEX($C$2:$C$3,MATCH(ROW(A1),$D$2:$D$3,1)),4,2),LEFT(INDEX($C$2:$C$3,MATCH(ROW(A1),$D$2:$D$3,1)),2))+(ROW(A1)-SUMIF($D$1:D1,"<"&ROW(A1),$B$2:$B$3)-1),"dd/mm")
    
    下拉填充,就能得到每天的日期了

方法三:用VBA宏批量处理(适合大量数据)

如果你的数据量很大,用宏可以一次性批量处理:

  1. 打开Excel的「开发工具」选项卡→点击「Visual Basic」(或者按Alt+F11)
  2. 在弹出的编辑器里,右键点击你的工作簿→「插入」→「模块」
  3. 粘贴以下代码(记得把代码里的Sheet1改成你的原始数据所在的工作表名):
    Sub ExpandLeaveRecords()
        Dim wsSource As Worksheet, wsTarget As Worksheet
        Dim lastRow As Long, targetRow As Long, i As Long
        Dim startDate As Date, endDate As Date, currentDate As Date
        
        Set wsSource = ThisWorkbook.Worksheets("Sheet1") '替换成你的源工作表名
        Set wsTarget = ThisWorkbook.Worksheets.Add '新建目标工作表
        '复制表头到目标表
        wsSource.Rows(1).Copy wsTarget.Rows(1)
        
        lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
        targetRow = 2
        
        For i = 2 To lastRow
            '提取起始日期和结束日期
            startDate = DateSerial(2024, Mid(wsSource.Cells(i, "C"), 4, 2), Left(wsSource.Cells(i, "C"), 2))
            endDate = DateSerial(2024, Mid(Split(wsSource.Cells(i, "C"), "-")(1), 4, 2), Left(Split(wsSource.Cells(i, "C"), "-")(1), 2))
            
            currentDate = startDate
            Do While currentDate <= endDate
                '写入姓名
                wsTarget.Cells(targetRow, "A").Value = wsSource.Cells(i, "A").Value
                '写入年假天数1
                wsTarget.Cells(targetRow, "B").Value = 1
                '写入格式化后的日期
                wsTarget.Cells(targetRow, "C").Value = Format(currentDate, "dd/mm")
                targetRow = targetRow + 1
                currentDate = currentDate + 1
            Loop
        Next i
        
        '自动调整列宽
        wsTarget.Columns.AutoFit
        MsgBox "数据展开完成!"
    End Sub
    
  4. 点击编辑器顶部的「运行」按钮(绿色三角),等待宏执行完成,就能在新工作表里看到结果了

备注:内容来源于stack exchange,提问作者doraemon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:32:59