Excel VBA 8.50 SQL+VBA实现不打开工作薄进行筛选和提取

Excel VBA 8.50 SQL+VBA实现不打开工作薄进行筛选和提取
2021年05月14日 11:00 晓雯子16

前景提要

不打开工作薄如何筛选?结果另外保存起来!

数据查找最快的还是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)

这里后米的这部分也算是固定模式了,大家这里先直接套用就好。

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部