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
相关产品推荐
相关产品推荐

