ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 分拆工作簿时如何保留两行标题?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-2-18 13:05 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 snoopyball 于 2014-2-18 13:22 编辑

以前有位大大放出了一个分拆模板,非常好用。但是最近遇到个问题,这个模板分行后会保留原来的一行标题,但是如果我的表格有两行标题(如附件所示),请问如何在分拆出来那些工作簿仍然保留这两行标题?请帮忙指出应该修改哪句代码?谢谢!

分拆模板(空白)-T.rar

31.55 KB, 下载次数: 53

TA的精华主题

TA的得分主题

发表于 2014-2-18 16:33 | 显示全部楼层
请参考:
  1. Sub Macro1()
  2.     Dim arr, rng As Range, d As Object, k, t, i&, lc%, sh As Worksheet, ICol%, shp As Shape
  3.     ICol = Application.InputBox("请输入你所要分的列:(如按B列分请输入2)", "提示:", "2", Type:=1)
  4.     If ICol = 0 Then Exit Sub
  5.     Application.ScreenUpdating = False
  6.     Application.DisplayAlerts = False
  7.     For Each sh In Sheets
  8.         If sh.Name <> "总表" Then sh.Delete
  9.     Next
  10.     arr = Range("a1").CurrentRegion
  11.     lc = UBound(arr, 2)
  12.     Set rng = Rows(1)
  13.     Set d = CreateObject("scripting.dictionary")
  14.     For i = 3 To UBound(arr)
  15.         If Not d.Exists(arr(i, ICol)) Then
  16.             Set d(arr(i, ICol)) = Cells(i, 1).Resize(1, lc)
  17.         Else
  18.             Set d(arr(i, ICol)) = Union(d(arr(i, ICol)), Cells(i, 1).Resize(1, lc))
  19.         End If
  20.     Next
  21.     k = d.Keys
  22.     t = d.Items
  23.     For i = 0 To d.Count - 1
  24.         Sheets("总表").Copy After:=Sheets(Sheets.Count)
  25.         With ActiveSheet
  26.             For Each shp In .Shapes
  27.                 shp.Delete
  28.             Next
  29.             .Name = k(i)
  30.             .UsedRange.Offset(2).Clear
  31.             t(i).Copy .[a3]
  32.         End With
  33.     Next
  34.     Sheets("总表").Activate
  35.     Application.DisplayAlerts = True
  36.     Application.ScreenUpdating = True
  37. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-2-18 16:34 | 显示全部楼层
请测试附件
分拆模板(空白)-T.rar (29.73 KB, 下载次数: 89)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-18 20:58 | 显示全部楼层
zhaogang1960 发表于 2014-2-18 16:34
请测试附件

谢谢,可以保留两行标题了。我忘了说明了,我想要表外分表,即分拆成多个工作簿...
或者说原代码修改哪个地方可以实现?

TA的精华主题

TA的得分主题

发表于 2014-2-18 21:29 | 显示全部楼层
snoopyball 发表于 2014-2-18 20:58
谢谢,可以保留两行标题了。我忘了说明了,我想要表外分表,即分拆成多个工作簿...
或者说原代码修改哪个 ...

使用窗体比较好实现:
捕获.JPG

TA的精华主题

TA的得分主题

发表于 2014-2-18 21:33 | 显示全部楼层
窗体代码:
  1. Private Sub CommandButton2_Click() '退出窗体
  2.     Unload Me
  3. End Sub

  4. Private Sub UserForm_Initialize()
  5.     Dim i&, arr(), lc&
  6.     lc = ActiveSheet.UsedRange.Columns.Count
  7.     ReDim arr(1 To lc)
  8.     For i = 1 To lc
  9.         arr(i) = i
  10.     Next
  11.     With ComboBox1
  12.         .List = Array(1, 2, 3, 4, 5)
  13.         .ListIndex = 1 '默认2行表头
  14.     End With
  15.     With ComboBox2
  16.         .List = arr
  17.         .ListIndex = 1 '默认拆分第二列
  18.     End With
  19. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-2-18 21:34 | 显示全部楼层
拆分代码:
  1.     If ComboBox1.ListIndex = -1 Or ComboBox2.ListIndex = -1 Then Exit Sub
  2.     Dim sh As Worksheet, sht As Worksheet, arr, s$, i&, k, t, lr&, lc&
  3.     lr = Range("A65536").End(xlUp).Row - 1
  4.     lc = ActiveSheet.UsedRange.Columns.Count
  5.     arr = [a1].Resize(lr, lc)
  6.     fr = ComboBox1.ListIndex + 2
  7.     c = ComboBox2.ListIndex + 1
  8.     Application.ScreenUpdating = False
  9.     Application.DisplayAlerts = False

  10.     With CreateObject("scripting.dictionary")
  11.         For i = fr To UBound(arr)
  12.             s = arr(i, c)
  13.             If Not .Exists(s) Then .Add s, Cells(i, 1).Resize(1, lc) Else Set .Item(s) = Union(.Item(s), Cells(i, 1).Resize(1, lc))
  14.         Next i
  15.         k = .keys
  16.         t = .Items
  17.     End With
  18.     Set sht = Sheets("总表")
  19.     If CheckBox1.Value Then
  20.         For i = 0 To UBound(k)
  21.             sht.Copy
  22.             With ActiveSheet
  23.                 For Each shp In .Shapes
  24.                     shp.Delete
  25.                 Next
  26.                 .Name = k(i)
  27.                 .UsedRange.Offset(fr - 1).Clear
  28.                 t(i).Copy .Cells(fr, 1)
  29.             End With
  30.             ActiveWorkbook.Close True, ThisWorkbook.Path & "" & k(i) & ".xls"
  31.         Next
  32.     Else
  33.         For Each sh In Sheets
  34.             If sh.Name <> "总表" Then sh.Delete
  35.         Next
  36.         For i = 0 To UBound(k)
  37.             sht.Copy After:=Sheets(Sheets.Count)
  38.             With ActiveSheet
  39.                 For Each shp In .Shapes
  40.                     shp.Delete
  41.                 Next
  42.                 .Name = k(i)
  43.                 .UsedRange.Offset(fr - 1).Clear
  44.                 t(i).Copy .Cells(fr, 1)
  45.             End With
  46.         Next
  47.         sht.Activate
  48.     End If
  49.     Unload Me
  50.     Application.ScreenUpdating = True
  51. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-2-18 21:35 | 显示全部楼层
请测试附件
分拆模板(空白)-T.rar (35.26 KB, 下载次数: 167)

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-18 23:12 | 显示全部楼层
zhaogang1960 发表于 2014-2-18 21:35
请测试附件

这个窗体的构想真的不错;完全是我想要的效果,谢谢!
代码还有待慢慢消化...

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-4-21 15:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

请问大神怎么给拆分的工作簿用代码实现自动加密码,用了ActiveWorkbook.Password = "1234"和ThisWorkbook.Password = "1234"都不成功,不知道是不是代码放错地方,谢谢。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-24 15:46 , Processed in 0.051878 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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