尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Excel VBA多文件同名表多列数据汇总

Excel VBA多文件同名表多列数据汇总 “打开一个文件复制、粘贴关闭再打开下一个复制、粘贴关闭……”如果你每个月都要把几十个分店、车间或客户发来的 Excel 报表合并到一张总表里上面这句话就是你最真实的日常。手动操作三五十个文件少说要半小时多则两小时而且整个过程高度重复。最要命的是只要中途接个电话或者哪个文件的列没对齐汇总结果就会出错等发现时往往已经报完表了。这类问题有一个非常成熟的解法用 Excel VBA 写一个文件级批处理脚本。它不需要安装 Python不需要配置环境Excel 本身就能跑只要文件格式规整、列结构统一脚本几秒钟就能完成手动半小时的工作量。本文就围绕“多文件同名表多列数据汇总”这个需求从零讲清楚 VBA 的整体思路、完整代码、运行方式和排错方法。先说一个判断VBA 非常适合“频率高、步骤固定、数据量不大”的批处理任务。文件数量在几十个、单个文件几千行以内时VBA 脚本是性价比最高的方案。如果数据量已经到百万行级别或者源文件的列名经常变化那就该考虑 Power Query 或 Python 了这一点会在文章最后展开讲。1. 先搞清楚这个需求到底难在哪很多人以为“把多个 Excel 文件汇总到一起”的难点在“读取 Excel 数据”其实当你把手工操作翻译成程序逻辑后会发现真正的难点在四个容易被忽略的细节上。第一是文件遍历。程序要知道去哪个文件夹找文件要能识别.xls、.xlsx、.xlsm这些常见格式还要跳过 Excel 打开文件时自动生成的临时文件以~$开头。第二是工作簿的打开与关闭。每打开一个文件程序就要占用一份内存处理完必须关闭否则几十个文件开下来内存会飙升甚至造成 Excel 假死。第三是“同名表”的定位。每个工作簿里有多个工作表程序必须准确找到名字叫“明细”的那一张找不到时不能报错退出而是应该跳过并记录日志。第四是防止“汇总表被自己扫进去”。汇总脚本本身也存放在一个 Excel 工作簿里这个工作簿往往也在目标文件夹中如果程序遍历时不排除自己就会把自己也当成源文件读取轻则产生脏数据重则死循环。理解这四个细节后代码框架其实是固定的遍历文件 → 打开工作簿 → 定位同名工作表 → 读取多列数据 → 写入汇总表 → 关闭工作簿。接下来的所有代码都是这个框架的落地。2. 核心概念你要用到的 VBA 能力这一节写给 VBA 初学者。如果已经写过几个宏可以直接跳到第 4 节的完整代码。2.1 Dir 函数遍历文件夹文件Dir是 VBA 里的文件枚举函数功能上类似命令行的ls或dir。第一次调用时传入文件夹路径加通配符后续调用时直接写Dir()Excel 会返回文件夹里匹配的下一个文件名直到全部取完返回空字符串。Dim fileName As String fileName Dir(D:\月度报表\*.xls*) Do While fileName Debug.Print fileName fileName Dir() Loop这段代码会依次打印D:\月度报表下所有的 Excel 文件。*.xls*这个通配符能同时覆盖.xls、.xlsx、.xlsm三种扩展名适合多数场景。2.2 Workbooks.Open打开另一个工作簿打开一个工作簿的写法很简单Dim wb As Workbook Set wb Workbooks.Open(D:\月度报表\a.xlsx, ReadOnly:True, UpdateLinks:0)ReadOnly:True表示以只读方式打开避免因为代码 bug 而改坏源文件UpdateLinks:0表示不更新外部链接减少打开等待时间。2.3 Worksheets(名称)定位同名工作表在一个工作簿里定位指定名称的工作表最直接的方式是Dim ws As Worksheet Set ws wb.Worksheets(明细)如果工作簿里没有“明细”这张表这行代码会抛错误。处理方式是用On Error Resume Next临时跳过错误再判断对象是否为空。2.4 Range.Value 读入二维数组批量读取数据逐个单元格读写在数据量大的时候会很慢更高效的方式是把整个矩形区域一次性读入内存数组处理后再写回目标。Dim dataArr As Variant dataArr ws.Range(A2:E100).ValuedataArr会变成一个二维数组dataArr(1,1)是 A2 单元格的值dataArr(1,5)是 E2 单元格的值。这个技巧是 VBA 处理批量数据的核心也是后面完整代码里的关键。2.5 核心概念对比关注点手动操作VBA 方案文件枚举一个一个打开Dir 函数遍历打开文件双击Workbooks.Open定位工作表鼠标点击标签Worksheets(明细)读取多列CtrlC / CtrlVRange.Value 读入数组防止改错源文件靠操作习惯ReadOnly:True统计结果自己数MsgBox 弹窗反馈3. 环境准备让 Excel 允许运行宏在跑代码之前先解决两个前置问题。3.1 启用“开发工具”选项卡Excel 默认隐藏“开发工具”选项卡。打开“文件 → 选项 → 自定义功能区”在右侧主选项卡中勾选“开发工具”确定后顶部菜单栏就会出现“开发工具”。这一步只需要设置一次。3.2 插入模块并保存为启用宏的工作簿在“开发工具”选项卡里点击“Visual Basic”或者直接按Alt F11打开 VBA 编辑器。在左侧工程资源管理器中找到当前工作簿右键 → 插入 → 模块然后把代码粘贴到模块里。注意包含 VBA 代码的文件必须保存为.xlsm格式。在 Excel 里按Ctrl S文件类型选择“Excel 启用宏的工作簿 (*.xlsm)”。如果保存为普通.xlsxExcel 会直接丢弃代码。3.3 宏安全设置宏运行前需要确认宏没有被禁用。在“文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置”里选择“禁用所有宏并发出通知”或“启用所有宏”。如果你只是自己使用可以启用所有宏如果在公司环境收到他人发来的带宏文件建议保持“禁用所有宏并发出通知”在打开时手动选择“启用内容”。这里要特别提醒不要随意运行来源不明的带宏文档VBA 宏可以执行任意系统命令。本文代码只做数据读取和复制但你在日常工作中要对自己打开的宏负责。3.4 WPS 用户怎么办WPS 表格同样支持 VBA但不同版本差异较大。一部分 WPS 版本内置了 VBA 模块另一部分需要单独安装 VBA for WPS 插件。如果你打开“工具 → 开发工具”时提示“未检测到 Microsoft Excel 的有效版本”或“宏语言支持功能被取消”说明当前 WPS 没有启用 VBA 组件。这种情况下有两种选择一是安装 WPS VBA 模块二是改用 WPS JS 宏。WPS JS 宏是 WPS 新一代的扩展方式语法接近 JavaScript本文的 VBA 示例重点讲思路WPS 用户可以直接参考第 4 节的流程再按 WPS 文档调整为 JS 宏。4. 主方案多文件同名表多列汇总完整代码下面是本文的核心代码。我把它设计成一个可以“复制即用”的脚本。你只需要修改代码顶部的配置区就能适配自己的需求。4.1 先约定数据结构假设源文件的格式如下文件夹路径为D:\月度报表\每个文件里都有一个名为“明细”的工作表“明细”表的第一行是表头第二行开始是数据需要汇总的列是 A 到 E 列也就是第 1 列到第 5 列汇总结果写当前工作簿的“汇总”工作表汇总表需要额外记录每行数据来自哪个文件如果你的列数更多或更少修改START_COL和END_COL两个常量即可。4.2 完整代码复制以下代码到 VBA 模块中 功能多文件同名表多列数据汇总 说明遍历指定文件夹下的所有Excel文件 读取每个文件中“明细”工作表的指定列 追加写入当前工作簿的“汇总”工作表。 使用修改下方配置区后按 F5 运行。 Option Explicit Sub MultiFileSameSheetSummary() ---------- 配置区 ---------- Const SRC_FOLDER As String D:\月度报表\ 源文件夹路径 Const TARGET_SHEET As String 明细 要读取的工作表名称 Const START_ROW As Long 2 数据开始行1表示第1行就是数据 Const START_COL As String A 要汇总的开始列 Const END_COL As String E 要汇总的结束列 Const ADD_FILE_COL As Boolean True 是否在汇总表末尾加“来源文件”列 ------------------------------------------------ Dim folder As String folder SRC_FOLDER If Right(folder, 1) \ Then folder folder \ Dim destWs As Worksheet On Error Resume Next Set destWs
返回列表