昨天我們分享了在進行數(shù)據(jù)合并的過程中,如何進行去重的操作,這對于小伙伴們?nèi)粘5牟僮魇怯泻艽蟮膸椭模吘笶xcel自帶的重復(fù)項高亮功能也只能針對一列,并且沒有辦法跨工作表,我們可能需要進行多個次去重才能夠得到一個最終的結(jié)果,然后就有小伙伴不淡定了,因為我們的參照列是一列,只有姓名列,如果想要兩列或者多列同時去重呢?
還是上節(jié)的案例,多列去重,我們假設(shè)我們需要滿足的條件是,姓名+班級這兩列數(shù)據(jù)完全相同,才算是同一個數(shù)據(jù)源,只要有一個不同就不算是相同數(shù)據(jù),比方說A15,姓名和班級都是相同的, 我們保留一個就可以了。 第三個表中,雖然C22有兩個,但是班級不同,是不同班級的相同姓名的童鞋,這樣的話,我們是當(dāng)成不同的兩個人 那么在這樣的情況如何實現(xiàn)呢?
Sub TEST()Dim sth As Worksheet, rng As Range, zd As Object, a As Range, arr, arr1()Set rng = Application.InputBox('請選擇參照列', '參照列的選擇', , , , , , 8)Set zd = CreateObject('scripting.dictionary')colnum = rng.Columncolnums = rng.Columns.Countk = 0For Each sth In Worksheets sth.Activate rl = sth.Cells(Rows.Count, 1).End(xlUp).Row cl = sth.Cells(1, Columns.Count).End(xlToLeft).Column arr = sth.Range(Cells(1, colnum), Cells(rl, cl)) For i = 1 To UBound(arr) s = arr(i, 1) & '-' & arr(i, 2)'想要多列的話,就改這里 If Not zd.Exists(s) Then k = k + 1 zd(s) = k ReDim Preserve arr1(1 To cl, 1 To k) For i1 = 1 To cl arr1(i1, k) = arr(i, i1) Next i1 End If Next iNext sthWorksheets.AddActiveSheet.Name = '去重版名單'ActiveSheet.Cells(1, 1).Resize(k, UBound(arr1)) = WorksheetFunction.Transpose(arr1)End Sub 好像代碼并沒有太大的變化,來看看效果 首先依然是選擇參照列,這里的參照列我們是選擇兩列 然后就可以去喝口茶了。 看結(jié)果 出來了,我們來驗證下上面幾個人員的情況 A15 只保留了一個,符合我們的要求,因為他的姓名和班級是相同的 C22保留了兩個數(shù)據(jù),因為雖然姓名相同,但是班級不同,在本案例中是不同的人 完美
雖然今天的代碼看起來比較的簡單,和上節(jié)的情況似乎差不多,其實思路也是一樣的,利用字典的唯一性,但是邏輯上要稍微費點腦細(xì)胞理解下 我們從進入每個工作表的循環(huán)開始說起 rl = sth.Cells(Rows.Count, 1).End(xlUp).Rowcl = sth.Cells(1, Columns.Count).End(xlToLeft).Columnarr = sth.Range(Cells(1, colnum), Cells(rl, cl)) 現(xiàn)貨區(qū)當(dāng)前工作表的區(qū)域,然后將它賦值給數(shù)組arr,這里我們?yōu)槭裁床恢苯佑胾sedrange呢?因為我們后面會使用到rl,cl這兩個變量、 然后進入今天的重點(劃重點了) 既然我們這里要進行多列去重,那么就等于將多列作為一個整體,將這多列數(shù)據(jù)當(dāng)成一列,因為我們這里是兩列,我們就將這兩列的內(nèi)容合起來復(fù)制給一個變量s s = arr(i, 1) & '-' & arr(i, 2) 我們運行下看看是什么效果 看圖大家應(yīng)該能夠看出來了,就是講第一列和第二列通過連接符“-”聯(lián)系在一起,作為一個整體,我們通過判斷這個整體在字段中是否存在作為參考標(biāo)準(zhǔn)。 如果存在跳過,如果不存在,就利用數(shù)組將所有的數(shù)據(jù)裝進數(shù)組中 本案例我們將所有的數(shù)據(jù)都匯總起來,這里就是利用動態(tài)數(shù)據(jù)的方式來進行了。 因為已經(jīng)確定了列數(shù),cl,所以動態(tài)數(shù)組就很好處理了。 ReDim Preserve arr1(1 To cl, 1 To k) 因為數(shù)據(jù)比較多,我們不可能和之前一樣一個個去賦值,這樣不科學(xué),也不規(guī)范,這里我們再利用循環(huán)的方式將數(shù)組賦值 For i1 = 1 To cl arr1(i1, k) = arr(i, i1) Next i1 看看效果圖 其實就是通過循環(huán)的方式將每個數(shù)據(jù)放到數(shù)組中了,避免了之前一個一個寫的煩惱 看看重復(fù)數(shù)據(jù),A15,這里我們已經(jīng)來到第二個表了,A15這個位置,這時候的S=“A15-高三1班”,字典中也存在這個值了,所以是直接跳過的 而C22,因為班級不同,所以s并不同,故依然還是會進行如數(shù)組的循環(huán),不斷的裝數(shù)據(jù) 怎么樣,這樣分步講解,大家是否能夠理解呢? VBA中兩大得力助手,字典和數(shù)組都在本節(jié)出現(xiàn)了,快來一起學(xué)習(xí)吧 好了~明晚19:00,準(zhǔn)時再見。 |
|