Excel·VBA按行拆分工作表

76 篇文章 21 订阅

对应之前文章《Excel·VBA按列拆分工作表、工作簿》,对Excel表格数据按照固定行数,将工作表拆分


代码使用建议:建议使用 方法3,其他2个版本的代码写法较为原始,仅供代码学习参考

1,工作表按行拆分为工作表

Sub 工作表按行拆分为工作表()
    '当前工作表(worksheet)按固定行数拆分为多个工作表,保存在当前工作簿(workbook)
    tm = Now()
    Set ws = Application.ActiveSheet  '当前工作表即为待拆分工作表
'--------------------参数填写:num_row,数字;title_row表头行数,数字,第1行为1向下递增
    title_row = 1  '表头行数,每个拆分后的sheet都保留
    num_row = 100  '拆分数据行数,按多少行数据进行拆分,不能完全拆分的,多余行数单独
    max_row = ActiveSheet.UsedRange.Rows.count
    '拆分sheet数量,向上取整
    sheet_count = WorksheetFunction.RoundUp((max_row - title_row) / num_row, 0)
    
    For i = 1 To sheet_count:
        Worksheets.Add(after:=Sheets(Sheets.count)).Name = "拆分表" & i  '最后添加新sheet,并命名
        With ActiveSheet
            ws.Rows(1 & ":" & title_row).Copy  '本行复制表头,下行复制数据
			.Range("A1").PasteSpecial Paste:=xlPasteAll
			.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
            ws.Rows(num_row * (i - 1) + title_row + 1 & ":" & (num_row * i) + title_row).Copy .Range("A" & title_row + 1)
        End With
        'Exit For  '强制退出for循环,单次测试使用
    Next
	Debug.Print ("拆分完成,累计用时" & Format(Now() - tm, "hh:mm:ss"))  '耗时
End Sub

2,工作表按行拆分为工作薄

Sub 工作表按行拆分为工作薄()
    '当前工作表(worksheet)按固定行数拆分保存为多个工作簿(workbook),文件单独保存
    tm = Now()
    Application.Visible = False  '后台运行,不显示界面
    Application.DisplayAlerts = False  '不显示警告信息
    Set fso = CreateObject("Scripting.FileSystemObject")
'--------------------参数填写:num_row,数字;title_row表头行数,数字,第1行为1向下递增
	title_row = 1  '表头行数,每个拆分后的sheet都保留
    num_row = 100  '拆分数据行数,按多少行数据进行拆分,不能完全拆分的,多余行数单独
    Set ws = Application.ActiveSheet  '当前工作表即为待拆分工作表
    wb_path = Application.ActiveWorkbook.Path  '当前工作簿文件路径
    wb_name = Application.ActiveWorkbook.Name  '当前工作簿文件名和扩展名
    save_path = wb_path + "\拆分表"  '保存拆分后的表格保存路径
    max_row = ActiveSheet.UsedRange.Rows.count
    '拆分sheet数量,向上取整
    sheet_count = WorksheetFunction.RoundUp((max_row - title_row) / num_row, 0)
    If fso.FolderExists(save_path) Then
        Debug.Print ("拆分文件保存路径已存在:" & save_path)
    Else
        fso.CreateFolder (save_path)
        Debug.Print ("拆分文件保存路径已创建:" & save_path)
    End If
    
    For i = 1 To sheet_count:
        Workbooks.Add
        With ActiveSheet
            ws.Rows(1 & ":" & title_row).Copy  '本行复制表头,下行复制数据
			.Range("A1").PasteSpecial Paste:=xlPasteAll
			.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
            ws.Rows(num_row * (i - 1) + title_row + 1 & ":" & (num_row * i) + title_row).Copy .Range("A" & title_row + 1)
        End With
        '保存文件全名(文件路径、文件名、扩展名)
        save_file = save_path & "\" & fso.GetBaseName(wb_name) & "_拆分表" & i & "." & fso.GetExtensionName(wb_name)
        ActiveWorkbook.SaveAs filename:=save_file
        ActiveWorkbook.Close (False)
        'Exit For  '强制退出for循环,单次测试使用
    Next
    Set fso = Nothing  '释放内存
    Application.Visible = True
    Application.DisplayAlerts = True
    Debug.Print ("工作表已拆分完成,累计用时" & Format(Now() - tm, "hh:mm:ss"))  '耗时
End Sub

1、2举例

原始数据
在这里插入图片描述
参数:表头行数title_row = 1、按每5行拆分num_row = 5
拆分为工作表
在这里插入图片描述
在这里插入图片描述
拆分为工作薄
在这里插入图片描述

3,工作表按行拆分

将拆分为工作表和工作簿的代码合并在一起

