在實際操作中有太多的資料需要去重僅保留一條記錄,在這裡自己寫了兩個函式,測試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,...