前言:工作簿数据的拆分,有各种各样的需求,本示例介绍其中的一种需求实现,后续将会陆续补充相关内容。 借鉴此示例,你可以将信贷台账等按机构拆分开来,总之,举一返三,这方面的应用不时都会用到。 用循环嵌套速度慢,用数组 字典的方式处理速度会快很多。经测试,5万笔数据,132列,用时23秒完成拆分。 数据源: 结果: Code: "function:将当前工作表按第2列中的关键字拆分为各个不同的工作簿 "需要在VBE工具-引用中添加windows script Host Object Model Sub SplitSht() "变量声明 Dim tm, Fso As FileSystemObject, sfolder$, wb As Workbook, arr Dim rng As Range, lastRow&, lastCol%, d As Object, k, t, sh As Worksheet, i& tm = Timer "计时开始 "创建文件系统对象 Set Fso = CreateObject("Scripting.FileSystemObject") "在当前文件夹中创建一个子目录用于存放拆分好的工作簿文件 sfolder = ThisWorkbook.Path & "分表" "若子目录不存在,创建之 If Fso.FolderExists(sfolder) = False Then Fso.CreateFolder sfolder "关闭屏幕更新,防止闪屏,加快处理速度 Application.ScreenUpdating = False "关闭使用工作簿的 SaveAs 方法覆盖现有文件,"覆盖"警告默认为"No" "当 DisplayAlerts 属性设置等于 False 时,Excel 选择"Yes"响应。 Application.DisplayAlerts = False "对Sheet1表进行操作,可据实修改 With Sheets("Sheet1") "将Sheet1表单元格区域A1:C1(字段名)赋给对象变量rng Set rng = .Range("A1:EB1") "取B列最后一个有数据的单元格所在行行号赋给变量lastRow lastRow = .Range("B" & Rows.Count).End(xlUp).Row "根据不同的Office版本(2007为12.0),取第一行最后一个有数据的单元格所在列列号赋给变量 lastCol If Application.Version >= "12.0" Then lastCol = .Range("XFD1").End(xlToLeft).Column Else lastCol = .Range("IV1").End(xlToLeft).Column End If "将关键字所在列中B1到B列最后一个有数据的单元格组成的区域赋给数组arr "实际运用中关键字所在列据实修改 arr = .Range("B2:B" & lastRow) "创建字典对象 Set d = CreateObject("scripting.dictionary") " Debug.Print UBound(arr) "循环,从1到数组arr第一维最大下标 For i = 1 To UBound(arr) "如果字典中不存在arr(i, 1)对应的关键字,则 If Not d.Exists(arr(i, 1)) Then "添加关键字及条目 "首次循环时,条目为单元格A2向右扩展1行3列的单元格区域即A2:D2 "i要加1是因为首次代入的变量为1,加1后变为2, Cells(2, 1)表示A2 Set d(arr(i, 1)) = Cells(i 1, 1).Resize(1, lastCol) "如果字典中存在arr(i, 1)对应的关键字,则 Else "用Union方法将原有的条目和新添加的条目组合为一个区域 "字典的关键字不可以修改,但条目是可以不断修改的 Set d(arr(i, 1)) = Union(d(arr(i, 1)), Cells(i 1, 1).Resize(1, lastCol)) End If Next End With "将字典中的关键字赋给变量k k = d.Keys "将字典中的条目赋给变量t t = d.Items " Debug.Print d.Count "循环,从0到关键字的数量-1 For i = 0 To d.Count - 1 "新建一个工作簿并指定类型 Set wb = Workbooks.Add(xlWBATWorksheet) "对新工作簿中的第1张表进行操作 With wb.Sheets(1) "复制rng表示的字段名到新工作簿第1张表A1单元格开始的位置 rng.Copy .Range("A1") "将关键字对应的条目复制到新工作簿第1张工作表A2单元格起的位置 "条目就是一个区域,可直接cp t(i).Copy .Range("A2") End With "保存新建的工作簿,文件名为各个关键字,扩展名为.xlsx "加Clean函数是为防止关键字中有非打印字符,造成文件不能保存错误 wb.SaveAs Filename:=ThisWorkbook.Path & "分表" & WorksheetFunction.Clean(k(i)) & ".xlsx" "关掉新建工作簿 wb.Close Next i "释放对象变量 Set rng = Nothing: Set d = Nothing Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox "拆分完毕!用时" & Timer - tm & "秒", 64, "提示" End Sub 看图: 附件下载:此文已同步至【知嗒】知识号【Excel精英之家】,相关附件可下载安装【知嗒】app应用,注册一个账号,搜索并关注【Excel精英之家】,加群【Excel精英之家】后方可下载。