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

修改Excel VBA宏以适配QuickBooks上传的表单格式需求

调整VBA宏输出起始行以适配QuickBooks上传需求

问题背景

我正在帮叔叔的公司开发Excel基础表单,用来加速会计流程。但目前Invoice_Save宏生成的数据是从Sheet2的首行开始写入的,不符合QuickBooks的上传要求,需要改成从第5行开始写入数据。我尝试新增了InvRow变量但没解决问题,求修改方案。

现有代码

Sub Invoice_Save()
Dim InvRow As Long, LastItemRow As Long, InvItenRow As Long, TotalItems As Long
Dim InvNumb As String

With Sheet1
    If .Range("J4").Value = Empty Or .Range("I6").Value = Empty Then
        MsgBox "Please Make sure to enter and Inovice # and Date"
    End If
    InvRow = Sheet2.Range("A999999").End(xlUp).Row + 1 'Invoice Row
    InvNumb = .Range("J4").Value 'Invoice Number
    Sheet2.Range("A" & InvRow).Value = Range("I6").Value 'Date
    Sheet2.Range("B" & InvRow).Value = InvNumb 'InvNumb
    Sheet2.Range("C" & InvRow).Value = Range("I8").Value 'Customer
    Sheet2.Range("D" & InvRow).Value = Range("I10").Value 'Provider
    Sheet2.Range("E" & InvRow).Value = Range("I12").Value 'Service1
    Sheet2.Range("F" & InvRow).Value = Range("I16").Value 'Service2
    Sheet2.Range("G" & InvRow).Value = Range("I20").Value 'Service3
    Sheet2.Range("H" & InvRow).Value = Range("I24").Value 'Service4
    Sheet2.Range("I" & InvRow).Value = Range("I28").Value 'Service5
    Sheet2.Range("J" & InvRow).Value = Range("I32").Value 'Service6
    Sheet2.Range("K" & InvRow).Value = Range("I36").Value 'Service7
    Sheet2.Range("L" & InvRow).Value = Range("I40").Value 'Service8
    Sheet2.Range("M" & InvRow).Value = Range("I44").Value 'Service9
    Sheet2.Range("N" & InvRow).Value = Range("L14").Value 'Quantity1
    Sheet2.Range("O" & InvRow).Value = Range("L18").Value 'Quantity2
    Sheet2.Range("P" & InvRow).Value = Range("L22").Value 'Quantity3
    Sheet2.Range("Q" & InvRow).Value = Range("L26").Value 'Quantity4
    Sheet2.Range("R" & InvRow).Value = Range("L30").Value 'Quantity5
    Sheet2.Range("S" & InvRow).Value = Range("L34").Value 'Quantity6
    Sheet2.Range("T" & InvRow).Value = Range("L38").Value 'Quantity7
    Sheet2.Range("U" & InvRow).Value = Range("L42").Value 'Quantity8
    Sheet2.Range("V" & InvRow).Value = Range("L46").Value 'Quantity9
    Sheet2.Range("W" & InvRow).Value = Range("I48").Value 'Notes
   
 
End With

   
End Sub

修改方案

  1. 强制起始行从第5行开始:调整InvRow的计算逻辑,取“现有最后一行+1”和“5”中的较大值,确保即使Sheet2前4行是空的,也从第5行开始写入。
  2. 修复Range引用问题:原代码中部分Range没有使用With Sheet1的前缀,会默认引用当前活动工作表,加上.确保始终从Sheet1取数。
  3. 补充退出逻辑:当必填项为空时,提示后直接退出宏,避免后续代码执行出错。

修改后的完整代码

Sub Invoice_Save()
Dim InvRow As Long, InvNumb As String

With Sheet1
    ' 检查必填项,为空则提示并退出
    If .Range("J4").Value = Empty Or .Range("I6").Value = Empty Then
        MsgBox "请确保已填写发票编号和日期"
        Exit Sub
    End If
    
    ' 计算写入行:取现有最后一行+1和5的较大值,确保从第5行开始
    InvRow = WorksheetFunction.Max(Sheet2.Range("A999999").End(xlUp).Row + 1, 5)
    InvNumb = .Range("J4").Value ' 发票编号
    
    ' 写入数据到Sheet2,所有Range引用都加上.确保指向Sheet1
    Sheet2.Range("A" & InvRow).Value = .Range("I6").Value ' 日期
    Sheet2.Range("B" & InvRow).Value = InvNumb ' 发票编号
    Sheet2.Range("C" & InvRow).Value = .Range("I8").Value ' 客户
    Sheet2.Range("D" & InvRow).Value = .Range("I10").Value ' 服务商
    Sheet2.Range("E" & InvRow).Value = .Range("I12").Value ' 服务1
    Sheet2.Range("F" & InvRow).Value = .Range("I16").Value ' 服务2
    Sheet2.Range("G" & InvRow).Value = .Range("I20").Value ' 服务3
    Sheet2.Range("H" & InvRow).Value = .Range("I24").Value ' 服务4
    Sheet2.Range("I" & InvRow).Value = .Range("I28").Value ' 服务5
    Sheet2.Range("J" & InvRow).Value = .Range("I32").Value ' 服务6
    Sheet2.Range("K" & InvRow).Value = .Range("I36").Value ' 服务7
    Sheet2.Range("L" & InvRow).Value = .Range("I40").Value ' 服务8
    Sheet2.Range("M" & InvRow).Value = .Range("I44").Value ' 服务9
    Sheet2.Range("N" & InvRow).Value = .Range("L14").Value ' 数量1
    Sheet2.Range("O" & InvRow).Value = .Range("L18").Value ' 数量2
    Sheet2.Range("P" & InvRow).Value = .Range("L22").Value ' 数量3
    Sheet2.Range("Q" & InvRow).Value = .Range("L26").Value ' 数量4
    Sheet2.Range("R" & InvRow).Value = .Range("L30").Value ' 数量5
    Sheet2.Range("S" & InvRow).Value = .Range("L34").Value ' 数量6
    Sheet2.Range("T" & InvRow).Value = .Range("L38").Value ' 数量7
    Sheet2.Range("U" & InvRow).Value = .Range("L42").Value ' 数量8
    Sheet2.Range("V" & InvRow).Value = .Range("L46").Value ' 数量9
    Sheet2.Range("W" & InvRow).Value = .Range("I48").Value ' 备注
End With
End Sub

内容的提问来源于stack exchange,提问作者Nicolas Kalman-Serdar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:44:56