ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 多SHEET表拆分范例

多SHEET表拆分范例

作者:绿色风 分类: 时间:2022-08-18 浏览:115
楼主
huangwei0king
  1. Option Explicit
  2. Sub 拆分表()
  3.     On Error Resume Next
  4.     Dim i, m
  5.     Dim j, n
  6.     Dim cl As Integer, r As Integer
  7.     Dim dic, arr, k
  8.     Dim s, st
  9.     Dim str As String
  10.     Dim fp
  11.     Dim fname
  12.     Dim hs, ls
  13.     Dim arrr, x
  14.     Dim brr() As String
  15.     Dim b1, b2

  16.     Set dic = CreateObject("Scripting.Dictionary")
  17.     m = Worksheets.Count
  18.     cl = InputBox("请输入拆分标准列【省】所在列数")
  19.     r = InputBox("请输入拆分标准列【省】从哪行开始")
  20.     str = InputBox("请输入拆分后各省文件统一名称")
  21.     fp = ThisWorkbook.Path
  22.     Application.SheetsInNewWorkbook = m

  23.     '计算一共出现多少个省的数据
  24.     For i = 1 To m
  25.         n = Sheets(i).Range("a1000000").End(xlUp).Row    '计算每个SHEET有多少行数据
  26.         arr = Sheets(i).Range(Sheets(i).Cells(r, cl), Sheets(i).Cells(n, cl))
  27.         For j = 1 To n - 1
  28.             dic(arr(j, 1)) = 1
  29.         Next
  30.         Erase arr
  31.     Next
  32.     '将字典中的省份名称数据赋值给数组K
  33.     k = dic.keys
  34.     '根据字典中的省份名称进行表拆分操作
  35.     For s = 1 To UBound(k) + 1
  36.         Workbooks.Add
  37.         '给新增的工作薄的分表设置格式
  38.         For st = 1 To m
  39.             Workbooks(2).Sheets(st).Name = ThisWorkbook.Sheets(st).Name
  40.             ThisWorkbook.Sheets(st).Rows("1:" & r - 1).Copy Workbooks(2).Sheets(st).Rows("1:" & r - 1)
  41.         Next
  42.         '对汇总数据进行拆分操作
  43.         For st = 1 To m
  44.             hs = ThisWorkbook.Sheets(st).Range("a1000000").End(xlUp).Row
  45.             ls = ThisWorkbook.Sheets(st).Range("xfd1").End(xlToLeft).Column
  46.             arrr = ThisWorkbook.Sheets(st).Range(ThisWorkbook.Sheets(st).Cells(r, 1), ThisWorkbook.Sheets(st).Cells(hs, ls))
  47.             '把符合该省的该SHEET的数据全复制给数组BRR
  48.             b1 = 0
  49.             For x = 1 To UBound(arrr)
  50.                 If arrr(x, cl) = k(s - 1) Then
  51.                     b1 = b1 + 1
  52.                     ReDim Preserve brr(1 To ls, 1 To b1)
  53.                     For b2 = 1 To ls
  54.                         brr(b2, b1) = arrr(x, b2)
  55.                     Next
  56.                 End If
  57.             Next
  58.             '如果数组BRR为空,即该SHEET没有这个省的数据,那么不进行如下复制操作
  59.             If UBound(brr()) >= 0 Then
  60.                 Workbooks(2).Sheets(st).Range(Workbooks(2).Sheets(st).Cells(r, 1), Workbooks(2).Sheets(st).Cells(UBound(brr(), 2) + r - 1, ls)) = Application.Transpose(brr)
  61.             End If
  62.             '清空数组,以使下一次操作顺利
  63.             Erase brr
  64.             Erase arrr
  65.         Next
  66.         '保存文件,并给文件名命名及赋予路径
  67.         fname = str & k(s - 1)
  68.         Workbooks(2).SaveAs Filename:=fp & "\" & fname & ".xlsx"
  69.         Workbooks(2).Close
  70.     Next
  71. End Sub
上面是我做的一个多表进行拆分的代码,用来拆分具有多个SHEET的汇总数据,拆分要求为按省拆分,拆分后的表和汇总表的SHEET个数一样!

代码比较啰嗦,这里主要就是抛砖引玉,欢迎大家一起讨论!谢谢!

本例是以我工作遇到的数据为例(数据已处理过)!
(TEST).rar
2楼
海洋之星
帖子内容不错,建议按"e问e答"形式发帖.具体参考下帖:
e问e答发帖技巧和写作规范
http://www.exceltip.net/thread-4376-1-1.html

3楼
lrlxxqxa
一上来就是代码,会让读者一头雾水,建议按照提出问题、分析问题、解决问题的思路完善正文结构,必要处以图片辅助呈现

免责声明

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

评论列表
sitemap