ARTICLE · 1354154
Excel VBA如何批量处理多个工作表
一个工作簿里几十张结构相同的分表,手工一张张复制粘贴至少要半小时。用 Excel VBA 批量处理多个工作表,一段 For Each 循环就能全部跑完。这篇给出合并汇总、批量格式化、批量重命名三套可直接复制的代码,并说明循环时最容易翻车的地方。
核心思路:用 For Each 遍历工作表
一个工作簿里所有工作表组成一个集合,写法是 Worksheets;用 For Each ws In Worksheets 就能一张张挨着处理,处理完用 Next ws 进入下一张。ws 是变量名,代表“当前这一张表”,操作它和平时写代码一样,例如 ws.Range("A1").Value。
这几段 VBA 代码都要放在标准模块里:先按 Alt+F11 打开编辑器,插入模块,再粘贴运行。
场景一:把多张分表合并到一张汇总表
新建一张工作表改名为“汇总”,在 A1 写好事先定好的标题行。 在模块里粘贴代码: Sub 合并()Dim ws As Worksheet, r As Longr = 2For Each ws In Worksheets If ws.Name <> "汇总" Then ws.Range("A2:D100").Copy Destination:=Worksheets("汇总").Cells(r, 1) r = r + 100 End IfNext wsEnd Sub按 F5 运行,各分表 A2:D100 的数据会依次贴到汇总表里,这里假设每张分表最多 99 行数据。 实际行数不固定时,把固定区域换成 ws.Range("A2").CurrentRegion,或者先算末行lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row。
场景二:批量格式化所有分表
把每张表的 A1:H1 设成加粗、居中、灰底,代码只要几行:For Each ws In Worksheets: ws.Range("A1:H1").Font.Bold = True: Next ws。要同时冻结首行,在循环里写 ws.Activate: ActiveWindow.FreezePanes = False: ws.Range("A2").Select: ActiveWindow.FreezePanes = True,冻结窗格必须先激活对应的工作表,否则操作的是当前表。
同一套写法还能批量设置打印:ws.PageSetup.PrintArea = "A1:H50": ws.PageSetup.Orientation = xlLandscape,把打印区域、横向纸张、缩放比例一次配好,几十张分表不用再一张张点页面布局。需要注意工作表受保护时改不了页面设置,先 ws.Unprotect 再操作。
场景三:批量重命名与批量删除
按 A 列的顺序重命名: For i = 1 To 12: Worksheets(i).Name = ActiveSheet.Cells(i, 1).Value: Next i,这里Cells要限定到具体工作表(如ActiveSheet.Cells,或用With限定),假设 A1:A12 存的是 1 到 12 月的表名;改名遇到重名会报 1004,最好先判断名称是否已存在再改。批量删除前先关掉确认框: Application.DisplayAlerts = False,然后用倒序索引循环删除,不要对Worksheets集合边遍历边Delete:For i = Worksheets.Count To 1 Step -1: Worksheets(i).Delete: Next i,结束时再改回 True,否则每删一张都会弹窗询问。删除操作无法用 Ctrl+Z 撤销,运行前务必先备份一份文件副本。
循环处理时的 4 个坑
If ws.Name <> "汇总" 排除 | ||
Application.ScreenUpdating = False,结尾改回 True |
常见问题
- 只想处理其中几张表?
改动一行 VBA,把 Worksheets换成点名数组,例如Array(Worksheets("1月"), Worksheets("2月")),就只跑指定的表。 - 要处理多个文件怎么办?
用 Workbooks.Open逐个打开文件,处理完Close SaveChanges:=True,思路和批量处理工作表完全一样。 - WPS 能用吗?
语法一致,WPS 表格安装 VBA 宏插件后,同样可以运行上面这些批量处理工作表的代码。















































