Sub 工作表按行拆分_复制法()
    '当前工作表ws按固定行数拆分为多个ws或工作簿wb,文件保存在当前wb同一文件夹下单独文件夹内
    Dim fso As Object, title_row&, num_row&, save_type$, max_row&, max_col&
    Dim title_rng As Range, rng As Range, save_path$, file_name$, ws_name$, i&, j&
'--------------------参数填写:title_row数字;num_row数字;save_type字符串
    title_row = 1   '表头行数,每个拆分后的sheet都保留
    num_row = 100   '固定拆分行数
    save_type = "ws"   '保存方式:ws拆分为工作表,wb拆分为工作簿
    Set fso = CreateObject("Scripting.FileSystemObject"): tm = Timer
    Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行
    Application.DisplayAlerts = False   '不显示警告信息
    With ActiveSheet
        max_row = .UsedRange.Rows.Count: max_col = .UsedRange.Columns.Count
        Set title_rng = .[a1].Resize(title_row, max_col)
        If save_type = "ws" Then    '拆分为工作表
            For i = title_row + 1 To max_row Step num_row
                Set rng = .Cells(i, 1).Resize(num_row, max_col): j = j + 1 '最后添加新sheet,并命名
                .Parent.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "拆分表" & j
                With ActiveSheet
                    title_rng.Copy  '复制表头及列宽,复制数据
                    .[a1].PasteSpecial Paste:=xlPasteAll
                    .[a1].PasteSpecial Paste:=xlPasteColumnWidths
                    rng.Copy .Cells(title_row + 1, 1)
                End With
            Next
        ElseIf save_type = "wb" Then    '拆分为工作簿
            save_path = .Parent.path + "\拆分表\"  '保存拆分后的表格保存路径
            file_name = fso.GetBaseName(.Parent.Name) + "_拆分表"  '文件名
            ws_name = .Name: Dim write_wb As Workbook
            If Not fso.FolderExists(save_path) Then fso.CreateFolder (save_path)  '创建文件夹
            For i = title_row + 1 To max_row Step num_row
                Set rng = .Cells(i, 1).Resize(num_row, max_col): j = j + 1 '最后添加新sheet,并命名
                Set write_wb = Workbooks.Add  '新建工作簿,拆分文件
                With ActiveSheet
                    title_rng.Copy  '复制表头及列宽,复制数据
                    .[a1].PasteSpecial Paste:=xlPasteAll
                    .[a1].PasteSpecial Paste:=xlPasteColumnWidths
                    rng.Copy .Cells(title_row + 1, 1)
                    .Name = ws_name  '工作表命名
                End With
                '保存文件全名(文件路径、文件名、扩展名)
                write_wb.SaveAs filename:=save_path & file_name & j & ".xlsx"
                write_wb.Close (False)
            Next
        End If
    End With
    Application.ScreenUpdating = True: Application.DisplayAlerts = True
    Debug.Print "工作表已拆分完成,累计用时" & Format(Timer - tm, "0.00")  '耗时
End Sub
  • 13
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
你可以按照以下步骤使用VBA按某列汇总拆分工作: 1. 打开你想要拆分工作。 2. 在工作上方的菜单栏中选择“开发人员”选项卡。如果你没有看到该选项卡,则需要启用它。可以通过下列步骤:文件->选项->自定义功能区->勾选“开发人员”选项卡。 3. 点击“Visual Basic”按钮,打开Visual Basic编辑器。 4. 在编辑器中,依次展开“项目-VBAProject(VBA项目)”、“Microsoft Excel 对象”、“Sheet1(Sheet1)”,双击“Sheet1(Sheet1)”。 5. 在工作的代码窗口中输入以下代码: ``` Sub SplitData() Dim lastRow As Long Dim currentRow As Long Dim i As Long Dim currentName As String Dim ws As Worksheet Dim newWs As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row currentRow = 2 For i = 2 To lastRow If ws.Range("A" & i).Value <> currentName Then currentName = ws.Range("A" & i).Value Set newWs = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) newWs.Name = currentName ws.Range("A1:D1").Copy newWs.Range("A1") currentRow = 2 End If ws.Range("A" & i & ":D" & i).Copy newWs.Range("A" & currentRow) currentRow = currentRow + 1 Next i End Sub ``` 6. 保存并关闭Visual Basic编辑器。 7. 回到工作并点击“开发人员”选项卡上的“宏”按钮。 8. 在弹出的对话框中选择“SplitData”宏,并点击“运行”。 这将按列A中的值拆分工作,并将每个唯一值的数据放入一个新的工作中。每个新工作的名称将是该值。请注意,此代码假设您的数据以列A开始,并且您的数据没有标题行。如果您的数据的列不同,请在代码中进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔_51

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值