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

基于日期与一致性自动生成报价单号的Excel宏开发需求

Excel宏实现报价单号自动化生成方案

核心逻辑

报价单号生成规则:

  • 对比当前行与上一行的日期和核心内容(可根据实际需求指定列)
  • 若两者完全一致,沿用上行的报价单号
  • 若不一致,生成新的递增单号(建议格式:日期-序号,如20240520-001)

特殊场景处理方案

1. 首行处理

首行无上行数据,直接生成初始单号:

  • 提取当前行日期(如A1单元格)格式化为YYYYMMDD
  • 初始序号设为001,组合成首行单号(如20240520-001)

2. 第二行及后续行处理

从第二行开始逐行遍历:

  • 对比当前行与上行的日期、核心内容是否完全匹配
  • 匹配:复制上行的报价单号到当前行
  • 不匹配:
    • 若日期与上行相同,提取上行单号的序号部分加1,补零保持位数(如001→002)
    • 若日期与上行不同,重置序号为001,结合当前日期生成新单号

完整VBA宏代码

Sub GenerateQuoteNumbers()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim currentDate As String
    Dim prevDate As String
    Dim currentContent As String
    Dim prevContent As String
    Dim quoteNum As String
    Dim serialNum As Integer
    
    ' 设置目标工作表,可根据实际修改
    Set ws = ThisWorkbook.Worksheets("报价单")
    
    ' 获取数据最后一行
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 处理首行(A列为日期,B列为核心内容,C列为报价单号)
    If lastRow >= 1 Then
        currentDate = Format(ws.Cells(1, "A").Value, "YYYYMMDD")
        quoteNum = currentDate & "-001"
        ws.Cells(1, "C").Value = quoteNum
    End If
    
    ' 处理第二行及后续行
    For i = 2 To lastRow
        ' 获取当前行和上行的日期、核心内容
        currentDate = Format(ws.Cells(i, "A").Value, "YYYYMMDD")
        prevDate = Format(ws.Cells(i - 1, "A").Value, "YYYYMMDD")
        currentContent = ws.Cells(i, "B").Value
        prevContent = ws.Cells(i - 1, "B").Value
        
        ' 对比日期和内容是否一致
        If currentDate = prevDate And currentContent = prevContent Then
            ' 一致则沿用上行单号
            ws.Cells(i, "C").Value = ws.Cells(i - 1, "C").Value
        Else
            ' 不一致则生成新单号
            If currentDate = prevDate Then
                ' 日期相同,序号递增
                serialNum = Val(Right(ws.Cells(i - 1, "C").Value, 3)) + 1
                quoteNum = currentDate & "-" & Format(serialNum, "000")
            Else
                ' 日期不同,重置序号为001
                quoteNum = currentDate & "-001"
            End If
            ws.Cells(i, "C").Value = quoteNum
        End If
    Next i
    
    MsgBox "报价单号生成完成!"
End Sub

代码说明

  • 需根据实际表格调整工作表名称("报价单")和列位置(日期列A、内容列B、单号列C)
  • 序号采用3位补零格式(001、002...),可通过修改Format(serialNum, "000")调整位数
  • 若核心内容涉及多列,可修改currentContent和prevContent的拼接逻辑(如currentContent = ws.Cells(i, "B").Value & ws.Cells(i, "D").Value)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:05:27