小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

活用數(shù)組 字典的組合,輕松實現(xiàn)Excel自身沒有的功能

 weimiao 2019-06-15

前景提要

昨天我們分享了在進行數(shù)據(jù)合并的過程中,如何進行去重的操作,這對于小伙伴們?nèi)粘5牟僮魇怯泻艽蟮膸椭模吘笶xcel自帶的重復(fù)項高亮功能也只能針對一列,并且沒有辦法跨工作表,我們可能需要進行多個次去重才能夠得到一個最終的結(jié)果,然后就有小伙伴不淡定了,因為我們的參照列是一列,只有姓名列,如果想要兩列或者多列同時去重呢?

場景簡介

還是上節(jié)的案例,多列去重,我們假設(shè)我們需要滿足的條件是,姓名+班級這兩列數(shù)據(jù)完全相同,才算是同一個數(shù)據(jù)源,只要有一個不同就不算是相同數(shù)據(jù),比方說A15,姓名和班級都是相同的, 我們保留一個就可以了。

第三個表中,雖然C22有兩個,但是班級不同,是不同班級的相同姓名的童鞋,這樣的話,我們是當(dāng)成不同的兩個人

那么在這樣的情況如何實現(xiàn)呢?

代碼區(qū)

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)時再見。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多