- 打开需要拆分的 Excel 文件,按下 ALT + F11 组合键,打开 VBA 编辑器。
- 在 VBA 编辑器中,右键单击项目导航窗格中的“Microsoft Excel 对象”,选择“插入”-“模块”,创建一个新的模块,名称可任意取。
- 将该段代码复制到新建的模块中。
- 修改代码中的
WJhangshu
变量值为要拆分的每个工作簿中的最大行数(默认为 15000)。 - 按下 F5 键或单击工具栏上的“运行”按钮来执行代码,Excel 会自动按照指定的行数拆分表格,并保存为多个工作簿。
Sub cfb()
Dim r, c, i, WJhangshu, WJshu, bt As Long
Dim originalFileName As String, originalFilePath As String, originalExtension As String
Dim newFileName As String
r = Range("A" & Rows.Count).End(xlUp).Row
c = Cells(1, Columns.Count).End(xlToLeft).Column
bt = 1 'title
WJhangshu = 15000 'num
WJshu = IIf(r - bt Mod 20000, Int((r - bt) / WJhangshu), Int((r - bt) / WJhangshu) + 1)
originalFileName = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1) '获取原文件名
originalFilePath = ThisWorkbook.Path '获取原文件路径
originalExtension = Right(ThisWorkbook.Name, Len(ThisWorkbook.Name) - InStrRev(ThisWorkbook.Name, ".")) '获取原文件扩展名
For i = 0 To WJshu
Workbooks.Add
Application.DisplayAlerts = False
newFileName = originalFileName & "_" & Format(i + 1, String(Len(WJshu), 0))
ActiveWorkbook.SaveAs Filename:=originalFilePath & "\" & newFileName & "." & originalExtension
Application.DisplayAlerts = True
ThisWorkbook.ActiveSheet.Range("A1").Resize(bt, c).Copy ActiveSheet.Range("A1")
ThisWorkbook.ActiveSheet.Range("A" & bt + i * WJhangshu + 1).Resize(WJhangshu, c).Copy _
ActiveSheet.Range("A" & bt + 1)
ActiveWorkbook.Close True
Next
End Sub
-
Dim r, c, i, WJhangshu, WJshu, bt As Long
:声明变量。 -
r = Range("A" & Rows.Count).End(xlUp).Row
:获取 A 列中最后一个非空单元格的行数,也就是表格中的最后一行。 -
c = Cells(1, Columns.Count).End(xlToLeft).Column
:获取第一行最后一个非空单元格的列数,也就是表格中的最后一列。 -
bt = 1
: 设置开始复制数据的行数,这里为第一行。 -
WJhangshu = 15000
:设置每个工作簿中最大的行数。 -
WJshu = IIf(r - bt Mod 20000, Int((r - bt) / WJhangshu), Int((r - bt) / WJhangshu) + 1)
:计算需要分割成几个工作簿,其中加入了用 Mod 操作保证表格总行数可以被 25000 整除。 -
originalFileName = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)
:获取当前文件的文件名。(新增代码) -
originalFilePath = ThisWorkbook.Path
:获取当前文件的路径。(新增代码) -
originalExtension = Right(ThisWorkbook.Name, Len(ThisWorkbook.Name) - InStrRev(ThisWorkbook.Name, "."))
:获取当前文件的扩展名。(新增代码) -
For i = 0 To WJshu
:循环创建并保存每个工作簿。 -
Workbooks.Add
:新建一个工作簿。 -
Application.DisplayAlerts = False
:将显示警告设置为非活动状态,以免在保存工作簿时弹出提示框。 -
newFileName = originalFileName & "_" & Format(i, String(Len(WJshu), 0))
:生成新的文件名,命名规则为原文件名加下划线及数字后缀,例如“file_1.xlsx”、“file_2.xlsx”,其中数字后缀的位数与需要分割成的工作簿总数保持一致。(新增代码) -
ActiveWorkbook.SaveAs Filename:=originalFilePath & "\" & newFileName & "." & originalExtension
:将工作簿保存到原文件夹下,并以生成的新文件名命名。 -
Application.DisplayAlerts = True
:将显示警告设置为活动状态。 -
ThisWorkbook.ActiveSheet.Range("A1").Resize(bt, c).Copy ActiveSheet.Range("A1")
:将原表中的第一行复制到新建的工作簿中。 -
ThisWorkbook.ActiveSheet.Range("A" & bt + i * WJhangshu + 1).Resize(WJhangshu, c).Copy ActiveSheet.Range("A" & bt + 1)
:将原表中的数据按预设的行数进行分割,并复制到新建的工作簿中。 -
ActiveWorkbook.Close True
:关闭并保存新建的工作簿。