ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 朱荣兴

[分享] 灵活拆分工具

  [复制链接]
头像被屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-13 09:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

发表于 2017-6-13 11:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
朱荣兴 发表于 2017-6-13 09:16
代码是带格式拷贝的,行高应该是原样的呀,

不一样,我测试过,谢谢

TA的精华主题

TA的得分主题

发表于 2017-6-16 09:34 | 显示全部楼层
楼主,我把你的代码改了下,这样不依赖窗体了,采用对话框输入所要的值就行:
  1. Sub TEST()
  2.     'Private Sub CommandButton1_Click() '可绑定在命令按钮上
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     Dim arr As Variant
  6.     Dim i, s As Integer
  7.     Dim brr()
  8.     Dim wb, wb1 As Workbook
  9.     Dim d As Object
  10.     Dim hlrow As Integer, cutcolumn As Integer, cuttype As Integer
  11.     Set d = CreateObject("scripting.dictionary")
  12.     Dim sh As Worksheet
  13.     hlrow = InputBox("请输入标题行数:", "拆分表格", "1")
  14.     cutcolumn = InputBox("请输入拆分列(第一列是1,第二列是2,以此类推):", "拆分表格", "1")
  15.     cuttype = InputBox("请选择拆分类型(拆分到本工作簿是1,拆分为多个独立工作簿是2,拆分为一个工作簿是3):", "拆分表格", "1")
  16.     If cuttype = 1 Then
  17.         For Each sh In Worksheets
  18.             If sh.Name <> ActiveSheet.Name Then sh.Delete
  19.         Next sh
  20.     End If
  21.     arr = ActiveSheet.Range("a1").CurrentRegion
  22.     For i = hlrow + 1 To UBound(arr)
  23.         If Not d.exists(arr(i, cutcolumn)) Then
  24.             Set d(arr(i, cutcolumn)) = ActiveSheet.Range("a" & i).Resize(1, UBound(arr, 2))
  25.         Else
  26.             Set d(arr(i, cutcolumn)) = Union(d(arr(i, cutcolumn)), ActiveSheet.Range("a" & i).Resize(1, UBound(arr, 2)))
  27.         End If
  28.     Next i
  29.     If cuttype = 3 Then
  30.         Application.SheetsInNewWorkbook = d.Count
  31.         Set wb1 = Workbooks.Add
  32.         i = 1
  33.         For Each k In d.keys
  34.             wb1.Worksheets(i).Name = k
  35.             i = i + 1
  36.         Next k
  37.     End If
  38.     x = d.keys
  39.     For k = 0 To UBound(x)
  40.         If cuttype = 1 Then
  41.             Worksheets.Add after:=Worksheets(Worksheets.Count)
  42.             ActiveSheet.Name = x(k)
  43.             ThisWorkbook.Worksheets(1).Rows("1:" & hlrow).Copy ActiveSheet.[a1]
  44.             d.items()(k).Copy ActiveSheet.Cells(hlrow + 1, 1)
  45.             For i = 1 To UBound(arr, 2)
  46.                 For Each sh In ThisWorkbook.Worksheets
  47.                     If sh.Name <> x(k) Then
  48.                         Sheets(x(k)).Columns(i).ColumnWidth = sh.Columns(i).ColumnWidth
  49.                     End If
  50.                 Next sh
  51.             Next i
  52.         End If
  53.         If cuttype = 2 Then
  54.             Application.SheetsInNewWorkbook = 1
  55.             Set wb = Workbooks.Add
  56.             With wb.Worksheets(1)
  57.                 ThisWorkbook.Worksheets(1).Rows("1:" & hlrow).Copy .[a1]
  58.                 d.items()(k).Copy .Cells(hlrow + 1, 1)
  59.                 For i = 1 To UBound(arr, 2)
  60.                     .Columns(i).ColumnWidth = ThisWorkbook.ActiveSheet.Columns(i).ColumnWidth
  61.                 Next i
  62.                 wb.SaveAs Filename:=ThisWorkbook.Path & "" & x(k) & ".xls"
  63.                 wb.Close
  64.             End With
  65.         End If
  66.         If cuttype = 3 Then
  67.             ThisWorkbook.Worksheets(1).Rows("1:" & hlrow).Copy wb1.Worksheets(x(k)).[a1]
  68.             d.items()(k).Copy wb1.Worksheets(x(k)).Cells(hlrow + 1, 1)
  69.             For i = 1 To UBound(arr, 2)
  70.                 wb1.Sheets(x(k)).Columns(i).ColumnWidth = ThisWorkbook.ActiveSheet.Columns(i).ColumnWidth
  71.             Next i
  72.         End If
  73.     Next k
  74.     If cuttype = 3 Then
  75.         wb1.SaveAs Filename:=ThisWorkbook.Path & "" & "拆分数据表.xls"
  76.         wb1.Close False
  77.     End If
  78.     End
  79.     Application.DisplayAlerts = True
  80.     Application.ScreenUpdating = True
  81. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-16 11:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个代码我也改了,原来的代码是固定指向第12列的,而且表头是三行,现在应该可以自定义了:
  1. Sub 批量拆分为独立工作薄()
  2.     Application.ScreenUpdating = False
  3.     Dim wb, wb1 As Excel.Workbook
  4.     Dim sh As Excel.Worksheet
  5.     Dim d As Object
  6.     Dim arr As Variant
  7.     Dim i, s As Integer
  8.     Dim hlrow As Integer, cutcolumn As Integer
  9.     hlrow = InputBox("请输入标题行数:", "拆分表格", "1")
  10.     cutcolumn = InputBox("请输入拆分列(第一列是1,第二列是2,以此类推):", "拆分表格", "1")
  11.     Application.SheetsInNewWorkbook = 1
  12.     Set d = CreateObject("scripting.dictionary")
  13.     Set fso = CreateObject("Scripting.FileSystemObject")
  14.     sfolder = ThisWorkbook.Path & "\结果"
  15.     If fso.folderexists(sfolder) Then
  16.         fso.deletefolder sfolder
  17.     End If
  18.     fso.CreateFolder sfolder
  19.     f = Dir(ThisWorkbook.Path & "\*.xls*") '生成查找EXCEL的目录,可以适应不同版本
  20.     Do While f <> "" '在目录中循环
  21.         If f <> ThisWorkbook.Name Then  '如果不是打开的工作簿
  22.             Set wb = Workbooks.Open(ThisWorkbook.Path & "" & f) '依次打开目录工作薄
  23.             arr = wb.Worksheets(1).UsedRange
  24.             For i = 4 To UBound(arr)
  25.                 If Not d.exists(arr(i, cutcolumn)) Then
  26.                     Set d(arr(i, cutcolumn)) = wb.Worksheets(1).Range("a" & i).Resize(1, UBound(arr, 2))
  27.                 Else
  28.                     Set d(arr(i, cutcolumn)) = Union(d(arr(i, cutcolumn)), wb.Worksheets(1).Range("a" & i).Resize(1, UBound(arr, 2)))
  29.                 End If
  30.             Next i
  31.             x = d.keys
  32.             For i = 0 To UBound(x)
  33.                 Set wb1 = Workbooks.Add
  34.                 wb.Worksheets(1).Rows("1:" & hlrow).Copy wb1.Worksheets(1).Range("A1")
  35.                 d.items()(i).Copy wb1.Worksheets(1).Range("A" & hlrow + 1)
  36.                 wb1.SaveAs Filename:=ThisWorkbook.Path & "\结果" & Split(wb.Name, ".")(0) & x(i) & ".xlsx"
  37.                 wb1.Close False
  38.             Next i
  39.             wb.Close False '关闭打开的工作薄
  40.             d.RemoveAll
  41.         End If
  42.         f = Dir
  43.     Loop '结束循环
  44.     Application.ScreenUpdating = True
  45. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-16 21:28 | 显示全部楼层
头像被屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-16 21:42 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

发表于 2017-6-22 16:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-7-3 07:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-7-13 13:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢楼主提供的代码,学习了!

TA的精华主题

TA的得分主题

发表于 2017-7-18 11:29 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
朱荣兴 发表于 2017-4-1 12:42

打开已拆分后的工作薄,总出现打“您尝试打开的文件“****.xls”的格式与文件扩展名指定的格式不一致。打开文件前请验证文件没有损坏且来源可信,是否立即打开该文件?”
原数据是.xlsx的,这个代码要怎么改才能不出现这个提示。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 22:04 , Processed in 0.033712 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表