• ベストアンサー

ExcelVBAでデータ不一致のものの抽出

単純なものにしたいので教えてください。 Sheet1「元データ」                  A   B    C   D   コード 商品  店名  納入日   1 0001 みかん  A店  3/1  5 0360 メロン  D店 6 かき   P店 7 0312 キウイ  D店 9 0333 くり C店 Sheet2「最新データ」   A   B    C   D コード 商品  店名  納入日  1 0001 みかん  A店  3/1 4 0311 いちご B店  3/10 6 0250 8 0312 キウイ    とあった時に元データのA列の番号と最新データの番号を見て同じ物があったら、元データに最新データの内容をうつし込み、一致しなかったらチェックデータへうつしこむというデータがあります。 Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh3 As Worksheet Dim myR As Range Dim N_D As Long Dim i As Long Set Sh1 = Worksheets("元データ") Set Sh2 = Worksheets("チェックデータ") Set Sh3 = Worksheets("最新データ") With Sh1 For i = 5 To .Range("A65536").End(xlUp).Row N_D = .Range("E" & i).Value Set myR = Sh3.Range("A:A").Find(What:=N_D, LookIn:=xlValues, _ MatchCase:=False) If Not myR Is Nothing Then myR.Offset(, 2).Resize(, 3).Copy _ Destination:=.Range("B" & i & ":D" & i) Else addR_No = Sh2.Range("A65536").End(xlUp).Row + 1 .Range("A" & i & ":D" & i).Copy _ Destination:=Sh2.Range("A" & addR_No & ":D" & addR_No) End If Next End With ここで、データが一致した場合は無視して、一致しなかったときだけチェックデータに内容を書き込むとする場合はどのように修正すればよいのでしょうか?あと、チェックデータのあたまに コード 商品  店名  納入日  という言葉を入れたいのですが、どのように書き込むのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#29107
noname#29107
回答No.1

>ここで、データが一致した場合は無視して、一致しなかったときだけチェックデータに >内容を書き込むとする場合はどのように修正すればよいのでしょうか? If Not myR Is Nothing Then   myR.Offset(, 2).Resize(, 3).Copy _   Destination:=.Range("B" & i & ":D" & i) Else   addR_No = Sh2.Range("A65536").End(xlUp).Row + 1   .Range("A" & i & ":D" & i).Copy _   Destination:=Sh2.Range("A" & addR_No & ":D" & addR_No) End If を以下のように変更 If myR Is Nothing Then   addR_No = Sh2.Range("A65536").End(xlUp).Row + 1   .Range("A" & i & ":D" & i).Copy _   Destination:=Sh2.Range("A" & addR_No & ":D" & addR_No) End If >あと、チェックデータのあたまに >コード 商品  店名  納入日  >という言葉を入れたいのですが、どのように書き込むのでしょうか? 始めにコード 商品  店名  納入日を入力しておけば、特にプログラムで設定する必要は無いと思いますが、あえてやるなら Set Sh3 = Worksheets("最新データ") の直後の行に If Sh3.Range("A1").Value <> "コード" Then   Sh3.Rows(1).Insert   Sh3.Range("A1").Value = "コード"   Sh3.Range("B1").Value = "商品"   Sh3.Range("C1").Value = "店名"   Sh3.Range("D1").Value = "納入日" End If あと余計なお世話でしょうが、元データと最新データの比較という場合、最新データが元データにあるかチェックするのが普通だと思いますが、今のマクロでは元データが最新データに存在するかどうかのチェックになっていますが、これが実現したいことなのでしょうか?

yuk777
質問者

お礼

なるほど!Notをとることで普通にIf文になるからすすめれるわけですね。 通常元データを中心にして考えるんでしょうが、今回は毎月最新データを中心にして考えて元データを作るというにしてます。 実際のデータは大量にあるので、大分進んできて楽しくなってきました。また細かい所で質問させていただきますのでよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

何がしたいか2つのケースが考えられす。 (1)元データの中で売れてない(最新データにない)明細 (2)最新データにあるが、元データにない明細 例えば、マスタになくて、販売データにある明細 (1)らしいのですが曖昧。 下記は(1)でやって見ました。 Sub test01() Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh3 As Worksheet Dim myR As Range Dim N_D As Long Dim i As Long '--------- Set Sh1 = Worksheets("元データ") Set Sh2 = Worksheets("チェックデータ") Set Sh3 = Worksheets("最新データ") '---------チェックデータ・シートに項目見だしを入れる Sh2.Cells(1, "A") = "コード" Sh2.Cells(1, "B") = "商品" Sh2.Cells(1, "C") = "店名" Sh2.Cells(1, "D") = "納入日" '-----初期値設定 j = 2 'チェックデータ・シートに第2行目から '---------元データの各行に付いて繰り返し For i = 2 To Sh1.Range("A65536").End(xlUp).Row N_D = Sh1.Range("A" & i).Value Set myR = Sh3.Range("A:A").Find(What:=N_D, LookIn:=xlValues, _ MatchCase:=False) If myR Is Nothing Then '-----見つからなかった場合 Sh2.Cells(j, "A") = Sh1.Cells(i, "A") Sh2.Cells(j, "B") = Sh1.Cells(i, "B") Sh2.Cells(j, "C") = Sh1.Cells(i, "C") Sh2.Cells(j, "D") = Sh1.Cells(i, "D") j = j + 1 '次に書く行をポイント Else '見つかった場合何もしない End If Next End Sub 質問のコードに誤り?の箇所があるようで、修正しました。出来るだけ原型を尊重しましたが、私の好みのスタイルになっている箇所があります。 (データ例)元データA1:D9 コード 商品 店名 納入日 1 みかん A店 1月3日 360 メロン D店 312 かき P店 313 キウイ D店 333 くり C店 344 リンゴ F店 322 バナナ D店 318 もも A店 最新データA1:D7 コード 商品 店名 納入日 1 みかん A店 1月3日 311 いちご B店 10月3日 250 313 キウイ F店 360 メロン G店 344 リンゴ C店 (結果)チェックデータA1:D5 コード 商品 店名 納入日 312 かき P店 333 くり C店 322 バナナ D店 318 もも A店

yuk777
質問者

お礼

とっても参考になりました。 結局のところ(1)も(2)も両方やりたかったりします。色々なシートに書き写すので。。 でも、とりあえず一つのことを教えてもらえば、あとは自分で考えようと思ってこのような曖昧な質問になってしまい、申し訳ありません。 大分進んできて楽しくなってきています。 また細かい質問いれますのでよろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A