標題:
[發問]
資料庫比對的問題
[打印本頁]
作者:
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
Sub xx()
Sheets("A資料庫").Select
Set SourceA = Sheets("A資料庫").Range([A2], [A65536].End(xlUp))
Sheets("B資料庫").Select
Set SourceB = Sheets("B資料庫").Range([A2], [A65536].End(xlUp))
For Each A In SourceA
X = Application.CountIf(SourceB, A) - Application.CountIf(SourceA, A)
If X <> 0 Then
Set RFind = Columns("E").Find(A, , , xlWhole)
If RFind Is Nothing Then
[E65536].End(xlUp).Offset(1, 0) = A
[E65536].End(xlUp).Offset(0, 1) = X
End If
End If
Next A
For Each B In SourceB
X = Application.CountIf(SourceB, B) - Application.CountIf(SourceA, B)
If X <> 0 Then
Set RFind = Columns("E").Find(B, , , xlWhole)
If RFind Is Nothing Then
[E65536].End(xlUp).Offset(1, 0) = B
[E65536].End(xlUp).Offset(0, 1) = X
End If
End If
Next B
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欄位沒有重覆值
Sub xx()
Sheets("比對結果").[A2:D65536] = ""
Sheets("A資料庫").Activate
Set SourceA = Sheets("A資料庫").Range([A2], [A65536].End(xlUp))
Sheets("B資料庫").Activate
Set SourceB = Sheets("B資料庫").Range([A2], [A65536].End(xlUp))
Sheets("比對結果").Activate
Sheets("比對結果").[A2:D65536] = ""
For Each A In SourceA
X = Application.CountIf(SourceB, A) - Application.CountIf(SourceA, A)
If X = 0 Then
Sheets("比對結果").[C65536].End(xlUp).Offset(1, 0) = A
Else
Sheets("比對結果").[B65536].End(xlUp).Offset(1, 0) = A
End If
Next A
For Each B In SourceB
X = Application.CountIf(SourceB, B) - Application.CountIf(SourceA, B)
If X = 1 Then
Sheets("比對結果").[A65536].End(xlUp).Offset(1, 0) = B
End If
Next B
End Sub
複製代碼
[attach]9950[/attach]
作者:
fusayloveme
時間:
2012-3-13 08:45
回復
9#
register313
感謝R大的幫忙,衷心的謝謝您 ^_^
作者:
mark15jill
時間:
2012-3-13 13:35
回復
8#
fusayloveme
附帶一份比較容易的邏輯..
用C資料庫(sheet3) 分別列出相同與不同的判斷
Sub ow()
Sheets("A資料庫").Select
Range("a3", "C65535").Select
Selection.Copy
Sheets("Sheet3").Select
Range("m3").Select
ActiveSheet.Paste
Sheets("B資料庫").Select
Range("a3", "C65535").Select
Selection.Copy
Sheets("Sheet3").Select
Range("P3").Select
ActiveSheet.Paste
Range("A3", "F65535").Value = Range("M3", "R65535").Value
If Range("a3").Value <> "" Then
For xk = 3 To 65536
If Range("D" & xk).Value <> Range("A" & xk).Value Then
Range("h" & xk).Value = "A欄位 比對失敗"
Range("A" & xk).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("D" & xk).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
If Range("P" & xk).Value = Range("m" & xk).Value Then
'Range("H" & XK).Value = "A欄位比對成功"
Range("A" & xk, "F" & xk).Value = Range("M" & xk, "R" & xk).Value
If Range("D" & xk).Value = Range("a" & xk).Value Then
If Range("E" & xk).Value = Range("b" & xk).Value Then
If Range("f" & xk).Value = Range("c" & xk).Value Then
Range("h" & xk).Value = "比對成功"
End If
If Range("f" & xk).Value <> Range("c" & xk).Value Then
Range("h" & xk).Value = "C欄位 比對失敗"
Range("F" & xk).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("C" & xk).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
End If
If Range("e" & xk).Value <> Range("b" & xk).Value Then
Range("h" & xk).Value = "B欄位 比對失敗"
Range("E" & xk).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("B" & xk).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
End If
End If
'If Range("P" & XK).Value <> Range("m" & XK).Value Then
' Range("H" & XK).Value = "A欄位 比對失敗"
' Range("A" & XK, "F" & XK).Value = Range("M" & XK, "R" & XK).Value
'End If
Next xk
End If
Columns("M:R").Select
Range("M2").Activate
Selection.Delete Shift:=xlToLeft
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/)