前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ExcelVBA拆分之一簿一表_to_一簿多表

ExcelVBA拆分之一簿一表_to_一簿多表

作者头像
哆哆Excel
发布2023-09-09 10:50:30
2150
发布2023-09-09 10:50:30
举报
文章被收录于专栏:哆哆Excel

ExcelVBA拆分之一簿一表_to_一簿多表

=====start====

1.Excel按单位拆分成不同工作表

2.Excel技巧篇-利用数据透视表按单位分类拆分工作表

=====end====

【问题】

在本工作簿中把当前的工作表,按“省份”拆分成不同的工作表,拆分出来的表生成在本工作簿

【思路】

1.先弹出对话框,输入标题行数2.再弹出对话框,输入你要拆分的列在那一列,选择那列3.用字典,对所在列进行去重4.再生成key值工作表,5.复制标题,复制,等于key值的行,先复制数据与公式,再复制格式

【代码】

代码语言:javascript
复制
    '把当前表拆分:一簿一表_to_一簿多表
    '作者:哆哆
    '时间:2023-05
Sub yhd_ExcelVBA_3拆分_一簿一表_to_一簿多表()
    Dim title_row As Integer, RngCol As Range, split_Col As Integer
    Dim dic As Object, ThisSht As Worksheet, i As Long
    Set dic = CreateObject("scripting.dictionary")
    disAppSet (False)
    On Error Resume Next
    title_row = Application.InputBox(prompt:="请输入标题行数:", Type:=1)
    Set RngCol = Application.InputBox(prompt:="请选择", Default:=Selection.Address, Title:="选择", Type:=8)
    If title_row = False Or RngCol = False Or title_row < 1 Then MsgBox "输入有误或选择空白区域,退了", 16, "哆哆提示": Exit Sub
    On Error GoTo 0                                            '以下恢复捕捉代码出现错误消息
    t = Timer
    split_Col = RngCol.Column
    Set ThisSht = ActiveSheet
    With ThisSht
        lastrow = .Cells.Find("*", , , , 1, 2).Row
        For i = title_row + 1 To lastrow
            s = Trim(.Cells(i, split_Col))
            If s <> "" Then
                dic(s) = IIf(dic.exists(s), dic(s) & "_" & i, i)
            End If
        Next i
    End With
'    With Worksheets("Sheet2")
'        For k = 1 To dic.Count
'            .Cells(k, 1) = dic.keys()(k - 1)
'            .Cells(k, 2) = dic.items()(k - 1)
'        Next k
'    End With
    For j = 0 To dic.Count - 1
        Set addSht = Worksheets.Add(After:=Worksheets(Worksheets.Count))
        With addSht
            ThisSht.Cells(1, 1).Resize(title_row, 1).EntireRow.Copy .Cells(1, 1)
            cc = VBA.Split(dic.items()(j), "_")
            Set ran = ThisSht.Rows(cc(0))
            For i = 1 To UBound(cc)
                If cc(i) <> "" Then
                    Set ran = Application.Union(ran, ThisSht.Rows(cc(i)))
                End If
            Next i
            ran.Copy
            .Cells(title_row + 1, 1).Select
            Selection.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
            Selection.PasteSpecial Paste:=xlPasteFormats
            For Each shp In .Shapes
                shp.Delete
            Next shp
            .Cells(1, 1).Select
            .Name = dic.keys()(j)
        End With
    Next j
    MsgBox "拆分" & dic.Count & "个,用时:" & Format(Timer - t, "0.00秒")
    disAppSet (True)
End Sub
    '用法:disAppSet(true)开disAppSet(true)关
Sub disAppSet(flag As Boolean)
    With Application
        .ScreenUpdating = flag
        .DisplayAlerts = flag
        .AskToUpdateLinks = flag
        If flag Then
            .Calculation = xlCalculationAutomatic
        Else
            .Calculation = xlCalculationManual
        End If
    End With
End Sub

【效果】

=====学习笔记=====

  1. ExcelVBA汇总-多簿一表_to_一簿一表
  2. ExcelVBA汇总多工作簿中指定工作表到新工作簿
  3. ExcelVBA汇总多工作簿中指定工作表到新工作簿
  4. ExcelVBA删除指定列含有指定字符的所在的行
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 哆哆Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档