Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: yjwdjfqb

[已解决]VBA按同类拆分成工作表、工作薄

[复制链接]
发表于 2015-9-1 16:11 | 显示全部楼层
zjdh 发表于 2015-8-31 19:32

老师:如果只要分解成独立的工作簿,代码如何精减?
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2015-9-1 17:00 | 显示全部楼层
zjdh 发表于 2015-8-31 19:32

这样怎么执行不成功呀,老师,请指教下,谢谢老师了!
无标题.jpg
回复

使用道具 举报

发表于 2015-9-1 19:18 | 显示全部楼层
Sub 拆分()
    On Error Resume Next
    Set Rng = Application.InputBox("请选择拆分的字段", "选择", , , , , , 8)
    If Rng Is Nothing Then Exit Sub
    B = MsgBox("是否拆成独立工作簿?", 4 + 32 + 256, "设定")
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    For I = Sheets.Count To 2 Step -1
        Sheets(I).Delete
    Next
    Set D = CreateObject("scripting.dictionary")
    ARR = Range("A2").CurrentRegion
    CL = Rng.Column
    For I = 3 To UBound(ARR)
        If Not D.exists(ARR(I, CL)) Then
            D(ARR(I, CL)) = I
        Else
            D(ARR(I, CL)) = D(ARR(I, CL)) & "," & I
        End If
    Next
    K = D.KEYS
    For I = 0 To UBound(K)
        Sheets.Add(after:=Sheets(Sheets.Count)).Name = K(I)
        ThisWorkbook.Sheets(1).Range("A1:I2").Copy ActiveSheet.Range("A1")
        W = Split(D(K(I)), ",")
        For J = 0 To UBound(W)
            ThisWorkbook.Sheets(1).Rows(W(J)).Copy ActiveSheet.Range("A65536").End(3)(2)
        Next
        ActiveSheet.Columns("A:I").Columns.AutoFit
        If B = 6 Then
            Sheets(K(I)).Copy
            ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & K(I) & ".xls"
            ActiveWorkbook.Close
            Sheets(K(I)).Delete
        End If
    Next
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "拆分完成!"
End Sub
回复

使用道具 举报

发表于 2015-9-1 19:19 | 显示全部楼层
本帖最后由 zjdh 于 2015-9-1 19:20 编辑
龙送农 发表于 2015-9-1 16:11
老师:如果只要分解成独立的工作簿,代码如何精减?


删减不了多少,还不如留着另一个功能。
回复

使用道具 举报

发表于 2015-9-1 19:24 | 显示全部楼层
安全网 发表于 2015-9-1 13:55
是否可以变成可以加载的宏通用

2楼不是有介绍通用工具了吗?
回复

使用道具 举报

发表于 2015-9-1 20:03 | 显示全部楼层
zjdh 发表于 2015-9-1 19:19
删减不了多少,还不如留着另一个功能。

我有一个表,只需要分解成独立的工作簿的这个功能。想借您写的这个代码来用,麻烦您老师精简,先谢了!
回复

使用道具 举报

 楼主| 发表于 2015-9-1 20:14 | 显示全部楼层
zjdh 发表于 2015-9-1 19:18
Sub 拆分()
    On Error Resume Next
    Set Rng = Application.InputBox("请选择拆分的字段", "选择", ...

谢谢老师的耐心解答!

回复

使用道具 举报

发表于 2015-9-1 20:34 | 显示全部楼层
zjdh 发表于 2015-9-1 19:24
2楼不是有介绍通用工具了吗?

如果是当前打开的工作薄要拆分,二楼的就需要重新选择,这样操作起来因为当前的工作设置了密码就需要重新输入密码才行
回复

使用道具 举报

发表于 2015-9-1 21:40 | 显示全部楼层
龙送农 发表于 2015-9-1 20:03
我有一个表,只需要分解成独立的工作簿的这个功能。想借您写的这个代码来用,麻烦您老师精简,先谢了!{: ...

Sub 拆分()
    On Error Resume Next
    Set Rng = Application.InputBox("请选择拆分的字段", "选择", , , , , , 8)
    If Rng Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set D = CreateObject("scripting.dictionary")
    ARR = Range("A2").CurrentRegion
    CL = Rng.Column
    For I = 3 To UBound(ARR)
        If Not D.exists(ARR(I, CL)) Then
            D(ARR(I, CL)) = I
        Else
            D(ARR(I, CL)) = D(ARR(I, CL)) & "," & I
        End If
    Next
    K = D.KEYS
    For I = 0 To UBound(K)
        Sheets.Add(after:=Sheets(Sheets.Count)).Name = K(I)
        ThisWorkbook.Sheets(1).Range("A1:I2").Copy ActiveSheet.Range("A1")
        W = Split(D(K(I)), ",")
        For J = 0 To UBound(W)
            ThisWorkbook.Sheets(1).Rows(W(J)).Copy ActiveSheet.Range("A65536").End(3)(2)
        Next
        ActiveSheet.Columns("A:I").Columns.AutoFit
        Sheets(K(I)).Copy
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & K(I) & ".xls"
        ActiveWorkbook.Close
        Sheets(K(I)).Delete
    Next
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "拆分完成!"
End Sub
回复

使用道具 举报

发表于 2015-9-1 22:00 | 显示全部楼层
zjdh 发表于 2015-9-1 21:40
Sub 拆分()
    On Error Resume Next
    Set Rng = Application.InputBox("请选择拆分的字段", "选择 ...

谢谢老师的耐心指教!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 10:18 , Processed in 0.276183 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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