返回列表 上一主題 發帖

[發問] 資料庫比對的問題

[發問] 資料庫比對的問題

各位大大,我想請問一下,若是我有A跟B資料庫,假設我想判斷B資料庫中的A欄位(以A資料庫為主),
少了哪些或者多了哪些資訊,以此類推,在A資料庫中的B欄位C欄位,請問我該如何解決這樣的問題呢!?

附上EXCEL檔,若是可以希望能夠用ACCESS解決或者使用巨集

目前知道的笨方法就是先依照遞增或遞減排序,貼到EXCEL後在加上函數判斷兩筆資料的各個欄位,但我相信電腦一定有更快的方式 ^^",先謝謝各位高手 ^_^


A與B資料庫.rar (29.54 KB)

回復 1# fusayloveme
  1. Sub xx()
  2. Sheets("A資料庫").Select
  3. Set SourceA = Sheets("A資料庫").Range([A2], [A65536].End(xlUp))
  4. Sheets("B資料庫").Select
  5. Set SourceB = Sheets("B資料庫").Range([A2], [A65536].End(xlUp))
  6. For Each A In SourceA
  7.   X = Application.CountIf(SourceB, A) - Application.CountIf(SourceA, A)
  8.   If X <> 0 Then
  9.      Set RFind = Columns("E").Find(A, , , xlWhole)
  10.      If RFind Is Nothing Then
  11.        [E65536].End(xlUp).Offset(1, 0) = A
  12.        [E65536].End(xlUp).Offset(0, 1) = X
  13.      End If
  14.   End If
  15. Next A
  16. For Each B In SourceB
  17.   X = Application.CountIf(SourceB, B) - Application.CountIf(SourceA, B)
  18.   If X <> 0 Then
  19.      Set RFind = Columns("E").Find(B, , , xlWhole)
  20.      If RFind Is Nothing Then
  21.        [E65536].End(xlUp).Offset(1, 0) = B
  22.        [E65536].End(xlUp).Offset(0, 1) = X
  23.      End If
  24.   End If
  25. Next B
  26. End Sub
複製代碼

TOP

本帖最後由 fusayloveme 於 2012-3-12 09:13 編輯

回復 2# register313

先謝謝register313大大 ^_^,因為小弟我表達的可能不清楚,我將我的結果如EXCEL顯示,大概是這樣,有A與B資料庫(以A資料庫為母體),
但我需要將A跟B資料庫不同的地方比對出來,將結果分為A資料庫缺少、B資料庫缺少、A與B資料庫都有的以及A與B資料庫都缺少的,
這四種型式,結果如我EXCEL內容所示,另外若再[ControlNO]這個欄位,一開始與A資料庫(母體)有出入,意思就是有錯誤的話,
則一整列都是錯的(如我所標示的黃色方塊),基本方向大概是這樣,不曉得是否能利用VBA做到呢,網路上有下載一個與我想法接近的巨集,
提供給register313大大以及各位大大參考。

謝謝register313大大,筆數的差異的確對我也是很有幫助 ^_^

A與B資料庫範例.rar (10.56 KB)    
資料比對範例.rar (570.18 KB)

TOP

本帖最後由 fusayloveme 於 2012-3-12 17:45 編輯

回復 2# register313

不好意思~另外在補充一下,提供的那個資料比對巨集檔案,較無法適用的原因是,欄位不同,他則會判定是為不符合,
但實際上可能只是在B資料庫內插入一行或者少一行,就導致此情況發生,不曉得利用VBA的一些語法能否避免如此情況發生呢,就是如果能夠不看排列順序,
但A攔、C攔、E攔如果錯誤,則整列錯誤,不曉得能否依照這樣的方式進行判定呢!? 謝謝。

TOP

回復 4# fusayloveme

其實一開始就覺得題目怪怪的(或者說你沒把題目,功能講清楚;或者說我理解能力不夠,沒把你的說明弄清楚)
1.A資料庫,B資料庫是否只比對A欄位(ControlNO)?
  若是:A欄位(ControlNO)下的內容有重覆的,那要如何比對?  這就是我一開始只比對數量差異的原因
  若否:除A欄位外,應把B欄位C欄位呈現出來
2.你3F,4F所講的我也不了解意思

TOP

我的作法
新創 資料庫  C
以A資料庫為主  去比對 B資料庫
用循環的方式

if sheet1.range("a1").value <> sheet2.range("a1").value then
     sheet3.range("a1").value = "不相同"
endif

TOP

本帖最後由 fusayloveme 於 2012-3-12 17:46 編輯

回復 5# register313

我能理解您的意思,當初也是在想因為兩筆資料沒有唯一性,所以無法去比對,只利用共通性比對的話,條件不足夠讓比對成立,
這也是我目前在做關聯資料庫的困擾,不過,還是想請問大大,若假設[ControlNO]的情況是唯一性的話,有辦法像我3F所提供的
"A與B資料庫範例"這樣做出來嗎? 謝謝大大的熱心 ^_^

A攔、C攔及E攔的比對,主要是由A攔決定,A攔確認對了才會進行下一步的C攔、E攔及後面欄位的比對,大概是朝向這樣的方向~

TOP

回復 6# mark15jill

先謝謝大大的熱心 ^_^,由於可能會有重覆的,所以判斷條件可能要再謹慎,讓其判斷的特性成為唯一,這樣比對會比較有意義,否則就如同二樓R大所說
會無法比對,因為可能A資料庫內的EXXXXX,但B資料庫內同時有五筆EXXXXX,所以比對後,無法互相比對,導致全部為不符合,反之A資料若筆數較少也會發生類似情況,
所以最好的辦法先找出其唯一性,做為比對的先決條件比較好,這是我最近在做資料庫的心得,感覺上還是被打回原形>< 哀

TOP

回復 7# fusayloveme
A資料庫(B資料庫)之A欄位沒有重覆值
  1. Sub xx()
  2. Sheets("比對結果").[A2:D65536] = ""
  3. Sheets("A資料庫").Activate
  4. Set SourceA = Sheets("A資料庫").Range([A2], [A65536].End(xlUp))
  5. Sheets("B資料庫").Activate
  6. Set SourceB = Sheets("B資料庫").Range([A2], [A65536].End(xlUp))
  7. Sheets("比對結果").Activate
  8. Sheets("比對結果").[A2:D65536] = ""
  9. For Each A In SourceA
  10.   X = Application.CountIf(SourceB, A) - Application.CountIf(SourceA, A)
  11.   If X = 0 Then
  12.      Sheets("比對結果").[C65536].End(xlUp).Offset(1, 0) = A
  13.   Else
  14.      Sheets("比對結果").[B65536].End(xlUp).Offset(1, 0) = A
  15.   End If
  16. Next A
  17. For Each B In SourceB
  18.   X = Application.CountIf(SourceB, B) - Application.CountIf(SourceA, B)
  19.   If X = 1 Then
  20.      Sheets("比對結果").[A65536].End(xlUp).Offset(1, 0) = B
  21.   End If
  22. Next B
  23. End Sub
複製代碼

TOP

回復 9# register313

感謝R大的幫忙,衷心的謝謝您 ^_^

TOP

        靜思自在 : 屋寬不如心寬。
返回列表 上一主題