美文网首页零基础自学VBAVBA干货文集VBA码码
【收藏备用】工作簿(表)合并拆分那些事

【收藏备用】工作簿(表)合并拆分那些事

作者: VBA说 | 来源:发表于2018-11-18 16:50 被阅读27次

    好多人开始学习VBA,就是从工作簿、工作表的合并、拆分开始感兴趣的。之前零零散散的写过,还是整理成一个合集,留待备用。

    单个excel文件是工作簿,excel文件中的Sheet是工作表。

    一、合并工作簿

    Sub 合并工作簿()

        Application.ScreenUpdating = False

        myfile = Dir(ThisWorkbook.Path & "\*.xls*")'Dir函数,获取同路径下待合并excel的文件名

        Do While myfile <> ""  '当文件名不为空的时候,继续运行,如果为空,说明表格已经循环一个遍了

               If myfile <> ThisWorkbook.Name Then'在文件名不为空的前提下,还不能是代码所在的汇总工作簿

                    Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & myfile)

                    For m = 1 To wb.Worksheets.Count '对待汇总的工作簿中所有worksheet做循环

    rrow = wb.Worksheets(m).UsedRange.Rows.Count

                    wb.Worksheets(m).Range("a1:d" & rrow).Copy ThisWorkbook.Worksheets(1).Cells(Rows.Count, "a").End(xlUp).Offset(1, 0)

                    Next

                    Workbooks(myfile).Close False'复制完数据以后,分表关闭,不保存。

               Else

             End If

            myfile = Dir '获取下一个待汇总工作簿的文件名

        Loop

        Application.ScreenUpdating = True

        MsgBox "完成"

    End Sub

    ▶绿色部分为按自己需要修改的代码。文中代码框架是汇总A:D列内容。

    这里着重说一下:代码使用环境是待合并工作簿和代码工作簿在同一个路径下。

    如果想弹出一个对话框,让选择路径,再进行合并的话

    只需要在上面的代码中加如下代码,并把"ThisWorkbook.Path"改为"PathSht"

    Sub 合并工作簿()    Application.ScreenUpdating = False    With Application.FileDialog(msoFileDialogFolderPicker) '创建一个浏览文件夹的对话框        If .Show = -1 Then PathSht = .SelectedItems(1) Else Exit Sub    End With

    源代码,省略不写了,记得把"ThisWorkbook.Path"改为"PathSht"

    ....

    End Sub

    二、拆分工作簿

    这段代码可以实现对工作簿任意列的拆分。(对某一列相同内容的所在行挑出来,汇总到一个新建工作簿里面)

    Sub 拆分工作簿()

       Application.ScreenUpdating = False '关闭屏幕闪动,提速

       Application.DisplayAlerts = False '关闭窗口提示

       kk = 2

       Set dic = CreateObject("scripting.dictionary")

       With ThisWorkbook.Worksheets("待拆分的Sheet名")'根据自己的工作簿自行修改        cln = InputBox("请输入需要按列拆分的列:" & Chr(10) & "英文列标", "输入列标", "A") 'inputbox提示输入需要拆分的列标

           cln2 = .Range("a1").End(xlToRight).Column '获取最大列数,为了增加通用性

           If .Range(cln & 2) = "" Then Exit Sub

           rrow = .Cells(Rows.Count, cln).End(xlUp).Row

           arr = WorksheetFunction.Transpose(.Range(cln & 1 & ":" & cln & rrow))

           For i = 1 To UBound(arr)  '将拆分条件列数据写入字典,为了去重复。

               If Not dic.exists(arr(i)) Then '若字典中不存在该字符串,则写入。

               dic.Add arr(i), .Range("a" & i).Resize(1, cln2)

           Else

               Set dic.Item(arr(i)) = Union(dic.Item(arr(i)), .Range("a" & i).Resize(1, cln2))

           End If

       Next

       k = dic.keys

       l = dic.items

       For ss = 0 To dic.Count - 1

           Set wb = Workbooks.Add '新建工作簿

           With wb.Worksheets(1)

               l(ss).Copy .Range("a1")

           End With

           wb.SaveAs ThisWorkbook.Path & "\" & k(ss) & ".xlsx" '将新建的工作簿保存在代码工作簿下

           wb.Close True '关闭工作簿,并保存

           Set wb = Nothing '释放内存

       Next

    End With

    Application.ScreenUpdating = True

    Application.DisplayAlerts = True

    MsgBox "完成"

    End Sub

    上述代码默认从第一行拆分,如果有标题行不想拆分,可以把上述下句代码修改一下。

    arr = WorksheetFunction.Transpose(.Range(cln & 1 & ":" & cln & rrow)),从哪一行开始拆分,就把1修改为行号

    三、合并工作表(Sheet)

    合并同一个工作簿下所有Sheet到一个Sheet里面就比较简单了。

    Sub 合并当前工作簿下的所有Sheet()

    Application.ScreenUpdating = False

    For j = 1 To Sheets.Count

      If Sheets(j).Name <> ActiveSheet.Name Then

          X = Range("A65536").End(xlUp).Row + 1

          Sheets(j).UsedRange.Copy Cells(X, 1)'默认复制所有内容   End If

    Next

    Range("B1").Select

    Application.ScreenUpdating = True

    MsgBox "当前工作簿下的全部工作表已经合并完毕!", vbInformation, "提示"

    End Sub

    默认复制所有内容,如果有特定需要,自己修改绿色代码部分。

    四、拆分工作表(Sheet)

    如下图所示的拆分,也是很常见的问题。

    Sub 拆分表格()

       Set d = CreateObject("scripting.dictionary")

       With Worksheets(1)

           rrow = .Cells(Rows.Count, "a").End(3).Row

           For i = 2 To rrow '从第2行开始拆分            strr = .Range("c" & i).Value '拆分C列内容            If Not d.exists(strr) Then

                   d.Add strr, .Range("a" & i).Resize(1, 4)

               Else

                   Set d.Item(strr) = Union(d.Item(strr), .Range("a" & i).Resize(1, 4))

               End If

           Next

           k = d.keys

           i = d.items

           For a = 0 To d.Count - 1

               Worksheets.Add.Name = k(a)

               i(a).Copy Worksheets(k(a)).Range("a2")

           Next

       End With

    End Sub

    上述代码用到了字典,具体用法,可以看我之前的文章字典学习第一课(6方法4属性)

    For i = 2 To rrow '从第2行开始拆分  

    strr = .Range("c" & i).Value '拆分C列内容

    根据自己实际需求修改代码即可。

    = 好文推荐 =

    【经验】快速学习VBA

    乱中取数字-Excel中文字和数字混合对数字部分求和

    VBA也能来爬虫(抓取糗百糗图)

    相关文章

      网友评论

        本文标题:【收藏备用】工作簿(表)合并拆分那些事

        本文链接:https://www.haomeiwen.com/subject/hqugfqtx.html