獲取唯一值,聽(tīng)說(shuō)你喜歡用字典點(diǎn)擊上方“Excel和VBA”,選擇“置頂公眾號(hào)” 致力于原創(chuàng)分享Excel的相關(guān)知識(shí),源碼,源文件打包提供 一起學(xué)習(xí),一起進(jìn)步~~ 前前后后關(guān)于獲取數(shù)據(jù)唯一值的方法,我也是分享了有好幾種了,不知道小伙伴們有沒(méi)有中意的呢?其實(shí)在分享的過(guò)程中,有很多的小伙伴們也是提供了很多不同的方式,今天我在分享一種大家沒(méi)有提到的方法,SQL方法,接觸過(guò)數(shù)據(jù)的小伙伴們一定非常的熟悉SQL了,其實(shí)方法有很多種,根據(jù)大家自己手上的資源和所掌握的知識(shí)的不同,要延伸出來(lái)的話,有很多方法,這里我們秉著從VBA的角度出發(fā)來(lái)學(xué)習(xí)VBA的前提,盡可能多的豐富大家的處理方法,同時(shí)學(xué)習(xí)一些新的知識(shí) 場(chǎng)景說(shuō)明這里我們還是利用之前的案例場(chǎng)景,這次我們使用的是SQL方法,可以實(shí)現(xiàn)的好處就是再不打開(kāi)工作表的情況下,就可以將工作表的數(shù)據(jù)去重并返回結(jié)果給我們,當(dāng)數(shù)據(jù)比較大的時(shí)候,這個(gè)方法的好處是非常的明顯的。 代碼區(qū)為了驗(yàn)證我們并不需要打開(kāi)原始數(shù)據(jù)數(shù)據(jù),這里我們新建一個(gè)新的工作簿。并且將這兩個(gè)工作簿放在同一個(gè)文件夾內(nèi)部,方面我們的調(diào)用的 首先我們來(lái)嘗試下通過(guò)SQL的方法來(lái)實(shí)現(xiàn)單列數(shù)據(jù)的唯一值的獲取,這里我們來(lái)獲取姓名列 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的小伙伴們一定會(huì)覺(jué)得比較的好奇,為什么會(huì)有這么多的代碼,SQL中獲取唯一值只需要簡(jiǎn)簡(jiǎn)單單的一句話! 說(shuō)到底,SQL雖然強(qiáng)大并且快,但是他并不能夠直接在VBA中使用,和字典以及其它方式一樣,還是需要通過(guò)聲明,調(diào)用的方式來(lái)獲得。 先來(lái)看看效果。 這里我們可以看到,在不需要但單獨(dú)打開(kāi)工作表的情況下,我們輕松的實(shí)現(xiàn)了姓名列唯一值的獲取。 那么假設(shè)我們需要的是獲取多列的唯一值呢?比方說(shuō)所有數(shù)據(jù)的唯一值呢? 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 從結(jié)果來(lái)看,我們的數(shù)據(jù)是非常的完美,并沒(méi)有任何的問(wèn)題的。 代碼解析那么我們來(lái)看看在VBA中是如何使用SQL的吧,其實(shí)只要學(xué)會(huì)了使用方法,對(duì)于SQL很熟悉的小伙伴們就可能夠擴(kuò)展出更多的運(yùn)用。 Set conn = CreateObject("adodb.connection") Set Rst = CreateObject("ADODB.recordset") 首先老規(guī)矩,既然不能直接使用,那么肯定是需要先通過(guò)聲明告訴系統(tǒng)我現(xiàn)在要調(diào)用SQL這個(gè)東西的。 conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.Path & "/8-6.xlsm" 既然已經(jīng)聲明了SQL,那么可能就需要有對(duì)象了,我們是要之前的8-6的數(shù)據(jù)源中得到數(shù)據(jù)的,那么自然要將這兩個(gè)表鏈接在一起,如何鏈接呢?就是上面的代碼, 在實(shí)際的使用中,大家只需要更改后面的一部分就可以了,即data source=“*******”這一部分的數(shù)據(jù),這一部分代表的就是數(shù)據(jù)源所在位置。 然后就是最重要的SQL語(yǔ)句了 獲取唯一值的方法就簡(jiǎn)單的一句話。 獲取姓名列的唯一值 sql = "Select DISTINCT 姓名 from [sheet1$] " 整體所有數(shù)據(jù)的唯一值 sql = "Select DISTINCT * from [sheet1$] " 因?yàn)镾QL的方法并不是我們本章節(jié)的主體,這里我們就暫時(shí)簡(jiǎn)單的介紹下SQL在VBA中的運(yùn)用,給大家提供一個(gè)思路,一個(gè)方法。具體的使用方法以及SQL的各種常用組合,我們會(huì)在后面的章節(jié)中慢慢張開(kāi)。 ========================== |
|
來(lái)自: Excel和VBA > 《待分類(lèi)》