Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5732|回复: 11

[已解决]拆分工作簿

[复制链接]
发表于 2012-3-1 15:25 | 显示全部楼层 |阅读模式
20学分
本帖最后由 tayisha 于 2012-3-1 17:06 编辑

这个一个拆分工作簿的问题,要求将《目录》拆分成两种方式,如《签约公司分表》或《责任公司分表》,原来有个代码文件也附在后面了,但是不满足现在的需求,按哪个字段拆分最好设成变量,这样很多相同情况就可以使用了,代码最好带注释。
最佳答案
2012-3-2 13:48
经过花花老师指点之后稍作修改了代码
  1. Sub 拆分工作表()
  2.     Dim d As New Dictionary
  3.     Dim sht As Worksheet, bm As String
  4.     Dim arr1, arr2, arr3, arr4, k As Long
  5.     Dim i As Long, j As Long, n As Long, m As Long
  6.     Application.ScreenUpdating = False    '关闭屏幕更新
  7.     Application.DisplayAlerts = False    '关闭特定的警告和消息
  8.     k = InputBox("请输正整数", "输入表头行数")    '标题区域的行数赋值给变量k
  9.     '不加with语句就跟拆分的工作表名无关,可以任意修改拆分的工作表表名(但是不能在其他工作表中运行本程序)
  10.     '按照楼主要求用这个不加with的语句较好,就不怕修改工作表名了。
  11.     n = Range("IV3").End(xlToLeft).Column
  12.     m = Range("A65536").End(xlUp).Row
  13.     arr1 = Range(Cells(1, 1), Cells(k, n))
  14.     arr2 = Range(Cells(k + 1, 1), Cells(m, n))
  15.     '下面是加了with语句的写法(这样写就要固定工作表名,可以在任意工作表中运行本程序)
  16.     '    With Sheets("总目录")
  17.     '        n = .Range("IV3").End(xlToLeft).Column    '记录《总目录》表最后一列列号
  18.     '        m = .Range("A65536").End(xlUp).Row    '记录《总目录》表最后一行行号
  19.     '        arr1 = .Range(.Cells(1, 1), .Cells(k, n))    '标题区域赋值给数组arr1
  20.     '        arr2 = .Range(.Cells(k + 1, 1), .Cells(m, n))    '数据区域赋值给数组arr2
  21.     '    End With
  22.     k = InputBox("请输入按列拆分的列号", "输入列号的数字")    '将需要拆分的标准列号赋值给变量k
  23.     ReDim arr3(1 To UBound(arr2), 1 To UBound(arr2, 2))  '重新定义arr3储备拆分后的数据
  24.     For i = 1 To UBound(arr2)    '循环处理数组arr2
  25.         If Len(Trim(arr2(i, k))) Then    '如果数组arr2不为空(既k数字对应的列不为空)则:
  26.             If d.Exists(arr2(i, k)) Then
  27.                 arr4 = d(arr2(i, k))(0)    '字典key存在就把对应的item的arr3赋值给数组arr4
  28.                 n = d(arr2(i, k))(1) + 1    'item的定位数字累加1
  29.                 For j = 1 To UBound(arr2, 2)
  30.                     arr4(n, j) = arr2(i, j)    '循环将arr2的第i行数据赋值给数组arr4的第n行(即新增列)
  31.                 Next j
  32.                 '将新增加的数据从新作为字典的item值赋值给字典
  33.                 d(arr2(i, k)) = Array(arr4, n)
  34.             Else
  35.                 '如果字典key不存在就将该行数据(arr2当前循环行的内容)赋值给数组arr3
  36.                 For j = 1 To UBound(arr2, 2)
  37.                     arr3(1, j) = arr2(i, j)    '循环将arr2的第i行数据赋值给数组arr3的第1行
  38.                 Next j
  39.                 '建立字典key(对应列的公司名称),赋值item(arr3为当前循环行的数据,1为定位数字)
  40.                 d.Add arr2(i, k), Array(arr3, 1)
  41.             End If
  42.         End If
  43.     Next i
  44.     If d.Count > 0 Then    '如果字典个数大于0
  45.         For i = 1 To d.Count    '在字典中循环处理数据
  46.             bm = d.Keys(i - 1)    '字典的key(即公司名字)赋值给bm(即新建工作表名)
  47.             arr4 = d.Items(i - 1)(0)    '字典的item第一个数据(即改key值的数据)赋值给数组arr4
  48.             '容错循环,如果工作薄存将建立的工作表则先删除(花花老师指点后增加)
  49.             For j = 1 To Sheets.Count
  50.                 If Sheets(j).Name = bm Then
  51.                     Sheets(j).Delete
  52.                     Exit For    '同一个工作簿不会出现多个相同的工作表名,因此只要删除一个就直接退出循环
  53.                 End If
  54.             Next j
  55.             Set sht = Sheets.Add
  56.             sht.Name = bm
  57.             With Sheets(bm)
  58.                 .Range("A1").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
  59.                 '这里用d(bm)(1)就是字典item的定位数字,也就是数据的有效行数,用ubound(arr4)也可以,只是这个行数就是一个较大的数字。
  60.                 'd(bm)(1)花花老师指点后修改
  61.                 .Range("A" & UBound(arr1) + 1).Resize(d(bm)(1), UBound(arr4, 2)) = arr4
  62.             End With
  63.         Next i
  64.     End If
  65.     Application.ScreenUpdating = True    '成对使用程序运行时关闭,完成后开启
  66.     Application.DisplayAlerts = True    '成对使用程序运行时关闭,完成后开启
  67.     Set d = Nothing '释放字典
  68. End Sub

