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

好多人开始学习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也能来爬虫(抓取糗百糗图)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342