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

Excel VBA需求:按A列分组循环生成指定日期范围

Excel VBA 分组日期填充解决方案

需求概述

  • 以单元格D1的Start Date为起始日期、F1的End Date为结束日期
  • 为A3开始的每一组相同编号(A列)的记录,在F列从起始日期开始依次填充日期,每组记录数对应日期数量
  • 当A列编号变更时,日期需重新从起始日期开始生成

现有代码仅能一次性生成完整日期范围,无法实现分组重置,示例数据如下:

Start Date  28/04/2023  End Date  04/05/2023
No  Name    Location    Rate    Grade   Date
200 Dan                     28/04/2023
200 Dan                     29/04/2023
200 Dan                     30/04/2023
200 Dan                     01/05/2023
200 Dan                     02/05/2023
200 Dan                     03/05/2023
200 Dan                     04/05/2023
300     Sam                                     28/04/2023
300     Sam                                     29/04/2023
300     Sam                                     30/04/2023
500 Mike                        28/04/2023
500 Mike                        29/04/2023
500 Mike                        30/04/2023
500 Mike                        01/05/2023
500 Mike                        02/05/2023
500 Mike                        03/05/2023
500 Mike                        04/05/2023

现有代码(存在问题)

Sub IncreaseDate()

Dim FirstDate As Date
Dim myDate As Date
Dim row As Long

FirstDate = Range("D1").Value - 1

NextDate = Range("F1").Value

row = 3

Do Until FirstDate = NextDate
    FirstDate = FirstDate + 1
    Range("F" & row).Value = FirstDate
    Range("G" & row).Value = "=F" & row
    row = row + 1
Loop
End Sub

修正后的代码

Sub FillGroupedDates()
    Dim startDate As Date, endDate As Date, currentDate As Date
    Dim lastRow As Long, i As Long
    Dim currentID As String, previousID As String
    
    ' 获取起始和结束日期
    startDate = Range("D1").Value
    endDate = Range("F1").Value
    
    ' 获取A列最后一行数据行号
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    ' 初始化变量
    previousID = ""
    currentDate = startDate
    
    ' 遍历所有数据行
    For i = 3 To lastRow
        currentID = Cells(i, "A").Value
        
        ' 编号变更时重置日期
        If currentID <> previousID Then
            currentDate = startDate
            previousID = currentID
        End If
        
        ' 填充日期(不超过结束日期)
        If currentDate <= endDate Then
            Cells(i, "F").Value = currentDate
            Cells(i, "G").Formula = "=F" & i
            currentDate = currentDate + 1
        End If
    Next i
    
    ' 设置F列日期显示格式
    Columns("F").NumberFormat = "dd/mm/yyyy"
End Sub

代码说明

  • 遍历A列从第3行到最后一行的记录,通过对比当前行与上一行的编号判断分组
  • 每次分组切换时,将当前日期重置为D1的起始日期
  • 逐行填充递增日期,直到达到F1的结束日期
  • 保留原代码中G列引用F列的公式逻辑
  • 强制设置F列日期格式,确保日期显示符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:40:19