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

如何在Excel宏中实现随日期变化自动生成对应月份首日

实现Excel列自动显示对应日期的当月首日(宏方案)

方法1:绑定工作表变更事件(自动更新)

这种方式能在目标日期列(示例为D列)内容更新时,自动同步生成对应行的当月首日(示例为E列),无需手动触发。

代码示例:

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 监控D列的单元格变更
    If Not Intersect(Target, Me.Columns("D")) Is Nothing Then
        Dim cell As Range
        ' 遍历所有变更的单元格
        For Each cell In Intersect(Target, Me.Columns("D"))
            If IsDate(cell.Value) Then
                ' 计算当月首日:提取原日期的年、月,拼接1号
                cell.Offset(0, 1).Value = DateSerial(Year(cell.Value), Month(cell.Value), 1)
                ' 同步原日期的格式,避免格式混乱
                cell.Offset(0, 1).NumberFormat = cell.NumberFormat
            Else
                ' 若单元格不是有效日期,清空对应位置内容
                cell.Offset(0, 1).ClearContents
            End If
        Next cell
    End If
End Sub

使用步骤:

  • 右键目标工作表标签→点击「查看代码」,将上述代码粘贴到弹出的窗口中
  • 后续D列日期无论手动修改还是因人员变动更新,E列都会自动生成对应当月首日,跨年份无需额外操作

方法2:批量处理宏(手动触发)

如果不需要自动更新,仅需一键批量生成当月首日,可使用此宏:

代码示例:

Sub GenerateFirstDayOfMonth()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    
    Set ws = ActiveSheet ' 可指定具体工作表,如Set ws = ThisWorkbook.Worksheets("Sheet1")
    lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row ' 获取D列最后一行有数据的行号
    
    ' 从第2行开始处理(假设第1行为表头)
    For i = 2 To lastRow
        If IsDate(ws.Cells(i, "D").Value) Then
            ws.Cells(i, "E").Value = DateSerial(Year(ws.Cells(i, "D").Value), Month(ws.Cells(i, "D").Value), 1)
            ws.Cells(i, "E").NumberFormat = ws.Cells(i, "D").NumberFormat
        Else
            ws.Cells(i, "E").ClearContents
        End If
    Next i
End Sub

使用步骤:

  • 按Alt+F11打开VBA编辑器,插入模块后粘贴代码
  • 返回Excel,可添加按钮或直接按F5运行宏,批量生成E列的当月首日

核心特点

  • 两种方案均基于目标列的实时日期值计算,不会固定日期,后续日期更新后(跨年份也适用)能自动/重新生成正确结果
  • 自动同步原日期的格式,无需手动调整格式设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:52:32