前景提要(文末提供源碼下載)
前前後後關於獲取數據唯一值的方法,我也是分享了有好幾種了,不知道小夥伴們有沒有中意的呢?其實在分享的過程中,有很多的小夥伴們也是提供了很多不同的方式,今天我在分享一種大家沒有提到的方法,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,準時再見!