复制代码
附件: (, 下载次数: 8)

求拆分表.rar

34.13 KB, 下载次数: 11

发表于 2012-3-1 15:29 | 显示全部楼层
回复

使用道具 举报

发表于 2012-3-1 15:49 | 显示全部楼层
回复

使用道具 举报

发表于 2012-3-1 15:55 | 显示全部楼层
楼主这问题~~~没头没尾哦
回复

使用道具 举报

 楼主| 发表于 2012-3-1 17:06 | 显示全部楼层
一忙,忘了传附件了,呵呵
回复

使用道具 举报

 楼主| 发表于 2012-3-1 17:08 | 显示全部楼层
zjcat35 发表于 2012-3-1 15:29
附件啊没有看到

传了{:241:}{:321:}
回复

使用道具 举报

发表于 2012-3-1 17:08 | 显示全部楼层
不会..............观望
回复

使用道具 举报

发表于 2012-3-1 17:09 | 显示全部楼层
不会..............观望了
回复

使用道具 举报

发表于 2012-3-2 10:08 | 显示全部楼层
  1. Sub 拆分工作表()
  2.     Dim d As New Dictionary
  3.     Dim sht As Worksheet, bm As String
  4.     Dim arr1, arr2, arr3, arr4, k As Long
  5.     Dim i As Long, j As Long, n As Long, m As Long
  6.     Application.ScreenUpdating = False
  7.     With Sheets("总目录")
  8.         n = .Range("IV3").End(xlToLeft).Column    '记录《总目录》表最后一列列号
  9.         m = .Range("A65536").End(xlUp).Row    '记录《总目录》表最后一行行号
  10.         arr1 = .Range(.Cells(1, 1), .Cells(3, n))    '标题区域赋值给数组arr1
  11.         arr2 = .Range(.Cells(4, 1), .Cells(m, n))      '数据区域赋值给数组arr2
  12.     End With
  13.     k = InputBox("请输入按列拆分的列号", "输入列号的数字")    '将需要拆分的标准列号赋值给变量
  14.     ReDim arr3(1 To UBound(arr2), 1 To UBound(arr2, 2))  '重新定义arr3储备拆分后的数据
  15.     For i = 1 To UBound(arr2)    '循环处理数组arr2
  16.         If Len(Trim(arr2(i, k))) Then    '如果数组arr2不为空(既k数字对应的列不为空)则:
  17.             If d.Exists(arr2(i, k)) Then
  18.                 arr4 = d(arr2(i, k))(0)    '字典key存在就把对应的item的arr3赋值给数组arr4
  19.                 n = d(arr2(i, k))(1) + 1    'item的定位数字累加1
  20.                 For j = 1 To UBound(arr2, 2)
  21.                     arr4(n, j) = arr2(i, j)    '循环将arr2的第i行数据赋值给数组arr4的第n行(即新增列)
  22.                 Next j
  23.                 '将新增加的数据从新作为字典的item值赋值给字典
  24.                 d(arr2(i, k)) = Array(arr4, n)
  25.             Else
  26.                 '如果字典key不存在就将该行数据(arr2当前循环行的内容)赋值给数组arr3
  27.                 For j = 1 To UBound(arr2, 2)
  28.                     arr3(1, j) = arr2(i, j)    '循环将arr2的第i行数据赋值给数组arr3的第1行
  29.                 Next j
  30.                 '建立字典key(对应列的公司名称),赋值item(arr3为当前循环行的数据,1为定位数字)
  31.                 d.Add arr2(i, k), Array(arr3, 1)
  32.             End If
  33.         End If
  34.     Next i
  35.     If d.Count > 0 Then    '如果字典个数大于0
  36.         For i = 1 To d.Count    '在字典中循环处理数据
  37.             bm = d.Keys(i - 1)    '字典的key(即公司名字)赋值给bm(即新建工作表名)
  38.             arr4 = d.Items(i - 1)(0)    '字典的item第一个数据(即改key值的数据)赋值给数组arr4
  39.             Set sht = Sheets.Add
  40.             sht.Name = bm
  41.             With Sheets(bm)
  42.                 .Range("A1").Resize(3, UBound(arr1, 2)) = arr1
  43.                 .Range("A4").Resize(UBound(arr4), UBound(arr4, 2)) = arr4
  44.             End With
  45.         Next i
  46.     End If
  47.     Application.ScreenUpdating = True
  48.     Set d = Nothing
  49. End Sub

复制代码
附件: 目录.rar (13.61 KB, 下载次数: 13)
回复

使用道具 举报

 楼主| 发表于 2012-3-2 11:36 | 显示全部楼层
sunjing-zxl 发表于 2012-3-2 10:08
附件:
这个是拆分工作表的,要拆分工作薄就完全可以按照你附件里面的代码拆分了

还是孙博对我好,呵呵
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-30 07:10 , Processed in 0.411177 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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