VBA和SQL相結合,感覺走上了數據處理的巔峰之路

2019-08-26     VBA雜談

前景提要(文末提供源碼下載)

前前後後關於獲取數據唯一值的方法,我也是分享了有好幾種了,不知道小夥伴們有沒有中意的呢?其實在分享的過程中,有很多的小夥伴們也是提供了很多不同的方式,今天我在分享一種大家沒有提到的方法,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 String
sql = "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 With
conn.Close
Set conn = Nothing
End 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 String
sql = "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 With
conn.Close
Set conn = Nothing
End 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的各種常用組合,我們會在後面的章節中慢慢張開。

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

本節課的案例源碼已經上傳,需要的小夥伴請按照如下步驟操作,一個不能少哦~~

1.轉發下本文章(算是對我的小小支持吧~)

2. 點我頭像加個關注~

3.後台私信「8-7-7」

希望大家多支持~~,多多關注 ~ ~

好了,明晚19:00,準時再見!

文章來源: https://twgreatdaily.com/zh-cn/HQzg6WwBJleJMoPMuYT3.html