要将Excel按照某个字段拆分为多个分表,在http://www.excelhome.net/找到了一个拆分工具,但存在一些问题,就修改完放出来,点此下载。

解决的问题:

其他Excel中加载宏工具,会造成拆分表头丢失;

第一列前几行有空运行失败;

拆分到本工作簿会把除拆分表以外的其他表删掉,修改为若为拆分字段里的表名则删掉,否则保留。

1、打开拆分工具表和要拆分的表,激活要拆分的表窗口(如有弹窗启用宏)

2、开发工具——宏——窗体拆分——执行(若无开发工具Tab,在Excel选项——自定义功能区打开)

image-20200420171958883

3、设置拆分类型和行列设置

image-20200420172228739

如果要以多个字段作为分组拆分工作表,可在最前面插入一列,将多个字段连接。拆分完成再删除第一列即可。

可在后台代码中取消注释删除第一列的代码。

  1. Private Sub CommandButton1_Click()
  2. Application.ScreenUpdating = False
  3. Application.DisplayAlerts = False
  4. Dim arr As Variant
  5. Dim header As Range
  6. Dim i, s As Integer
  7. Dim brr()
  8. Dim wb, wb1 As Workbook
  9. Dim d As Object
  10. Set d = CreateObject("scripting.dictionary")
  11. Dim sh As Worksheet
  12. If ComboBox1.Text = "" Then
  13. MsgBox "请输入标题行数"
  14. Exit Sub
  15. End If
  16. If ComboBox2.Text = "" Then
  17. MsgBox "请输入拆分列"
  18. Exit Sub
  19. End If
  20. If OptionButton1.Value = False And OptionButton2.Value = False And OptionButton3.Value = False Then
  21. MsgBox "请选择拆分类型"
  22. Exit Sub
  23. End If
  24. \'获取表头
  25. Set header = ActiveSheet.Rows("1:" & ComboBox1.Text)
  26. \'获取各区域字典
  27. arr = ActiveSheet.Range("a" & ComboBox1.Text + 1).CurrentRegion
  28. For i = ComboBox1.Text + 1 To UBound(arr)
  29. If Not d.exists(arr(i, ComboBox2.Text)) Then
  30. Set d(arr(i, ComboBox2.Text)) = ActiveSheet.Range("a" & i).Resize(1, UBound(arr, 2))
  31. Else
  32. Set d(arr(i, ComboBox2.Text)) = Union(d(arr(i, ComboBox2.Text)), ActiveSheet.Range("a" & i).Resize(1, UBound(arr, 2)))
  33. End If
  34. Next i
  35. \'如果为拆分到本工作簿,原来就存在拆分字段命名的表,则删除
  36. If OptionButton1.Value = True Then
  37. For Each sh In Worksheets
  38. If d.exists(sh.Name) Then sh.Delete
  39. Next sh
  40. End If
  41. If OptionButton3.Value = True Then
  42. Application.SheetsInNewWorkbook = d.Count
  43. Set wb1 = Workbooks.Add
  44. i = 1
  45. For Each k In d.keys
  46. wb1.Worksheets(i).Name = k
  47. i = i + 1
  48. Next k
  49. End If
  50. x = d.keys
  51. For k = 0 To UBound(x)
  52. \'拆分到本工作簿代码
  53. If OptionButton1.Value = True Then
  54. Worksheets.Add after:=Worksheets(Worksheets.Count)
  55. ActiveSheet.Name = x(k)
  56. header.Copy ActiveSheet.[a1]
  57. d.items()(k).Copy ActiveSheet.Cells(ComboBox1.Text + 1, 1)
  58. \'ActiveSheet.Columns("A:A").Delete Shift:=xlToLeft \'如果拆分完成不保留第一列,取消此行注释
  59. For i = 1 To UBound(arr, 2)
  60. For Each sh In ThisWorkbook.Worksheets
  61. If sh.Name <> x(k) Then
  62. Sheets(x(k)).Columns(i).ColumnWidth = sh.Columns(i).ColumnWidth
  63. End If
  64. Next sh
  65. Next i
  66. End If
  67. \'拆分为多个工作簿代码
  68. If OptionButton2.Value = True Then
  69. Application.SheetsInNewWorkbook = 1
  70. Set wb = Workbooks.Add
  71. With wb.Worksheets(1)
  72. header.Copy .[a1]
  73. d.items()(k).Copy .Cells(ComboBox1.Text + 1, 1)
  74. .Columns("A:A").Delete Shift:=xlToLeft \'如果拆分完成不保留第一列,取消此行注释
  75. For i = 1 To UBound(arr, 2)
  76. .Columns(i).ColumnWidth = ThisWorkbook.ActiveSheet.Columns(i).ColumnWidth
  77. Next i
  78. wb.SaveAs Filename:=ThisWorkbook.Path & "\" & x(k) & ".xlsx" \'此处可设置在分割字段前或者后加字符组成文件名,也可设置导出路径,默认为此宏工作簿路径
  79. wb.Close
  80. End With
  81. End If
  82. \'拆分为一个工作簿代码
  83. If OptionButton3.Value = True Then
  84. header.Copy wb1.Worksheets(x(k)).[a1]
  85. d.items()(k).Copy wb1.Worksheets(x(k)).Cells(ComboBox1.Text + 1, 1)
  86. \'wb1.Worksheets(x(k)).Columns("A:A").Delete Shift:=xlToLeft \'如果拆分完成不保留第一列,取消此行注释
  87. For i = 1 To UBound(arr, 2)
  88. wb1.Sheets(x(k)).Columns(i).ColumnWidth = ThisWorkbook.ActiveSheet.Columns(i).ColumnWidth
  89. Next i
  90. End If
  91. Next k
  92. If OptionButton3.Value = True Then
  93. wb1.SaveAs Filename:=ThisWorkbook.Path & "\" & "拆分数据表.xlsx" \'此处可设置导出文件名和导出路径,默认为此宏工作簿路径
  94. wb1.Close False
  95. End If
  96. End
  97. Application.SheetsInNewWorkbook = 3
  98. Application.DisplayAlerts = True
  99. Application.ScreenUpdating = True
  100. End Sub
  101. Private Sub CommandButton2_Click()
  102. End
  103. End Sub
  104. Private Sub UserForm_Initialize()
  105. Me.ComboBox1.List = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11")
  106. Me.ComboBox2.List = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26")
  107. End Sub

版权声明:本文为bigmonk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/bigmonk/p/12749841.html