Excel·VBA使用ADO合并工作簿

之前文章《Excel·VBA合并工作簿(7,合并子文件夹同名工作簿中同名工作表,纵向汇总数据)》处理合并工作簿问题,代码运行速度比较慢
而《Excel·VBA使用ADO读取工作簿工作表数据》读取数据非常快,那么是否可以使用ADO合并工作簿?

ADO合并子文件夹同名工作簿中同名工作表,纵向汇总数据

注意:合并生成结果表格不带格式,公式都读取为值,仅适用表头行1行,仅测试xlsx格式文件合并

Sub ADO合并子文件夹同名工作簿中同名工作表_纵向汇总数据2()'不打卡工作簿方法;最终合并文件以工作簿名命名,适用工作表格式相同;合并文件A列显示原子文件夹名Dim dict As Object, fso As Object, old_name As Boolean, write_wb As Workbook, s$, s1$, ss$Dim file_path$, save_path$, delimiter$, fd, i&, r&, f, ff, p, ppDim cnn As Object, rs As Object, ex As Object, sqlstr$, fp$, ws, wss
'--------------------参数填写:file_path = "E:\测试\拆分表\合并工作簿7\"  'file_path待合并的子文件夹所在文件夹save_path = file_path + "合并表\"   '合并后的表格保存路径old_name = True    '写入原子文件夹名,是/否Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息Set dict = CreateObject("scripting.dictionary"): delimiter = Chr(28)Set fso = CreateObject("Scripting.FileSystemObject"): tm = TimerIf fso.FolderExists(save_path) Then Debug.Print "保存文件夹已存在,会导致错误,请删除": Exit SubFor Each f In fso.GetFolder(file_path).SubFolders  '获取所有子文件夹名s = s & delimiter & f.NameNextfd = Split(Mid(s, 2), delimiter)If Not fso.FolderExists(save_path) Then fso.CreateFolder (save_path)  '创建文件夹Set cnn = CreateObject("ADODB.Connection"): Set rs = CreateObject("ADODB.Recordset")For Each p In fdFor Each f In fso.GetFolder(file_path & p).Files  '空文件夹不影响If f.Name Like "*.xlsx" And Not dict.Exists(f.Name) Thens = f.Name: Set dict(s) = CreateObject("scripting.dictionary")Set write_wb = Workbooks.Add  '新建工作簿,合并文件For Each pp In fd  '遍历所有子文件夹同名工作簿For Each ff In fso.GetFolder(file_path & pp).FilesIf ff.Name = s Thenfp = file_path & pp & "\" & s  '文件名含路径cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended properties='Excel 12.0 Xml;Hdr=yes;IMEX=1';data source=" & fpSet rs = cnn.OpenSchema(20): ss = ""Do Until rs.EOF  '获取所有工作表名称If rs.Fields("TABLE_TYPE") = "TABLE" Thens1 = Replace(rs("TABLE_NAME").Value, "'", "")If Right(s1, 1) = "$" Then s1 = Left(s1, Len(s1) - 1): ss = ss & delimiter & s1End Ifrs.MoveNextLooprs.Close: wss = Split(Mid(ss, 2), delimiter)  '工作表名称数组For Each ws In wss  '遍历工作表获取数据,并写入sqlstr = "SELECT * FROM [" & ws & "$]"Set ex = cnn.Execute(sqlstr)If Not dict(s).Exists(ws) Then  '工作表不存在dict(s)(ws) = "": i = 0: ReDim trr(1 To ex.Fields.Count)For Each x In ex.Fields  '表头i = i + 1: trr(i) = x.NameNextwrite_wb.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = ws  '最后添加新sheet,并命名With write_wb.Worksheets(ws).[b1].Resize(1, UBound(trr)) = trr.[b2].CopyFromRecordset ex.[a1] = "子文件夹": .[a2].Resize(.[b1].End(xlDown).row - 1, 1) = ppEnd WithElseWith write_wb.Worksheets(ws)r = .UsedRange.Rows.Count + 1.Cells(r, 2).CopyFromRecordset ex.Cells(r, 1).Resize(.[b1].End(xlDown).row - r + 1, 1) = ppEnd WithEnd IfNextcnn.CloseEnd IfNextNextwrite_wb.Worksheets(1).Delete  'excel新建wb第1个ws为空表If Not old_name Then  '无需写入原子文件夹名For Each sht In write_wb.Worksheetssht.Columns("a:a").DeleteNextEnd Ifwrite_wb.SaveAs filename:=save_path & swrite_wb.Close (False)End IfNextNextSet rs = Nothing: Set cnn = NothingApplication.ScreenUpdating = True: Application.DisplayAlerts = TrueDebug.Print "文件夹合并完成,用时:" & Format(Timer - tm, "0.00")
End Sub

