用VBA拆分表格,保留表头

Sub SplitDataIntoFiles()
    Dim sourceSheet As Worksheet
    Dim totalRows As Long, totalDataRows As Long, chunks As Long, i As Long
    Dim startDataRow As Long, endDataRow As Long
    Dim newWorkbook As Workbook
    Dim savePath As String
    Dim copyRange As Range
    Dim dataRange As Range
    
    ' 错误处理
    On Error GoTo ErrorHandler
    
    ' 设置数据源工作表
    Set sourceSheet = ThisWorkbook.ActiveSheet
    
    ' 计算总行数(包含表头)
    totalRows = sourceSheet.UsedRange.Rows.Count
    If totalRows = 0 Then
        MsgBox "未检测到数据!请检查工作表内容。", vbExclamation
        Exit Sub
    End If
    
    ' 计算有效数据行数(排除表头)
    totalDataRows = totalRows - 1
    If totalDataRows < 1 Then
        MsgBox "没有数据行可供拆分!", vbExclamation
        Exit Sub
    End If
    
    ' 计算分块数量(每块4800条数据)
    chunks = Application.WorksheetFunction.RoundUp(totalDataRows / 4800, 0)
    
    ' 处理保存路径
    savePath = ThisWorkbook.Path & "\SplitFiles\"
    If Dir(savePath, vbDirectory) = "" Then MkDir savePath
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    For i = 1 To chunks
        ' 计算当前块的数据起始和结束行
        startDataRow = 2 + (i - 1) * 4800    ' 数据从第2行开始
        endDataRow = startDataRow + 4800 - 1  ' 计算理论结束行
        If endDataRow > totalRows Then endDataRow = totalRows ' 限制不超过总行数
        
        ' 检查起始行有效性
        If startDataRow > totalRows Then Exit For
        
        ' 设置数据范围
        Set dataRange = sourceSheet.Rows(startDataRow & ":" & endDataRow)
        
        ' 合并表头与数据范围
        Set copyRange = Union(sourceSheet.Rows(1), dataRange)
        
        ' 复制并创建新工作簿
        copyRange.Copy
        Set newWorkbook = Workbooks.Add
        With newWorkbook.Sheets(1)
            .Paste Destination:=.Range("A1")
            .Columns.AutoFit
        End With
        
        ' 保存文件
        newWorkbook.SaveAs _
            Filename:=savePath & "Split_" & Format(i, "000") & ".xlsx", _
            FileFormat:=xlOpenXMLWorkbook
        newWorkbook.Close SaveChanges:=False
        
        ' 释放对象
        Set copyRange = Nothing
        Set dataRange = Nothing
    Next i
    
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    MsgBox "成功拆分 " & chunks & " 个文件!保存路径:" & vbCrLf & savePath, vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "错误 " & Err.Number & ": " & Err.Description & vbCrLf & _
           "发生位置:i=" & i & ", 行范围 " & startDataRow & "-" & endDataRow, vbCritical
    Application.ScreenUpdating = True
End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值