VBA 字典與陣列實現去重

2021-10-11 10:27:19 字數 2947 閱讀 5252

在實際操作中有太多的資料需要去重僅保留一條記錄,在這裡自己寫了兩個函式,測試ok,需要可以自己稍微改動就可以使用啦。

1.兩個資料來源合併,僅取第一次出現的資料,具體**如下,因為注釋比較詳細,在這裡就不過多的說明,需要注意一點的是,我這裡使用的資料,去重列是第二列,所以我將字典轉換成陣列時,是將陣列的第2列等於字典的key值,為保持資料結構一致,方便迴圈操作。

'合併去重,將資料來源1和資料來源2合併去重儲存在陣列裡,arr0是用來指定去重列和保留列,使用時僅限在兩個陣列結構一致的情況下使用。

function totals(arr1, arr2, arr0)

'定義字典,使用字典去重

dim a1 as object

set a1 = createobject("scripting.dictionary")

'如果資料來源1有重複的資料,僅保留第1項

for i = 1 to ubound(arr1, 1)

if a1.exists(arr1(i, arr0(0))) then

else

'將所需保留的字段組合成陣列保留在字典的key值中,可按需改寫

a1(arr1(i, arr0(0))) = array(arr1(i, arr0(1)), arr1(i, arr0(2)))

end if

next i

'將在資料來源1出現過的資料刪除,僅保留不重複的部分

for i = 1 to ubound(arr2, 1)

if a1.exists(arr2(i, arr0(0))) then

else

a1(arr2(i, arr0(0))) = array(arr2(i, arr0(1)), arr2(i, arr0(2)))

end if

next i

'將字典轉換成陣列,可按需改寫

dim sumarr()

i = 1

redim sumarr(1 to a1.count, 1 to 3)

for each k in a1.keys

sumarr(i, 2) = k

sumarr(i, 1) = a1(k)(0)

sumarr(i, 3) = a1(k)(1)

i = 1 + i

next k

totals = sumarr

end function

2.將歷史資料去除,這裡是將資料來源2作為歷史資料,邏輯與第乙個合併去重的函式類似,在這裡就不做過多的說明

'去重保留,僅保留資料來源1,且不在資料來源2的資料,即去除資料來源2的資料

function afterdelete(arr1, arr2, arr0)

dim a1 as object

set a1 = createobject("scripting.dictionary")

for i = 1 to ubound(arr1, 1)

if a1.exists(arr1(i, arr0(0))) then

else

a1(arr1(i, arr0(0))) = array(arr1(i, arr0(1)), arr1(i, arr0(2)))

end if

next i

for i = 1 to ubound(arr2, 1)

if a1.exists(arr2(i, arr0(0))) then

a1.remove (arr2(i, arr0(0)))

else

end if

next i

'將字典轉換成陣列,這裡的陣列保持與原陣列結構一致

dim delete()

i = 1

redim delete(1 to a1.count, 1 to 3)

for each k in a1.keys

delete(i, 2) = k

delete(i, 1) = a1(k)(0)

delete(i, 3) = a1(k)(1)

i = 1 + i

next k

afterdelete = delete

end function

3.這是具體實現的過程

sub test()

'將需要去重合併的資料來源轉換成陣列

dim book0 as workbook

set book0 = thisworkbook

dim w1 as worksheet

dim arr11

set w1 = book0.worksheets(1)

arr11 = w1.usedrange

dim w2 as worksheet

dim arr12

set w2 = book0.worksheets(2)

arr12 = w2.usedrange

dim sumall

'將需要去重的列和需要保留的列號儲存在陣列裡面,方便後續操作,這裡的去重列是第2列,保留列是第1,3列

dim arr0()

arr0 = array(2, 1, 3)

'這部分若有多個陣列,可用迴圈來實現

sumall = totals(arr11, arr12, arr0)

dim dill

dill = afterdelete(arr11, arr12, arr0)

'將結果輸出到工作表中

dim w0 as worksheet

set w0 = book0.worksheets.add

w0.name = "彙總"

dim r0 as range

set r0 = w0.cells(1, 1)

r0.resize(ubound(sumall, 1), ubound(sumall, 2)) = sumall

end sub

vba 字典 VBA字典排重Exists

e1 不重複資料 range e2 resize ubound mys 1 mys set mydic nothing end sub 解析 1 上述過程實現了從a列資料中提取出只出現一次的資料。將資料裝入陣列myarr,將陣列資料裝入字典mydic,同時為了區分哪個是只出現一次的資料,用了 作為重...

陣列去重實現

let arr 1,2,3,4,5,1,2,3,4,5 let a new set arr console.log a let arr 1,2,3,4,5,1,2,3,4,5 let a arr.foreach item,index,arr console.log a 思路 1 建立乙個新的陣列存放...

JS實現陣列去重

方法一,利用物件屬性不能相同的方法進行去重 array.prototype.distinct function result len arr.length for i 0 i arr.length i return result var a 1,2,3,4,5,6,5,3,2,4,56,4,1,2,...