Excel VBA 8.7听说SQL很强大,可以再不打开文件的情况下获取唯一值,有没有兴趣

获取唯一值,听说你喜欢用字典


点击上方“Excel和VBA”,选择“置顶公众号”

致力于原创分享Excel的相关知识,源码,源文件打包提供

一起学习,一起进步~~


前前后后关于获取数据唯一值的方法,我也是分享了有好几种了,不知道小伙伴们有没有中意的呢?其实在分享的过程中,有很多的小伙伴们也是提供了很多不同的方式,今天我在分享一种大家没有提到的方法,SQL方法,接触过数据的小伙伴们一定非常的熟悉SQL了,其实方法有很多种,根据大家自己手上的资源和所掌握的知识的不同,要延伸出来的话,有很多方法,这里我们秉着从VBA的角度出发来学习VBA的前提,尽可能多的丰富大家的处理方法,同时学习一些新的知识

场景说明

这里我们还是利用之前的案例场景,这次我们使用的是SQL方法,可以实现的好处就是再不打开工作表的情况下,就可以将工作表的数据去重并返回结果给我们,当数据比较大的时候,这个方法的好处是非常的明显的。

代码区

为了验证我们并不需要打开原始数据数据,这里我们新建一个新的工作簿。并且将这两个工作簿放在同一个文件夹内部,方面我们的调用的

首先我们来尝试下通过SQL的方法来实现单列数据的唯一值的获取,这里我们来获取姓名列

Sub 单列()Set conn = CreateObject("adodb.connection") Set Rst = CreateObject("ADODB.recordset") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/8-6.xlsm"Dim sql As Stringsql = "Select DISTINCT 姓名 from [sheet1$] "With ActiveSheet.Range("a2:i100") = "" 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 Withconn.CloseSet conn = NothingEnd Sub

很多熟悉SQL的小伙伴们一定会觉得比较的好奇,为什么会有这么多的代码,SQL中获取唯一值只需要简简单单的一句话!

说到底,SQL虽然强大并且快,但是他并不能够直接在VBA中使用,和字典以及其它方式一样,还是需要通过声明,调用的方式来获得。

先来看看效果。

这里我们可以看到,在不需要但单独打开工作表的情况下,我们轻松的实现了姓名列唯一值的获取。

那么假设我们需要的是获取多列的唯一值呢?比方说所有数据的唯一值呢?

Sub sql()Set conn = CreateObject("adodb.connection")Set Rst = CreateObject("ADODB.recordset")conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/8-6.xlsm"Dim sql As Stringsql = "Select DISTINCT * from [sheet1$] "With ActiveSheet.Range("a2:i100") = "" 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 Withconn.CloseSet conn = NothingEnd Sub

从结果来看,我们的数据是非常的完美,并没有任何的问题的。

代码解析

那么我们来看看在VBA中是如何使用SQL的吧,其实只要学会了使用方法,对于SQL很熟悉的小伙伴们就可能够扩展出更多的运用。

Set conn = CreateObject("adodb.connection")Set Rst = CreateObject("ADODB.recordset")

首先老规矩,既然不能直接使用,那么肯定是需要先通过声明告诉系统我现在要调用SQL这个东西的。

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/8-6.xlsm"

既然已经声明了SQL,那么可能就需要有对象了,我们是要之前的8-6的数据源中得到数据的,那么自然要将这两个表链接在一起,如何链接呢?就是上面的代码,

在实际的使用中,大家只需要更改后面的一部分就可以了,即data source=“*******”这一部分的数据,这一部分代表的就是数据源所在位置。

然后就是最重要的SQL语句了

获取唯一值的方法就简单的一句话。

获取姓名列的唯一值

sql = "Select DISTINCT 姓名 from [sheet1$] "

整体所有数据的唯一值

sql = "Select DISTINCT * from [sheet1$] "

因为SQL的方法并不是我们本章节的主体,这里我们就暂时简单的介绍下SQL在VBA中的运用,给大家提供一个思路,一个方法。具体的使用方法以及SQL的各种常用组合,我们会在后面的章节中慢慢张开。

==========================

(0)

相关推荐