sheet1打印送货单,数据保存到sheet2中(如下图),打印保存完后清空数据(单元格内公式不清空),单号自动加一,用VBA实现,报错是下标越界,求解答

img


送货单保存到sheet2第一列客户,第二列日期,以此类推,我写出来是下标越位错误,

您好,根据您的需求,我为您提供以下的 VBA 代码实现:

Option Explicit

' 定义全局变量,用于记录当前的单号
Public currentOrderNumber As Long

Private Sub Workbook_Open()
    ' 在工作簿打开时,初始化单号为1
    currentOrderNumber = 1
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 监听Sheet1中G2单元格的改变,当其有变化时,更新数据到Sheet2
    
    If Target.Address = "$G$2" Then
        ' 当G2单元格被修改时,将数据复制到Sheet2中
        Dim orderNumber As Long
        orderNumber = currentOrderNumber ' 获取当前单号
        Worksheets("Sheet2").Cells(orderNumber, 1).Value = orderNumber ' 保存单号
        Worksheets("Sheet2").Cells(orderNumber, 2).Value = Worksheets("Sheet1").Range("B2").Value ' 保存客户名称
        Worksheets("Sheet2").Cells(orderNumber, 3).Value = Worksheets("Sheet1").Range("F2").Value ' 保存送货日期
        Worksheets("Sheet2").Cells(orderNumber, 4).Value = Worksheets("Sheet1").Range("G2").Value ' 保存订单号
        
        ' 更新单号为下一个值
        currentOrderNumber = currentOrderNumber + 1
        
        ' 清空Sheet1中B2、F2、G2单元格的数据
        Worksheets("Sheet1").Range("B2").ClearContents
        Worksheets("Sheet1").Range("F2").ClearContents
        
        ' 注意:这里没有清空G2单元格,因为它是一个公式单元格,需要保留
        
    End If
End Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    ' 打印前自动保存数据
    Dim lastRow As Long
    lastRow = Worksheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row ' 获取最后一行
    Worksheets("Sheet2").Range("A1:D" & lastRow).Copy Destination:=Worksheets("Sheet2").Range("F1") ' 复制数据到Sheet2的F1单元格(方便打印)
    Worksheets("Sheet2").Range("A2:D" & lastRow).ClearContents ' 清空Sheet2中保存的数据
    currentOrderNumber = 1 ' 重置单号为1
End Sub