2012-02-05 54 views
0

我想找創建宏按鈕來比較在Excel列A和列B,與任何差異塔中列出的差C.VBA宏比較在Excel列,並顯示在第三塔

  • 我想在一個不在B中的所有值以顯示用C
  • 我想在乙不在A的所有值中C.也顯示
  • 我希望能夠做到這一點,無論將什麼數據放入A或B中。
+0

請舉例說明。你的意思是說A可以是空的還是B?否則,如果A = 7和B = 8,你想在C中做什麼? B.t.w.你需要VBA嗎?因爲這對我來說似乎是一個公式,不需要VBA。 – 2012-02-05 07:19:58

+0

我希望用戶能夠粘貼2列數據進行比較,然後點擊按鈕來比較兩列。例如,如果A1 = 1,A2 = 3,B1 = 2和B2 = 3,我希望C顯示不在兩列中的值,在本例中爲1和2。 – user1190268 2012-02-05 08:01:34

+0

請檢查我對您的問題所做的更改並確認。 B.t.w.我所做的編輯正在等待審查,因此可能需要一段時間才能看到。 – 2012-02-05 08:26:47

回答

2

使用運行Sub SelectionCompare的按鈕創建工具欄。突出顯示包含數據的2列,然後單擊按鈕。布拉姆!

您可以調整此代碼以更好地處理空白,行標題,重複項,檢測不適當的啓動條件(如未選擇或尺寸不正確的選擇)或檢測/防止覆蓋輸出列中的數據。

Function ClipRange(Value As Excel.Range) As Excel.Range 
    Set ClipRange = Application.Intersect(Value, Value.Parent.UsedRange) 
End Function 

Function RangeToDict(Value As Excel.Range) As Object 
    Dim Cell As Excel.Range 
    Set RangeToDict = CreateObject("Scripting.Dictionary") 
    For Each Cell In Value 
     If Not RangeToDict.Exists(Cell.Value) Then 
     RangeToDict.Add Cell.Value, 1 
     End If 
    Next 
End Function 

Sub ColumnCompare(Column1 As Excel.Range, Column2 As Excel.Range, OutputColumn As Excel.Range) 
    Dim Dict1 As Object 
    Dim Dict2 As Object 
    Dim Cell As Excel.Range 
    Dim Key As Variant 
    Set Dict1 = RangeToDict(ClipRange(Column1)) 
    Set Dict2 = RangeToDict(ClipRange(Column2)) 
    Set Cell = OutputColumn.Cells(1, 1) 
    For Each Key In Dict1 
     If Not Dict2.Exists(Key) Then 
     Cell.Value = Key 
     Set Cell = Cell.Offset(1, 0) 
     End If 
    Next 
    For Each Key In Dict2 
     If Not Dict1.Exists(Key) Then 
     Cell.Value = Key 
     Set Cell = Cell.Offset(1, 0) 
     End If 
    Next 
End Sub 

Sub SelectionCompare() 
    ColumnCompare Selection.Columns(1), Selection.Columns(2), Selection.Columns(2).Offset(0, 1) 
End Sub 
+0

對不起,想要獲得幫助! – 2012-02-05 10:56:22

+0

完全沒問題!你的編輯被標記爲審查是全部。也許這是一個錯誤發表任何評論 - 我的歉意。 – ErikE 2012-02-05 19:43:35

+0

這個技巧。謝謝!所有代碼究竟發生了什麼? – user1190268 2012-02-06 03:41:07