2017-10-12 34 views
0

我有兩個包含數據的列表。 第一個列表是包含所有新數據的列表,第二個列表中包含舊數據。現在我想讓Excel展示一個消息框,告訴我第二個列表中缺少哪些數據。比較VBA中的列表和Msgbox中的輸出差異

使用在其他主題中找到的信息,我已經能夠將這兩個列表相互比較,並在第三個工作表中輸出這些數據。 但是我並不真的需要第三張紙,但我想在消息框中填入這些差異。:)任何人都可以幫我解決我如何正確更改此代碼?

Sub Compare() 

Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet, lr1 As Long, lr2 As Long, rng1 As Range, rng2 As Range, c As Range 
Set sh1 = Sheets(1) 
Set sh2 = Sheets(2) 
Set sh3 = Sheets(3) 
lr1 = sh1.Cells(Rows.Count, 1).End(xlUp).Row 
lr2 = sh2.Cells(Rows.Count, 1).End(xlUp).Row 
Set rng1 = sh1.Range("A2:A" & lr1) 
Set rng2 = sh2.Range("A2:A" & lr2) 

With sh3 'If header not there, put them in 
    If .Range("a1") = "" Then 
     .Range("a1") = "Extras in List 2" 
    End If 
End With 

    For Each c In rng2 
     If Application.CountIf(rng1, c.Value) = 0 Then 
     sh3.Cells(Rows.Count, 1).End(xlUp)(2) = c.Value 
     End If 
    Next 

End Sub 

回答

1

非測試 - 直接進入了SO,而應該顯示的方式:(End With後開始)

dim msg as string 
msg = "Extras: " 

For Each c In rng2 
    'edit: skip empty cells 
    If len(c.Value) > 0 And Application.CountIf(rng1, c.Value) = 0 Then 
     'sh3.Cells(Rows.Count, 2).End(xlUp)(2) = c.Value 
     msg = msg & c.value & ", " 
    End If 
Next 
msg = left(msg,len(msg)-2) 
msgbox msg 
+0

感謝您的幫助帕特里克!它幾乎可行,但它現在顯示消息: 「Extra's:,,,,6,8」 你有什麼想法如何解決這個問題嗎? – ErikSlui

+0

我發現我之前的問題在哪裏,我也有一些空行,它們也被識別爲「新」。但是空白行需要被代碼忽略 – ErikSlui

+0

@ErikSlui請參閱編輯 –

0

@PatrickHonorez有更好的答案,因爲他糾正了OP的代碼。

每當比較兩個列表,我使用某種集合或詞典。

我的方法是將第二個列表中的所有值添加到ArrayList中,然後從ArrayList中刪除第一個列表值。通過這種方式,只有新值保留在ArrayList中。

Sub Compare() 
    Dim cell As Range, list As Object 
    Set list = CreateObject("System.Collections.ArrayList") 

    With Worksheets(2) 
     For Each cell In .Range("A2", .Range("A" & .Rows.Count).End(xlUp)) 
      If cell.Value <> "" Then 
       If Not list.Contains(cell.Value) Then list.Add cell.Value 
      End If 
     Next 
    End With 

    With Worksheets(1) 
     For Each cell In .Range("A2", .Range("A" & .Rows.Count).End(xlUp)) 
      If list.Contains(cell.Value) Then list.Remove cell.Value 
     Next 
    End With 

    With Worksheets(3) 
     .Columns(1).ClearContents 
     .Range("A1") = "Extras in List 2" 

     If list.Count = 0 Then 
      MsgBox "No new data", vbInformation, "" 
     Else 
      MsgBox Join(list.ToArray, ", "), vbInformation, "New Data" 
      .Range("A2").Resize(list.Count).Value = Application.Transpose(list.ToArray) 
     End If 
    End With 
End Sub 
+0

謝謝托馬斯。如果我必須從頭開始做這樣的事情,我可能會使用帶有左連接的ADO查詢。 https://support.microsoft.com/zh-cn/help/278973/excelado-demonstrates-how-to-use-ado-to-read-and-write-data-in-excel-w –

+0

感謝您的貢獻托馬斯,這也似乎工作,但是這一個也包括其「不同」列表中的空白單元 – ErikSlui

+0

任何想法如何排除這些? – ErikSlui