2017-10-12 3 views
0

私はデータを持つ2つのリストを持っています。 最初のリストはすべて新しいデータを含むリストで、2番目のリストには古いデータがあります。ここで、Excelで2番目のリストに欠落しているデータがあることを示すメッセージボックスを表示させます。VBAのリストとMsgboxの出力の違いを比較します

他のトピックにある情報を使用して、これらの2つのリストを互いに比較し、このデータを3番目のシートに出力できました。 しかし、実際には3枚目のシートは必要ありませんが、メッセージボックスにこれらの相違点があります。:)このコードを正しく変更する方法は誰でも助けてくれますか?

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に直接入力が、道を示す必要があります。彼はOPのコードを修正するため

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

ご協力ありがとうございます。それはほとんど動作しますが、今メッセージが表示されます: "エクストラの:、、、、6,8" これを解決する方法はありますか? – ErikSlui

+0

私の以前の問題がどこにあったのかわかりました。私はいくつかの空白行も持っていました。しかし、空白の行はコードで無視する必要があります – ErikSlui

+0

@ErikSlui編集を参照してください –

0

@PatrickHonorezは、より良い答えを持っている(End With後に開始します)。

2つのリストを比較するときは、何らかのコレクションまたはディクショナリを使用します。

私のアプローチは、2番目のリストのすべての値をArrayListに追加してから、1番目のリストの値を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/en-ca/help/278973/excelado-demonstrates-how-to-use-ado-to-read-and-write-data-in-excel-w –

+0

寄付いただきありがとうございますトーマス、これもうまくいくようですが、これには "differneces"リストに空白のセルも含まれています – ErikSlui

+0

これらを除外する方法はありますか? – ErikSlui

関連する問題