功能定位:为什么还在用 VBA?
核心关键词“WPS VBA 批量合并工作簿”在 2026 年依旧活跃,原因是:无网环境、内网合规、老模板复用三点刚性需求无法被“WPS Script(TypeScript 低代码)”完全替代。WPS Office 自 2021 版起内置 VBA7.1 引擎,宏安全性国密 SM4 加密通过信创评审,可在统信 UOS/麒麟/Windows 三端运行,成为政企用户“离线批处理”首选。
与微软不同的是,WPS 把 VBA 编辑器藏在「工具」菜单而非独立窗口;同时默认禁用宏,需手动开启。下文所有步骤均在截至当前的最新版本(2026 Spring Refresh)验证通过,路径差异会显式标注。
版本演进:宏支持的三次跳跃
1. 2021 之前:兼容层阶段
仅支持运行录制宏,编辑器缺失,代码需从 Excel 复制过来,64 位 API 声明经常报错。
2. 2021-2023:VBA7.1 完整移植
编辑器、立即窗口、引用库全部到位,UserForm 可正常显示,但「Microsoft Scripting Runtime」需手动勾选,否则 Dictionary 与 FileSystemObject 无法晚期绑定。
3. 2024-2026:国密与性能优化
新增「宏加密存储」选项,默认对 *.et 格式启用 SM4;同时引入「按需编译」,经验性观察:含 3000 行以上模块时,首次运行缩短约 30%。
前置检查:五秒钟确认环境
- 打开 WPS 表格 → 文件 → 选项 → 信任中心 → 宏设置 → 勾选「启用所有宏」(仅内网可信场景)。
- 同一面板点击「VBA 对象模型」允许访问。
- 若菜单栏无「开发工具」,右键功能区 → 自定义 → 勾选「开发工具」选项卡。
提示:在麒麟 V10 SP3下,宏设置入口被挪到「工具 → 安全 → 宏安全」,界面文字完全一致。
最小可运行模板:录制→改造三步走
Step 1 录制手工合并
新建汇总簿 → 开发工具 → 录制宏 → 手工复制 A1:D100 → 停止录制。得到如下骨架:
Sub 宏1()
Workbooks("源.xlsx").Sheets(1).Range("A1:D100").Copy
ThisWorkbook.Sheets(1).Range("A1").PasteSpecial xlPasteValues
End Sub
Step 2 改写为循环
把硬编码文件名改为数组,用 Dir 遍历文件夹,每轮向下偏移最后一行 +1:
Sub MergeBooks()
Dim f As String, rw As Long, ws As Worksheet
Set ws = ThisWorkbook.Sheets(1): rw = 1
f = Dir(ThisWorkbook.Path & "\源数据\*.xlsx")
Do While f <> ""
With Workbooks.Open(ThisWorkbook.Path & "\源数据\" & f, ReadOnly:=True)
.Sheets(1).UsedRange.Copy
ws.Cells(rw, 1).PasteSpecial xlPasteValues
rw = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
.Close False
End With
f = Dir()
Loop
Application.CutCopyMode = False
End Sub
Step 3 一键按钮化
开发工具 → 插入 → 表单控件按钮 → 绑定「MergeBooks」;保存为 *.et 启用宏工作簿。下次双击即可运行,无需再进 VBA 编辑器。
平台差异速查表
| 平台 | 启用宏路径 | 默认文件格式 | 备注 |
|---|---|---|---|
| Windows | 文件→选项→信任中心 | *.et | 支持 32/64 位 API |
| macOS | WPS→偏好设置→安全 | *.et | FileSystemObject 需引用「Microsoft Scripting」 |
| 麒麟/统信 | 工具→安全→宏安全 | *.et | 国密 SM4 加密默认开启 |
常见分支:带表头/多工作表/仅追加更新
场景 A:首行表头只留一份
在循环体内加判断 If rw > 1 Then Set copyRng = .UsedRange.Offset(1),跳过表头即可。
场景 B:每个文件含多工作表,需按同名合并
用双层循环,外层遍历文件,内层用 For Each sh In .Sheets,以 sh.Name 作为目标表关键字,找不到就新建。
场景 C:每日增量,只追加昨日新增行
在汇总簿新增「LastUpdate」命名值,宏运行前读取该时间,再用 .Range.AutoFilter 把大于该时间的行筛出来复制,最后更新 LastUpdate。
性能与边界:何时不该用 VBA?
工作假设:当待合并文件超过 500 MB 或单表 100 万行时,VBA 循环打开/关闭工作簿的耗时呈线性增长,可能出现「数十秒以上」等待;此时建议改用「WPS Script + CSV 流式拼接」或「Power Query(若可用)」方案。
验证方法:在相同 SSD 环境,分别记录 Dir 循环与手动 Power Query 合并耗时;若前者 >3 倍,即可判定为边界外。
故障排查:五类高频报错
- 运行时错误 1004:通常因合并后行数 > 1,048,576(XLSX 上限),改用 *.et 格式可扩展至 2,199,023 行。
- 找不到项目或库:引用丢失,进入工具→引用,勾选「Microsoft Scripting Runtime」。
- 宏被数字签名拒绝:企业策略强制「只允许签名宏」,需用国密证书重新签名或让管理员放行。
- 粘贴后格式丢失:把
xlPasteValues改为xlPasteAllUsingSourceTheme,但会增大文件体积约 15%。 - 麒麟下中文路径 Dir 返回空:经验性观察:当系统 locale 为 zh_CN.UTF-8 时,把路径变量声明为
String * 260可规避。
与 WPS Script 的协同思路
2026 版起,WPS Script 支持 context.workbook 对象,可通过「按钮」调用同一文件内的 VBA 宏,实现低代码前端 + VBA 后端混合模式:Script 负责校验、日志,VBA 负责高速复制。两者互通无需额外权限,但需把文件存为 *.et 格式。
合规与审计:国密加密打开后注意什么?
启用宏国密加密后,每次保存都会重写 SM4 摘要,版本历史功能无法回滚到宏代码层面,仅保留文档内容快照。建议:在 Git 私有仓另行备份 *.bas 模块,或在汇总簿增设「版本」自定义属性,写入宏更新日期,方便审计追溯。
最佳实践 6 条速查表
- 统一把待合并文件放在子文件夹,避免 Dir 误入临时文件。
- 首行留表头,宏内部用 Offset(1) 跳过,确保列对齐。
- 打开源文件时加
ReadOnly:=True,减少锁库概率。 - 复制完立即
.Close False释放内存,防止 500 文件后崩溃。 - 把 rw 变量写入状态栏
Application.StatusBar,用户可见进度。 - 最终汇总簿另存为「_合并结果_日期.et」,避免覆盖模板。
适用/不适用场景清单
| 维度 | 适用 | 不适用 |
|---|---|---|
| 文件数量 | 5–500 个 | >2000 个(Dir 线性耗时) |
| 单文件体积 | < 50 MB | >200 MB(打开/关闭开销大) |
| 网络环境 | 离线、内网 | 需实时云端协作 |
| 合规要求 | 国密、信创 | 需跨国传输(无 SM4 支持) |
FAQ:WPS VBA 合并工作簿
WPS 宏与微软 VBA 100% 兼容吗?
常规语法、对象模型兼容度约 95%;但 API 声明需统一 PtrSafe,且部分 Windows 专用库(如 Scripting.Dictionary)需手动引用。
合并后格式错乱怎么办?
把 PasteSpecial 参数从 xlPasteValues 改为 xlPasteAllUsingSourceTheme,并确保列宽一致;若仍错位,可在循环末尾加 ws.Columns.AutoFit。
能否在安卓端运行?
WPS 移动版暂不支持 VBA 编辑器,仅可查看由桌面端生成的「按钮」;点击按钮会提示「宏需在 Windows/Linux 桌面运行」。
文件太大打不开,如何拆分?
可改用「WPS Script」流式读取 CSV,按 50 万行一块写入新表;或先用命令行压缩为 ZIP,再分卷传输,桌面端合并后再运行宏。
国密加密会降低性能吗?
经验性观察:在 SSD 环境保存 50 MB 文件,SM4 加密带来约 10% 额外耗时;若关闭加密则几乎无感知,但需符合企业合规要求。
收尾:下一步行动建议
如果你正面临周期性日报、月报,且文件数量在百级以内,先按本文模板跑通最小循环,再逐步叠加「表头跳过」「增量更新」分支即可。若文件规模或协作维度继续膨胀,把 VBA 当作数据清洗后端,前端用「WPS Script + 表单」收集,形成离线/在线双轨方案,既满足信创合规,也保留未来平滑升级到官方低代码平台的余地。
