Excel VBA 5.22 不打开工作簿也可以合并数据!
一起学习,一起进步~~
要进行工作簿数据的合并,常规操作第一步都是去打开工作簿,这个一点都没有问题
在之前学习工作簿的合并的时候,我们也是经常这样操作,惯用的代码就是workbook.open
但是打开工作簿也有一个弊端,那就是会花费时间去等待工作簿的打开

比方说上面这个图片,你可能要花点时间去等待他的启动,这就会浪费我们不少的时间
如果能够跳过这个过程,那执行整个程序的速度就会快上很多
那么如何跳过呢?
这就是我们今天的重点了
场景说明

这是我们今天的工作场景,我们需要将当前文件夹内所有的工作簿中,姓名为A1的人的成绩全部汇总到一个工作簿中
当然还是在不打开工作簿的前提下来完成的,那么如何实现这样的效果呢
这里我们会接触到一个新知识点,就是SQL
代码区
Sub tssss()Dim sth As Worksheet, sql As StringSet sth = ActiveSheetSet conn = CreateObject("adodb.connection") '创建ado对象Set Rst = CreateObject("ADODB.recordset") '创建记录集pathn = ThisWorkbook.Pathf = Dir(pathn & "\")Do While f <> ""l = Cells(Rows.Count, 1).End(xlUp).RowIf f <> "5-22.xlsm" Then k = k + 1 sql = "Select * from [Sheet1$] Where 姓名= 'A1'" With ActiveSheet conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/" & f Set Rst = conn.Execute(sql) If k = 1 Then For i = 0 To Rst.Fields.Count - 1 .Cells(1, i + 1) = Rst.Fields(i).Name Next i .Cells(2, 1).CopyFromRecordset conn.Execute(sql) Else .Cells(l + 1, 1).CopyFromRecordset conn.Execute(sql) End If End With conn.CloseEnd Iff = Dir()LoopEnd Sub看看效果

可以看到整个过程很快的,屏幕都没有闪动,就已经完成了数据的汇总了。
相较于之前我们看到的通过workbook.open方法来汇总数据,效率提升了很多。
代码解析
那我们来学习下今天的代码
前面我们说了,今天会引入一个新的知识点,就是SQL
相信对于很多小伙伴来说,SQL并不算是太陌生的东西,毕竟很多编程语言都会使用到SQL
让大家感觉到吃惊的,应该就是在VBA中居然可以使用SQL

其实Excel 也是支持SQL的,这点从Excel能够导入数据库文件和关联数据库文件就能够知道,那么进入正题,VBA中如何使用SQL呢?
Set conn = CreateObject("adodb.connection") '创建ado对象 Set Rst = CreateObject("ADODB.recordset") '创建记录集老规矩,你既然在VBA中使用了不属于VBA的东西,那么你肯定要申明一下了,如何申明,就是上面这两个代码
那么SQL最重要的核心是什么呢?SQL语句
sql = "Select * from [Sheet1$] Where 姓名= 'A1'"就是他
和普通的SQL语句并没有太大的差异。
但是这里有两点需要注意
第一点

注意,这里一定要有[],[]里面的名称要和我们要汇总的数据源的工作表的名称保持一致,这一点一定要注意
还有就是工作表的名称后面一定要加上一个$,这一点也不能少,不要SQL语句就没有办法执行了。
第二点

留意A1前后要有引号,代表是一个文本,这一点也不能忽略
有了SQL语句之后,我们还需要告诉SQL一个事情,去哪里执行?执行打开什么样的文件
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/" & f Set Rst = conn.Execute(sql)就是他们两个。虽然看起来比较长,但是也是模块化的东西,直接套用就好
有了这些信息之后就可以执行SQL语句了。
剩下的都是套路的操作啦。
最终将结果写入对应的单元格即可
.Cells(l + 1, 1).CopyFromRecordset conn.Execute(sql)写入的代码就是他
====================
本节课的案例源码已经上传,需要的小伙伴后台私信“5-22”,希望大家多支持~~,多多关注 ~ ~
好了,明晚21:00,准时再见!
因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。
