根据指定要求,一键拆分工作簿!

关注Excel不加班置顶公众号


根据指定要求,一键拆分工作簿!_第1张图片


最佳人气奖:雪静,获得全套签名书+全部班级免费学。

根据指定要求,一键拆分工作簿!_第2张图片


运气奖:找不到猫的薛定谔(朋友)、sunshine、紫雪,获得函数书籍。


加卢子微信chenxilu1987


除了老学员,很少有人知道无言这个人,不过无言却是Excel不加班团队不可缺少的人物。一个协助卢子十年的人,一直在背后默默无闻。无言擅长VBA和Word,通常遇到这两类问题,卢子都扔给无言处理,术业有专攻。


好了,介绍完毕,今天来看无言写的VBA教程,换一个口味。


最近在QQ群中,多年的网友“牛省”遇到一个累人的活儿——将几万条信息根据需要的行数量拆开为多个新文件。


牛省:无言,有空吗,我这里有个活儿比较累人,需要你帮我弄个过程节省下时间。


无言:什么事情啊?


牛省:我这里有一份表,要求的根据一定的行数量保存为新的工作簿——例如我现在需要按照每500行拆分为多个文件,现在的总行数有10多万行,我让好几个同事一起分区间拆分,每个人都要用半个小时才能做好,而且保存超级慢;你帮我写个过程吧。


要求:根据指定行数量拆分保留每一个区域间的数据,并且保留原标题样式,并保存为一个新的工作簿,最好是保留原格式,因为系统导入用的。


无言:每一个区域数据指什么呢?


牛省:就是例如,按每500行,保留一次数据,那么从标题后开始的行1-500这个区间的数据和标题内容都另存为一个新的工作簿;下一个区域就从501-1000做同样操作即可。


无言:哦,好的明白了!我忙完了给你写。


现在文件夹中存在着2个文件,别无其他。

根据指定要求,一键拆分工作簿!_第3张图片

无言:过程已经写好,先看操作动画,再看代码解释。


点二维码运行,输入500,需要按多少行就输入多少,然后找到指定的工作簿,选择标题,现在标题是一行,就选择一行。


大约经过30秒钟,就生成了所有工作簿。

根据指定要求,一键拆分工作簿!_第4张图片


代码 1拆分过程代码

Sub 指定拆分行数量并另存为新文件()

‘A

Dim Hangs As Long, MaxR As Long, ShCou AsLong

Dim BiaoT As Range, ShsCou As Long, Cou AsLong

Dim Wjlx As String, Wj_Odj

Dim Wb_Old As Workbook, Wb_New AsWorkbook, Sh As Worksheet

Dim Lj As String, New_Str As String,NewT_Str As String

Dim HouZ_Str As String, RowCou As Long

‘B

On Error Resume Next

‘C

Hangs = Application.InputBox("请输入需要拆分的行数量,默认1000行,最高不超1000,最低为1", Title:="拆分行量", Default:=1000, Type:=1)

If Hangs < 1 Or Hangs > 1000 Then

If MsgBox("拆分行量超过限值,将返回默认1000行,或者选择【No】退出过程!", vbYesNo, "过程提示") = vbNo Then

Exit Sub

Else

Hangs = 10 ^ 3

End If

End If

Wjlx = "Excel 97-03版文件(*.Xls),*.Xls,Excel 07版文件(*.Xlsx),*.Xlsx,Excel文件(*.Xl*),*.Xl*"

Wj_Odj =Application.GetOpenFilename(FileFilter:=Wjlx, FilterIndex:=1, Title:="打开", MultiSelect:=False)

If Err.Number <> 0 Then Exit Sub

Set Wb_Old = Workbooks.Open(Wj_Odj)

Lj = Wb_Old.Path

HouZ_Str = StrReverse(Wb_Old.Name)

HouZ_Str = StrReverse(Left(HouZ_Str,InStr(HouZ_Str, ".")))

New_Str = Replace(Wb_Old.Name, HouZ_Str,"")

‘D

With Wb_Old.Sheets(1)

.Activate

Set BiaoT =Application.InputBox("请选择标题范围,选择整行或数行!", "标题范围", .Rows("1:4").Address, Type:=8)

If BiaoT Is Nothing Then MsgBox "您为选择区域,过程将退出!": Exit Sub

MaxR = .Cells(Rows.Count, 1).End(xlUp).Row

ShCou = IIf((MaxR - 1 Mod Hangs) = 0,(MaxR - 1) / Hangs, (MaxR - 1) \ Hangs + 1)

Cou = BiaoT.Rows.Count

End With

‘E

Application.ScreenUpdating = False

Application.DisplayAlerts = False

For ShsCou = 1 To ShCou

NewT_Str = Lj & "\" &New_Str & " No " & Format((ShsCou - 1) * Hangs + 1,"000000000") & HouZ_Str

ActiveWorkbook.SaveCopyAs NewT_Str

Set Wb_New =Workbooks.Open(NewT_Str) '前台打开

With Wb_New.Sheets(1)

.Activate

If ShsCou = 1 Then

RowCou = MaxR - Hangs -BiaoT.Rows.Count

.Cells(Cou + 1,1).Offset(Hangs).Resize(RowCou).EntireRow.Clear

Else

RowCou = MaxR - Hangs -BiaoT.Rows.Count

.Cells(Cou + 1,1).Offset(Hangs).Resize(Rows.Count - Cou - Hangs).EntireRow.Clear

RowCou = Hangs * (ShsCou - 1)

.Cells(BiaoT.Rows.Count + 1,1).Resize(RowCou).EntireRow.Delete

End If

Wb_New.Close SaveChanges:=True

Cou = Cou + Hangs '行量计数器

End With

Next ShsCou

‘F

Wb_Old.Close SaveChanges:=False '关闭源工作簿

Application.ScreenUpdating = True

MsgBox New_Str & "文件已经按 " & Hangs & "行拆分为" & ShsCou & "个独立的文件!" _

& vbCr & "该过程将关闭Excel,请再次打开Excel查看!"

Application.Quit '关闭Excel

End Sub


代码说明以及源文件下载:

https://pan.baidu.com/s/1Fxq0NUWRaoc02LDnrwnhlg


学习Excel或其Office组件程序的VBA编程,入门都先通过录制简单的宏过程,再通过离线或在线帮助对所录制的方法/属性等进行学习,最重要的一点还是要通过工作或兴趣来拾取对学习的兴趣。


推荐:一键生成工资条,99%的人都能学会

上篇:抢!Excel不加班最佳人气奖

根据指定要求,一键拆分工作簿!_第5张图片

在最困难的时候,你是如何熬过来的?



作者:卢子,清华畅销书作者,《Excel效率手册 早做完,不加班》系列丛书创始人,个人公众号:Excel不加班(ID:Excelbujiaban)

根据指定要求,一键拆分工作簿!_第6张图片

请把「Excel不加班」推荐给你的朋友

你可能感兴趣的:(根据指定要求,一键拆分工作簿!)