Excel VBA开发需求:生成带年份的唯一月份序列并实现日期递增
扩展Excel VBA Worksheet_Change事件功能
原始代码实现了修改P3单元格时,提取Q列的唯一月份名称并输出到R列。以下是添加了两项扩展功能后的完整代码:
Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Dim v As Variant Dim c As Variant Dim yearVal As Integer Dim i As Integer Dim startDate As Date Dim countDays As Integer Set KeyCells = Range("P3") ' 仅当修改的是P3单元格时执行逻辑 If Not Application.Intersect(KeyCells, Target) Is Nothing Then ' 关闭事件触发,避免循环调用 Application.EnableEvents = False ' 获取Q列的所有数据(从Q3到最后一行非空单元格) v = Range("Q3", Range("Q" & Rows.Count).End(xlUp)).Value ' 提取P3单元格的年份 yearVal = Year(Range("P3").Value) ' 1. 提取Q列唯一月份到R列,同时在S列生成带年份的完整月份格式 With CreateObject("Scripting.Dictionary") For Each c In v .Item(c) = 1 Next c ' 输出唯一月份到R列 Range("R3").Resize(.Count) = Application.Transpose(.Keys) ' 生成带年份的月份格式到S列 For i = 1 To .Count Range("S" & 2 + i).Value = yearVal & "年" & .Keys()(i - 1) Next i End With ' 2. 根据P16的数值,从P3日期开始逐次增加28天 startDate = Range("P3").Value countDays = Range("P16").Value ' 清空之前的结果(输出列默认从T3开始,可自行调整) Range("T3", Range("T" & Rows.Count).End(xlUp)).ClearContents For i = 0 To countDays - 1 Range("T" & 3 + i).Value = startDate + i * 28 ' 设置日期显示格式,可按需修改 Range("T" & 3 + i).NumberFormat = "yyyy/m/d" Next i ' 重新开启事件触发 Application.EnableEvents = True MsgBox "P3单元格已更新,相关结果已生成。" End If End Sub
功能说明:
- 扩展功能1:提取Q列唯一月份到R列后,对应S列会生成
年份+月份的完整格式(比如P3年份为2024,R列是"三月",S列则为"2024年三月") - 扩展功能2:以P3的日期为起始点,按照P16的数值作为生成次数,逐次叠加28天,结果输出到T列(可自行修改输出列的标识),同时设置了清晰的日期显示格式
注意:代码中加入了
Application.EnableEvents的开关,防止修改单元格时重复触发事件导致报错。如果需要调整输出列位置,直接修改代码中对应的列字母即可。
内容的提问来源于stack exchange,提问作者xhamsterIT
相关产品推荐
相关产品推荐

