前面我们发布过将多个Excel工作簿中的工作表合并到一个工作表簿中,就有网友提了一个问题,如何讲一个Excel工作簿中的工作表拆分成多个工作表,其实实现的方法很多,如果数据少的话,我们直接采用Excel的筛选,然后复制粘贴就可以了,如果数据比较多,或者是日常工作的话,每天这样复制粘贴,就很麻烦~,或者我们使用透视表也可以。我们这讲就来使用VBA的方法来实现,这个方法很简单,只需要复制代码(代码也是小编从网上找的,然后修改了下,这样通用性就更强了,更多精彩请关注公众号:word_excel_ppt),运行就可以了。

1、素材文件

vba拆分单元格内容(Excel小技巧使用VBA10秒钟搞定拆分工作表)(1)

素材文件

我们的素材文件是以某公司为例,数据记录了公司旗下有7家店铺,从2016年1月1日到2018年12月31日,每天销售的流水数据。

存放数据的工作表名称已修改为“数据源”,工作表的第一行为标题行,一共有2195行数据。

现在我们想按照店铺名称,将整个工作表拆分开。

2、操作步骤

打开我们的工作表文件以后,将需要拆分的工作表名字修改成“数据源”。然后按键盘上面的Alt F11,弹出VBA编辑的窗口,将代码粘贴进代码编辑器中(代码见最后附件);

vba拆分单元格内容(Excel小技巧使用VBA10秒钟搞定拆分工作表)(2)

代码窗口

重要的事情重复一次,因为我们代码里面,要拆分的工作表名称叫"数据源",所以你直接把你要拆分的工作表名称修改成“数据源”才能正常运行。

3、运行程序

在VBA编辑器中,点击示例中的绿色三角(见上图),或者是按键盘上面的F5都可以。

vba拆分单元格内容(Excel小技巧使用VBA10秒钟搞定拆分工作表)(3)

选择标题行

此时会让我们选择标题行,我们通过鼠标点击标记标题行(第1行)就可以了;

vba拆分单元格内容(Excel小技巧使用VBA10秒钟搞定拆分工作表)(4)

选择拆分字段

接下来会让我们选择,需要按照哪个字段拆分,我们就选择门店名称(B1)单元格,然后直接点确定。

vba拆分单元格内容(Excel小技巧使用VBA10秒钟搞定拆分工作表)(5)

搞定

这个时候程序就会自动运行,鼠标会闪动,我们需要等一下,运行的时间就和你电脑的配置以及要拆分文件的大小有关,以我们的素材为例,大概需要10秒钟,就可以搞定,然后会弹出一个提示完成的消息框,我们点确定就可以。

vba拆分单元格内容(Excel小技巧使用VBA10秒钟搞定拆分工作表)(6)

运行结果

回到我们的文件里面,可以看到程序已经给我们拆分好了,是不是觉得很方便呢?

附程序代码(程序在Win7 Excel 2016 运行可行):

视频演示,稍后发布在头条专栏中

Sub 按照指定字段拆分工作表() '本程序来源于网络,原作者不详,特留此句对原作者表示感谢; '本程序中,云淡风轻微课堂(公众号:word_excel_ppt)进行了部分修改,适用性更广 Dim myRange As Variant Dim myArray Dim titleRange As Range Dim title As String Dim columnNum As Integer myRange = Application.InputBox(prompt:="请用鼠标点击标题行:", Type:=8) myArray = WorksheetFunction.Transpose(myRange) Set titleRange = Application.InputBox(prompt:="请用鼠标点击要拆分的字段,必须是第一行,且为1个单元格", Type:=8) title = titleRange.Value columnNum = titleRange.Column Application.ScreenUpdating = False Application.DisplayAlerts = False Dim i&, Myr&, Arr, num& Dim d, k For i = Sheets.Count To 1 Step -1 If Sheets(i).Name <> "数据源" Then Sheets(i).Delete End If Next i Set d = CreateObject("Scripting.Dictionary") Myr = Worksheets("数据源").UsedRange.Rows.Count Arr = Worksheets("数据源").Range(Cells(2, columnNum), Cells(Myr, columnNum)) For i = 1 To UBound(Arr) d(Arr(i, 1)) = "" Next k = d.keys For i = 0 To UBound(k) Set conn = CreateObject("adodb.connection") Select Case Application.Version * 1 '设置连接字符串,根据版本创建连接 Case Is <= 11 conn.Open "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties=excel 8.0;Data source=" & ThisWorkbook.FullName Case Is >= 12 conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES"";""" End Select Sql = "select * from [数据源$] where " & title & " = '" & k(i) & "'" Worksheets.Add after:=Sheets(Sheets.Count) With ActiveSheet .Name = k(i) For num = 1 To UBound(myArray) .Cells(1, num) = myArray(num, 1) Next num .Range("A2").CopyFromRecordset conn.Execute(Sql) End With Sheets(1).Select Sheets(1).Cells.Select Selection.Copy Worksheets(Sheets.Count).Activate ActiveSheet.Cells.Select Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Next i conn.Close Set conn = Nothing Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox " 已经拆分完成" & vbCrLf & vbCrLf & "更多内容敬请关注公众号:word_excel_ppt", vbInformation, "云淡风轻微课堂" End Sub

更多精彩请关注公众号:word_excel_ppt

,