例項需求:日常工作中經常需要對比資料,例如如下的參會名單,現在需要對比兩屆參會名單的異同,100個人的名單,看得老眼昏花也未必能夠準確的找出差異。
strcompare = "減少:" & trim(strremove) & vbnewline & "新增:" & trim(stradd)
endfunction
sub demo(
) msgbox strcompare(range(
"a2:d26"
), range(
"f2:i26"))
,, "對比結果"
endsub
【**解析】
資料中可能存在重複,那麼首先要進行排重,然後再進行對比,資料去重那麼非字典莫屬。
自定義函式有兩個引數,分別對應於需要對比的兩個資料區域,二者形狀可以相同,也可以不同。
第4和5行**建立兩個字段物件,分布儲存兩個資料清單。
第6~11行**使用for each迴圈,將資料分布載入到字典物件中,實現去重。
第12~14行**查詢存在於第乙個資料區域中,但是第二個資料區域中不存在的名單。
第15~17行**查詢存在於第二個資料區域中,但是第以個資料區域中不存在的名單。
第18和19行**是否物件變數占用的系統資源。
第20行**設定自定義函式返回值。
第23行**呼叫自定義函式,其結果如下。
第12~17行**使用兩個迴圈結構分別提取「減少」和「新增」的人員名單,其實可以簡化如下。
function strcompare(
byval rng1 as range,
byval rng2 as range)
asstring
dim strremove as
string
, stradd as
string
, strkey
dim currdic, newdic, c
set currdic = createobject(
"scripting.dictionary"
)set newdic = createobject(
"scripting.dictionary"
)for each c in rng1
currdic(c.value)=""
next c
for each c in rng2
newdic(c.value)=""
next c
for each strkey in currdic.keys
ifnot newdic.exists(strkey)
then
strremove = strremove &
" "& strkey
else
newdic.remove strkey
endifnext strkey
strcompare = "減少:" & trim(strremove) & vbnewline & "新增:" & join(newdic.keys)
set currdic =
nothing
set newdic =
nothing
endfunction
如果currdic中的鍵值存在於newdic中,那麼將移除該鍵值,否則就追加到「減少」人員名單中,這樣只需要乙個迴圈就可以提取兩個人員名單了。
當然設定函式返回值的語句也需要變更一點,使用join(newdic.keys)
生成「新增」人員名單。
枯燥的重複勞動交給vba來實現,肯定沒問題。
C 快速對比資料
1.相同列對比 var data1 dt1.asenumerable except dt2.asenumerable datarowcomparer.default 差集 篩選不一樣的資料返回對比的資料 如需顯示被對比資料則把被對比的資料放到前面替換位置 var data2 dt1.asenumer...
MySQL 如何快速對比資料
在mysql運維中,研發同事想對比下兩個不同例項上的資料並找出差異,除主鍵外還需要對比每乙個字段,如何做呢?第一種方案,寫程式將兩個例項上的每一行資料取出來進行對比,理論可行,但是對比時間較長。第二種方案,對每一行資料所有字段合併起來,取checksum值,再按照checksum值對比,看著可行,嘗...
MySQL 如何快速對比資料?
我們在mysql中想要對比下兩個不同的例項上的資料並且找出差異,除了主鍵之外我們還要對比每乙個字段,應該怎麼做呢?方案一 寫乙個程式將兩個例項裡面的每一行資料都分別取出來對比,但是耗時我們無法估計,大概天荒地老吧。方案二 對每一行資料所有字段合併起來,取checksum值,再按照checksum值對...