ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 运用VBA按照特定条件将工作表拆分成多个工作簿的一个实例

运用VBA按照特定条件将工作表拆分成多个工作簿的一个实例

作者:绿色风 分类: 时间:2022-08-18 浏览:140
楼主
0Mouse
示例要求:把“展开层”这一列(A列)里面每一段以“....4”这一行开头的区域单独提取出来存到一个新的工作表里,分别以“....4”行里面“组件”列(E列)的单元格内容命名,保存在此表所在的文件夹下。
源数据:

 
拆分后文件目录:

 
生成的文件之一:

 
代码如下:
  1. Sub 工作表拆分成多个工作簿()
  2.     Application.ScreenUpdating = False
  3.     Dim arr, brr, crr, i%, j%, k%, x%, fn$
  4.     Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = 4    'A列最后一个单元格的下一个单元格写上4,作为最后一段数据的提取结束标志
  5.     arr = [A1].CurrentRegion
  6.     brr = [A1].Resize(2, UBound(arr, 2))
  7.     ReDim crr(1 To UBound(arr), 1 To UBound(arr, 2))
  8.     For i = 3 To UBound(arr)
  9.         If arr(i, 1) Like "*4" Then    '判断结尾是否为4
  10.             k = k + 1
  11.             If k = 1 Then
  12.                 x = x + 1
  13.                 For j = 1 To UBound(arr, 2)
  14.                     crr(x, j) = arr(i, j)
  15.                 Next
  16.                 fn = arr(i, 5)
  17.             End If
  18.             If k = 2 Then
  19.                 Worksheets.Add(, Sheets(Sheets.Count)).Name = fn
  20.                 With ActiveSheet
  21.                     .[A1].Resize(2, UBound(arr, 2)).Value = brr
  22.                     .[A3].Resize(x, UBound(arr, 2)).Value = crr
  23.                     .[A1].Select
  24.                     .Move    '将工作表移动到一个新的工作簿
  25.                 End With
  26.                 ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & fn & ".xlsx", FileFormat:=51
  27.                 ActiveWorkbook.Close False
  28.                 ReDim crr(1 To UBound(arr), 1 To UBound(arr, 2))
  29.                 For j = 1 To UBound(arr, 2)
  30.                     crr(1, j) = arr(i, j)
  31.                 Next
  32.                 fn = arr(i, 5)
  33.                 k = 1
  34.                 x = 1
  35.             End If
  36.         Else
  37.             If k = 1 Then
  38.                 x = x + 1
  39.                 For j = 1 To UBound(arr, 2)
  40.                     crr(x, j) = arr(i, j)
  41.                 Next
  42.             End If
  43.         End If
  44.     Next
  45.     Cells(Rows.Count, 1).End(xlUp).ClearContents    '删除A列之前添加的那个4
  46.     Application.ScreenUpdating = True
  47. End Sub
附件:
运用VBA按照特定条件将工作表拆分成多个工作簿的一个实例.rar
2楼
纵鹤擒龙水中月
学海无涯
3楼
qinhuan66
好好学习天天向上
4楼
LOGO
昨晚在家里折腾了好久才写出来下面这段代码,新手伤不起啊!。

尝试了用数组构造辅助列+高级筛选来拆分,但速度有点慢。
也尝试了在原表通过筛选来进行复制粘贴来拆分,速度也有点慢。后来还是下面这段速度自己觉得还算满意
  1. Sub 分段拆分()
  2. Dim dic As Object, arr, brr, crr(), rng As Range, i As Integer, T, n%, P, r%, c%
  3. Set dic = CreateObject("scripting.dictionary")
  4. arr = [a1].CurrentRegion
  5. brr = [a1].Resize(2, UBound(arr, 2))
  6. Application.ScreenUpdating = False
  7. For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
  8.     If Cells(i, 1) Like "*4" Then dic(Cells(i, 1).Row) = ""
  9.     Next
  10.     dic(Cells(UBound(arr), 1).Row + 1) = ""
  11.     T = dic.keys
  12.      For n = 0 To dic.Count - 2
  13.         dic.RemoveAll
  14.     ReDim crr(1 To T(n + 1) - T(n), 1 To UBound(arr, 2))
  15.         For r = 1 To T(n + 1) - T(n): For c = 1 To UBound(arr, 2)
  16.             crr(r, c) = arr(T(n) + r - 1, c)
  17.                 Next
  18.                     Next
  19.     With Workbooks.Add.Sheets(1)
  20.         [a1].Resize(2, UBound(arr, 2)) = brr
  21.         [a3].Resize(UBound(crr), UBound(crr, 2)) = crr
  22.         .Name = [e3]
  23.     End With
  24.     ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsx"
  25.     ActiveWorkbook.Close False
  26.             Next
  27.     Application.ScreenUpdating = True
  28. End Sub
5楼
LOGO
通过筛选复制粘贴的代码如下:
  1. Sub 筛选复制粘贴()
  2. Dim c As Integer, r As Integer, i As Integer, arr
  3. Application.ScreenUpdating = False
  4. arr = [a1].CurrentRegion
  5. r = UBound(arr)
  6. c = UBound(arr, 2)
  7. With Cells(3, c + 1).Resize(r - 2)
  8.   .Value = "=countif(rc[" & -c & "]:r3c1,r3c1)"
  9.   .Value = .Value
  10. End With
  11. For i = 1 To Application.Max(Cells(3, c + 1).Resize(r - 2, 1))
  12.    Sheet1.[a1].AutoFilter c + 1, i
  13.    Sheet1.[a1].CurrentRegion.Copy Workbooks.Add.Sheets(1).[a1]
  14. With ActiveSheet
  15.     .Name = .[e3].Value
  16.     .UsedRange.Columns(c + 1).Clear
  17.     If .FilterMode Then Cells.AutoFilter
  18. End With
  19. ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsx"
  20. ActiveWorkbook.Close False
  21.     Next
  22. With Cells(3, c + 1).Resize(r - 2)
  23.     .Cells(1, 1).AutoFilter
  24.     .Clear
  25. End With
  26. Application.ScreenUpdating = True
  27. End Sub
6楼
LOGO
通过这个帖子,学到不少东西,谢谢小千版主的分享!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap