前景提要
不打开工作薄如何筛选?结果另外保存起来!
数据查找最快的还是SQL!那VBA能用吗?
SQL+VBA实现不打开工作薄进行筛选和提取,真香
最近一段时间我们都是在分享单元格内容的查找,不管是单元格内容的精确查找,还是单元格内容的模糊查找,也不管是倒序查找还是正序查找,这些查找的前提都是工作薄已经打开的情况下。
随着现在数据量不断的增加,Excel表格的体积也是越来越大,每次打开都需要耽误不少的时间,等打开了工作薄之后,还是进行数据的筛选,在数据量比较大的情况下,数据的筛选也是非常浪费时间的,那么怎么办呢?
所以我们今天来实现一个功能,在不打开工作薄的情况下进行数据筛选
场景说明
这是我们当前的一个模拟的场景,同一个文件夹内有一个测试的excel文件
测试文件内,有打开8000+的数据,我们现在要在不打开这个工作薄的情况下,从这个工作表中进行筛选
从其中筛选出总分这一列大于90的所有人的数据
来看看要如何实现!
代码区
Sub test()
Set conn = CreateObject("adodb.connection")
Set Rst = CreateObject("ADODB.recordset")
Dim sql As String
sql = "Select * from [B班$] Where总分> 90"
With ActiveSheet
.Range("a1:i100") = ""
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/测试.xlsx"
Set Rst = conn.Execute(sql)
For i = 0 To Rst.Fields.Count - 1 '填写标题.Cells(1, i + 1) = Rst.Fields(i).Name
Next i
.Range("a2").CopyFromRecordset conn.Execute(sql)
End With
conn.Close
Set conn = Nothing
End Sub
又是不打开工作薄,又是SQL,说了那么多,但是感觉代码也不是很难,一起来看看效果
直接来看看效果
成功的实现了效果,并且速度还是很快的。
代码解析
从结果上来看,代码成功的实现了在打不开工作薄的情况下,将工作薄中符合条件的数据都筛选出来了,非常的完美。
来看看代码
当我们听到在不打开工作薄的时候,要从工作表中获得数据的话,一般的VBA思路都没有办法实现的。
这个时候我们必须使用SQL
那么在VBA中,要如何使用SQL呢?
Set conn = CreateObject("adodb.connection") '创建ado对象
Set Rst = CreateObject("ADODB.recordset") '创建记录集
这里我们也不需要这两句话的意思,直接理解为,是VBA调用SQL的起手式。
那SQL最重要的是什么呢?
那就是SQL语句了。
我们今天要实现的条件是总分>90
那么如何写呢?
sql = "Select * from [B班$] Where总分> 90"
熟悉SQL的小伙伴可能会觉得,这个SQL和常规的SQL似乎有那么一点点不同。
没错,VBA中SQL的使用是有一点小区别的,或者可以说不同的编程语言针对SQL语句或多或少都会有一点小差异的
这里我们重点理解下这个SQL语句
select * from就是SQL的筛选的意思
从什么地方筛选呢?
另外一个工作博当中工作表名称为B班的工作表中获取数据
所以是Select * from [B班$]
注意,这里的B班后面一定要加上$和[ ]
那么有了筛选的地方,那么筛选条件呢?
where后面跟随的就是筛选条件
非常的简单,好理解。
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/测试.xlsx"
这里也是SQL的另外一个组成部分,他的作用是告诉vba,sql要筛选的文件的位置。
这里我们先简单了解下,这种固定模式的写法,就是从当前文件夹里面找到测试.xlsx这个文件进行筛选。
Set Rst = conn.Execute(sql)
For i = 0 To Rst.Fields.Count - 1 '填写标题
.Cells(1, i + 1) = Rst.Fields(i).Name
Next i
.Range("a2").CopyFromRecordset conn.Execute(sql)
这里后米的这部分也算是固定模式了,大家这里先直接套用就好。
4000520066 欢迎批评指正
All Rights Reserved 新浪公司 版权所有