• 締切済み

エクセルでのマッチング

色々エクセルでのマッチングのページを見ましたが自分の状況に該当するのがなかったので質問させて頂きます。 エクセルでのデータが2つあります。 Sheet1 A列→注文NO B列→金額 C列→製造番号 D列→金額 E列→商品名 Sheet2 A列→注文NO B列→金額 C列→品名 D列→数量 E列→単価 の2つのシートがあります。2つのシートを比較して、 A列の注文NOが一致してたら、Sheet1,Sheet2のG列に”注文NOが一致してます”と記載します。 さらに注文NOも一致し、同じ行の金額も一致したら、”金額も一致してます”とH列に記載します。 できましたら、 注文NOと金額が一致した物に関してSheet2のF列にSheet1の製造番号を記載するようなプログラムを作りたいと思います。 ↓に私が調べた結果、注文NOだけをキーにしてマッチングさせて、動くプログラムがありますしたが、2つをキーにする場合や別シートから一致したデータの一部を持ってくるものは探してもわかりませんでした。 http://www.okweb.ne.jp/kotaeru.php3?q=507722 質問された方と違い、データは人が入れていることもあり、間違いがある可能性があり2つ以上をキーにして、どこの製造番号の物かわかるようなプログラムをできる方教えて頂けませんでしょうか? ちょっと複雑ですのでここに出すべきか迷いましたが、プログラムの組める方、お願い致します。

みんなの回答

  • eipu
  • ベストアンサー率39% (25/64)
回答No.2

・sheet1の注文番号に同じ番号が複数存在しない。 ・sheet2には2行目からデータの最終行までの間に  空白行が一行無いも無い。 ということを前提にプログラムを書いてみました。 前提付き回答なので自信無しということで。 Sub SameCheck() Dim s1 As Excel.Worksheet Dim s2 As Excel.Worksheet Dim y1 As Long Dim y2 As Long Set s1 = Sheets("sheet1") Set s2 = Sheets("sheet2") y2 = 2 Do Until s2.Cells(y2, 1).Value = "" On Error GoTo err: '注文No照合 y1 = s1.Columns(1).Find(what:=s2.Cells(y2, 1).Value, lookat:=xlWhole).Row On Error GoTo 0 If y2 > 0 Then 'G列への書き込み s1.Cells(y1, 7).Value = "注文NOが一致してます" s2.Cells(y2, 7).Value = "注文NOが一致してます" '金額の照合 If s1.Cells(y1, 2).Value = s2.Cells(y2, 2).Value Then 'H列への書き込み s1.Cells(y1, 8).Value = "金額も一致してます" s2.Cells(y2, 8).Value = "金額も一致してます" '製造番号書き込み s2.Cells(y2, 6).Value = s1.Cells(y1, 3).Value End If End If y2 = y2 + 1 Loop MsgBox "照合終了!" Exit Sub err: y2 = 0 Resume Next End Sub

YukiTomoya
質問者

お礼

同じ注文番号に同じ製造番号の物はあったり、空白行も存在してしまいます。(それを見つけ出すのが苦労するのでプログラムを考えました。) 一度試させて頂きましたが、eipu様にかいて頂いた通り、条件にひっかかりエラーになってしまいます。というより、プログラムが終了しません・・・。 自分でプログラムを組んでみましたが、自信がありません。 注文Noが一致した時。一致しますと出て、その時、製造番号も一緒にでます。さらにチェックとして注文Noと金額が一致した時金額も一致しましたと出るような形にしたつもりです。一応思った通り出るのですが、ホントにこれで正しいのか不安です。(マクロを組むのは初めてで、さらに本すら持ってませんから・・・) Option Explicit Sub ダイフク支払通知書() Dim 最終行1, 最終行2 As Integer Dim 行1, 行2 As Integer 最終行1 = Worksheets(1).Range("A400").End(xlUp).Row 最終行2 = Worksheets(2).Range("A400").End(xlUp).Row Worksheets(1).Activate 'マクロ実行画面を表示しない Application.ScreenUpdating = False For 行2 = 2 To 最終行2 For 行1 = 2 To 最終行1 '注文NOが一致してた時製番を表示させるプログラム If Worksheets(2).Range("A" & 行2) = Range("A" & 行1) Then Range("K" & 行1) = Worksheets(2).Range("C" & 行2) End If Next 行1 Next 行2 '注文NOが一致してた時表示するプログラム Application.ScreenUpdating = False For 行2 = 2 To 最終行2 For 行1 = 2 To 最終行1 If Worksheets(2).Range("A" & 行2) = Range("A" & 行1) Then Range("J" & 行1) = "注文NOは一致してます" 行1 = 最終行1 End If Next 行1 Next 行2 '注文NOが一致しかつ金額が一致した時表示させるプログラム Application.ScreenUpdating = False For 行2 = 2 To 最終行2 For 行1 = 2 To 最終行1 If Worksheets(2).Range("A" & 行2) = Range("A" & 行1) And Worksheets(2).Range("B" & 行2) = Range("B" & 行1) Then Range("I" & 行1) = "金額も一致してます" 行1 = 最終行1 End If Next 行1 Next 行2 End Sub

  • hoyoyo
  • ベストアンサー率23% (11/46)
回答No.1

マクロを組まないと駄目でしょうか。 関数では G列には =IF(A2=Sheet1!A2,"注文NOが一致してます","error") H列には =IF(A2=Sheet1!A2,"注文NOが一致してます","error") を入れれば比較できます。 関数が入っているセルだけ保護してやれば問題はないと思うのですが。 注文番号を変則的に入力されるのであれば、VLOOKUPを使用できると思います。

YukiTomoya
質問者

お礼

回答ありがとうございます。 sheet1のA2にあるデータがSheet2のA300にある場合、この方法は使えないと思いますが・・・。 VLOOKUPなど関数を使った方法でもできるとは思いますが、検索数が3000件ほどありますので、毎回打出されてくるデータに関数を使って作成して調査するのは時間がかかるので、ボタン一発のVBAのマクロを当方では考えております。

関連するQ&A