举例,并与“合并工作簿7”对比

合并与 “合并工作簿7” 举例中同样的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
共有12个文件夹60个工作簿180个工作表,合并后
在这里插入图片描述
在这里插入图片描述
运行速度对比

代码版本合并工作簿7.1合并工作簿7.2ADO合并工作簿
耗时秒数40-6022.5-295.77-6.76

相比 合并工作簿7.2 使用ADO代码行数更少,同时运行速度提升了数倍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/131856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Websocket获取B站直播间弹幕教程——第二篇、解包/拆包

教程一、Websocket获取B站直播间弹幕教程 — 哔哩哔哩直播开放平台 1、封包 我们连接上B站Websocket成功后,要做两件事情: 第一、发送鉴权包。第二、发送心跳包,每30秒一次,维持websocket连接。 这两个包不是直接发送过去&…

scratch保护环境 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析

目录 scratch保护环境 一、题目要求 1、准备工作 2、功能实现 二、案例分析

STM32 Cube项目实战开发过程中--调用Freemodbus通信出现异常问题原因分析--ADC DMA初始化顺序导致串口数据异常问题解决办法

文章目录 1.ADC与DMA初始化顺序导致使用Freemodbus串口通信异常:2.通信异常时串口初始化的顺序为:3.重新调整初始化位置后,通信问题解决:5.重新调整初始化位置后,通信正常:总结:Cube开发库系统默…

文件上传 [MRCTF2020]你传你呢1

题目来源:buuctf [MRCTF2020]你传你🐎呢1 打开题目 我们随便上传个木马文件上去 我们bp抓包看看

Qt中常用容器组控件介绍和实操

目录 常用容器组控件(Containers): 1.Group Box 2.Scroll Area 3.Tab Widget 4.Frame 5.Dock Widget 常用容器组控件(Containers): 控件名称依次解释如下(常用的用红色标出): Group Box: 组合框: 提供带有标题的组合框框架Scroll Area…

基于YOLO算法的单目相机2D测量(工件尺寸和物体尺寸)

1.简介 1.1 2D测量技术 基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。 工业制造:在工业制造过程中,精确测量是确保产品质量和一致性的关键。基于单目相机的2D测量技术可以用于检测和测量零件尺寸、位置、形状等参数,进而实…

docker搭建rocketmq集群

单机搭建 1 拉取rocketMq镜像 docker pull rocketmqinc/rocketmq:4.3.2 2 创建挂在目录 mkdir -p /mydata/rocketmq/data/namesrv/logs /mydata/rocketmq/data/namesrv/store mkdir -p /mydata/rocketmq/data/broker/logs /mydata/rocketmq/data/broker/store mkd…

华为云云耀云服务器L实例评测|华为云上的CentOS性能监测与调优指南

目录 引言 ​编辑1 性能调优的基本要素 2 性能监控功能 2.1 监控数据指标 2.2 数据历史记录 2.3 多种统计指标 3 性能优化策略 3.1 资源分配 3.2 磁盘性能优化 3.3 网络性能优化 3.4 操作系统参数和内核优化 结论 引言 在云计算时代,性能优化和调优对于…

排序算法-快速排序法(QuickSort)

排序算法-快速排序法(QuickSort) 1、说明 快速排序法是由C.A.R.Hoare提出来的。快速排序法又称分割交换排序法,是目前公认的最佳排序法,也是使用分而治之(Divide and Conquer)的方式,会先在数…

IDEA插件版本升级和兼容新版本idea

1.关于IDEA插件的版本设置问题 打开jetbrains插件市场,随意打开一个插件详情页面的Versions菜单,我们可以看见一个插件包不同时期发布的不同版本(Versions),并且每个版本包含了可兼容IDEA或PyCharm的版本范围&#xf…

【面试经典150 | 哈希表】有效的字母异位词

文章目录 写在前面Tag题目来源题目解读解题思路方法一:排序方法二:哈希数组 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于…

Python:如何在一个月内学会爬取大规模数据

Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得…