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

Excel VBA需求:新增订单时在记录表创建独立单元格区域防覆盖

问题解决:发票保存至记录表时避免单元格覆盖并支持整笔订单排序

问题分析

原代码存在两个核心问题:

  • 数据覆盖:每次保存时,新发票的主信息会直接写入上一笔订单的item2行位置,导致旧数据被覆盖。
  • 排序混乱:发票主信息仅占一行、商品信息占两行,排序时无法识别为一个整体,会打乱订单结构。

修改后的代码

Sub Save()
    Dim lastRow As Long
    Dim invoiceStartRow As Long
    ' 获取记录表A列最后一行的行号
    lastRow = Sheet3.Cells(Sheet3.Rows.Count, "A").End(xlUp).Row
    
    ' 校验必填字段是否完整
    If Sheet4.Range("Invonomer").Value = "" _
        Or Sheet4.Range("Invotgl").Value = "" _
        Or Sheet4.Range("Invoto").Value = "" _
        Or Sheet4.Range("Invoalamat").Value = "" Then
        
        MsgBox "请完整填写数据", vbInformation, "填写提示"
        Exit Sub
    End If
    
    ' 确定新发票的起始行:表头行之后从第2行开始,已有数据则从最后一行+2开始(每笔订单占2行)
    invoiceStartRow = IIf(lastRow = 1, 2, lastRow + 2)
    
    ' 写入并处理发票数据
    With Sheet3
        ' 写入发票主信息到起始行
        .Cells(invoiceStartRow, "A").Value = Sheet4.Range("Invonomer").Value
        .Cells(invoiceStartRow, "B").Value = Sheet4.Range("Invotgl").Value
        .Cells(invoiceStartRow, "C").Value = Sheet4.Range("Invoto").Value
        .Cells(invoiceStartRow, "D").Value = Sheet4.Range("Invoalamat").Value
        .Cells(invoiceStartRow, "E").Value = Sheet4.Range("Keterangan").Value
        
        ' 合并主信息对应的2行单元格,确保整笔订单为一个整体
        .Range(.Cells(invoiceStartRow, "A"), .Cells(invoiceStartRow + 1, "E")).Merge
        ' 设置合并单元格垂直居中
        .Range(.Cells(invoiceStartRow, "A"), .Cells(invoiceStartRow + 1, "E")).VerticalAlignment = xlCenter
        
        ' 写入商品及数量信息
        .Cells(invoiceStartRow, "F").Value = Sheet4.Range("item1").Value
        .Cells(invoiceStartRow, "G").Value = Sheet4.Range("Qty_1").Value
        .Cells(invoiceStartRow + 1, "F").Value = Sheet4.Range("item2").Value
        .Cells(invoiceStartRow + 1, "G").Value = Sheet4.Range("Qty_2").Value
    End With
    
    MsgBox "发票数据已保存", vbInformation, "保存成功"
    
    ' 清空输入表单
    With Sheet4
        .Range("Invonomer,Invotgl,Invoto,Invoalamat,Keterangan,item1,Qty_1,item2,Qty_2").Value = ""
    End With
End Sub

关键改动说明

  • 避免数据覆盖:每笔订单固定占据2行空间,新订单起始行设为当前最后一行+2,彻底避免旧数据被覆盖。
  • 支持整笔排序:将发票主信息(A-E列)合并为2行单元格,排序时合并单元格会作为整体移动,保证订单结构完整。
  • 优化最后行判断:改用从A列底部向上查找的方式定位最后一行,避免空行导致的定位错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:45:37