Board logo

標題: [發問] 資料庫比對的問題 [打印本頁]

作者: fusayloveme    時間: 2012-3-9 11:18     標題: 資料庫比對的問題

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

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

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


[attach]9922[/attach]
作者: register313    時間: 2012-3-9 14:36

回復 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
複製代碼
[attach]9925[/attach]
作者: fusayloveme    時間: 2012-3-12 09:11

本帖最後由 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大大,筆數的差異的確對我也是很有幫助 ^_^

[attach]9938[/attach]   
[attach]9939[/attach]
作者: fusayloveme    時間: 2012-3-12 16:49

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

回復 2# register313

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

回復 4# fusayloveme

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

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

if sheet1.range("a1").value <> sheet2.range("a1").value then
     sheet3.range("a1").value = "不相同"
endif
作者: fusayloveme    時間: 2012-3-12 17:37

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

回復 5# register313

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

A攔、C攔及E攔的比對,主要是由A攔決定,A攔確認對了才會進行下一步的C攔、E攔及後面欄位的比對,大概是朝向這樣的方向~
作者: fusayloveme    時間: 2012-3-12 17:44

回復 6# mark15jill

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

回復 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
複製代碼
[attach]9950[/attach]
作者: fusayloveme    時間: 2012-3-13 08:45

回復 9# register313

感謝R大的幫忙,衷心的謝謝您 ^_^
作者: mark15jill    時間: 2012-3-13 13:35

回復 8# fusayloveme

附帶一份比較容易的邏輯..

用C資料庫(sheet3) 分別列出相同與不同的判斷
  1. Sub ow()
  2.     Sheets("A資料庫").Select
  3.     Range("a3", "C65535").Select
  4.     Selection.Copy
  5.     Sheets("Sheet3").Select
  6.     Range("m3").Select
  7.     ActiveSheet.Paste
  8.    
  9.     Sheets("B資料庫").Select
  10.     Range("a3", "C65535").Select
  11.     Selection.Copy
  12.     Sheets("Sheet3").Select
  13.     Range("P3").Select
  14.     ActiveSheet.Paste
  15.         Range("A3", "F65535").Value = Range("M3", "R65535").Value
  16.    
  17. If Range("a3").Value <> "" Then
  18.     For xk = 3 To 65536
  19.    
  20.         
  21.         If Range("D" & xk).Value <> Range("A" & xk).Value Then
  22.                         Range("h" & xk).Value = "A欄位  比對失敗"
  23.                         Range("A" & xk).Select
  24.                             With Selection.Interior
  25.                                 .Pattern = xlSolid
  26.                                 .PatternColorIndex = xlAutomatic
  27.                                 .Color = 65535
  28.                                 .TintAndShade = 0
  29.                                 .PatternTintAndShade = 0
  30.                             End With
  31.                         Range("D" & xk).Select
  32.                             With Selection.Interior
  33.                                 .Pattern = xlSolid
  34.                                 .PatternColorIndex = xlAutomatic
  35.                                 .Color = 65535
  36.                                 .TintAndShade = 0
  37.                                 .PatternTintAndShade = 0
  38.                             End With
  39.         End If
  40.         If Range("P" & xk).Value = Range("m" & xk).Value Then
  41.             'Range("H" & XK).Value = "A欄位比對成功"
  42.             Range("A" & xk, "F" & xk).Value = Range("M" & xk, "R" & xk).Value
  43.             If Range("D" & xk).Value = Range("a" & xk).Value Then
  44.                 If Range("E" & xk).Value = Range("b" & xk).Value Then
  45.                     If Range("f" & xk).Value = Range("c" & xk).Value Then
  46.                         Range("h" & xk).Value = "比對成功"
  47.                     End If
  48.                     If Range("f" & xk).Value <> Range("c" & xk).Value Then
  49.                         Range("h" & xk).Value = "C欄位  比對失敗"
  50.                         Range("F" & xk).Select
  51.                             With Selection.Interior
  52.                                 .Pattern = xlSolid
  53.                                 .PatternColorIndex = xlAutomatic
  54.                                 .Color = 65535
  55.                                 .TintAndShade = 0
  56.                                 .PatternTintAndShade = 0
  57.                             End With
  58.                         Range("C" & xk).Select
  59.                             With Selection.Interior
  60.                                 .Pattern = xlSolid
  61.                                 .PatternColorIndex = xlAutomatic
  62.                                 .Color = 65535
  63.                                 .TintAndShade = 0
  64.                                 .PatternTintAndShade = 0
  65.                             End With
  66.                     
  67.                     End If
  68.                 End If
  69.                 If Range("e" & xk).Value <> Range("b" & xk).Value Then
  70.                         Range("h" & xk).Value = "B欄位  比對失敗"
  71.                         Range("E" & xk).Select
  72.                             With Selection.Interior
  73.                                 .Pattern = xlSolid
  74.                                 .PatternColorIndex = xlAutomatic
  75.                                 .Color = 65535
  76.                                 .TintAndShade = 0
  77.                                 .PatternTintAndShade = 0
  78.                             End With
  79.                         Range("B" & xk).Select
  80.                             With Selection.Interior
  81.                                 .Pattern = xlSolid
  82.                                 .PatternColorIndex = xlAutomatic
  83.                                 .Color = 65535
  84.                                 .TintAndShade = 0
  85.                                 .PatternTintAndShade = 0
  86.                             End With
  87.                         
  88.                 End If
  89.             End If
  90.    
  91.         End If
  92.         'If Range("P" & XK).Value <> Range("m" & XK).Value Then
  93.         '    Range("H" & XK).Value = "A欄位  比對失敗"
  94.         '    Range("A" & XK, "F" & XK).Value = Range("M" & XK, "R" & XK).Value
  95.         'End If
  96.    
  97.    
  98.     Next xk
  99. End If
  100.         Columns("M:R").Select
  101.         Range("M2").Activate
  102.         Selection.Delete Shift:=xlToLeft


  103. End Sub
複製代碼
[attach]9965[/attach]
作者: fusayloveme    時間: 2012-3-13 14:27

回復 11# mark15jill

非常感謝!! 晚點來試試看,目前突然接到不小的工作量,晚點來測試看看 ^_^
作者: fusayloveme    時間: 2012-3-15 08:42

回復 11# mark15jill

mark大大,太棒嚕,這個周末有空再來修改一下,有不懂的問題再請教您,非常感謝您 ^_^
作者: mark15jill    時間: 2012-3-15 15:54

回復 13# fusayloveme

不會啦
因為你問的問題
之前我就問過類似的了= ="
只是 我問的比較亂點..
你只是單純 A B 比對..
之前我問的是 A B 比對後 如果 確定是我要的  就從其他檔案內 代入數據
如 AAA.xls 和  BBB.xls 比對後
在CCC.xls 內 代入 甲甲甲.xls的儲存格數據..

這方法適用於  表格資料的轉換
有些原先設定的表格  填入數據後
直接  代入到想要的儲存格內並且去判斷格式是否正確..

或者 從 儲存格 比對後把資料 轉成 我要的型態..+.+




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)