プロが教えるわが家の防犯対策術!

VBAでvlookupをし、別シート("商品マスタ")のデータを検索して所定のシートWorksheets("受注明細")で処理しようとしています。
Worksheets("受注明細")F列(先頭はF6で最終行は都度違います)に製品型番が入力されています。Worksheets("商品マスタ")のA列(先頭はA2で最終行は都度違います)製品型番が入力されています。Worksheets("受注明細")F列をキーとし、Worksheets("商品マスタ")A列をvlookupし、Worksheets("受注明細")I6へ連続で貼り付けし、空白やエラーで出たものは削除したいです。いろいろとサイトを見て自分なりに作成いたしましたが、手作業で行う=VLOOKUP(受注明細!F6,商品マスタ!A:A,1,FALSE)との差異が生じております。本来ならエラーになるのに突合をしてしまっている状態です。またWorksheets("受注明細")のA5:H5にタイトルが入っているのですが、それもなくなってしまいます。
Dim Ws1 As Worksheet, Ws2 As Worksheet
Set Ws1 = Worksheets("受発注明細")
Set Ws2 = Worksheets("商品マスタ")

Dim Cmax1 As Long, Cmax2 As Long
Cmax1 = Ws1.Range("A65536").End(xlUp).Row
Cmax2 = Ws2.Range("A65536").End(xlUp).Row

Dim Product_code As String, Master_code As String, Product_name As String
Dim I As Long, j As Long, Product_price As Long

For I = 2 To Cmax1
Product_code = Ws1.Range("F" & I).Value
For j = 2 To Cmax2
Master_code = Ws2.Range("A" & j).Value
If Product_code = Master_code Then
Product_name = Ws2.Range("A" & j).Value
Exit For
End If
Next
Ws1.Range("I" & I).Value = Product_name
Next

lRow = Cells(Rows.Count, "A").End(xlUp).Row

For I = lRow To 2 Step -1

If (Cells(I, "I") = "商品" Or Cells(I, "I") = "#N/A") _
Or Cells(I, "I") = "" Then

Rows(I).Delete
End If

Next I

End Sub

いろいろなサイトを見て自分なりに作成いたしましたが、上記のように手作業で行う=VLOOKUP(受注明細!F6,商品マスタ!A:A,1,FALSE)との差異が生じており、本来ならエラーになるのに突合をしタイトルも消えてしまいます。商品を削除したいのは、 Worksheets("商品マスタ")A列のタイトルが商品となっており、製品型番と一致しないのに#N/Aではなく商品で突合されてしまったため組み込んでおります。初心者ですので、コードを記載してくださるようお願いいたします。お手数ではございますが、ご教示を何卒よろしくお願いいたします。

質問者からの補足コメント

  • 皆様ご返信をありがとうございます。レイアウトと説明が足りなかった部分を追記いたします。①別シート(商品マスタ)抽出したい仕入先のみに絞ったデータで2,000行ほどあります。②Worksheets(受注明細) 全ての受注先のデータで5,000行ほどあり、製品の仕入先の情報は入っておりません。共通のものは「商品」タイトル列にある製品番号のみですので、製品番号でvlookupし、エラーは今回は必要のない仕入先に及び受注していない製品になります。②Worksheets(受注明細)F「商品」タイトルと①別シート(商品マスタ)のA「商品」タイトルをVlookupし、エラーになった行を削除したいのは、受注製品の製品番号で仕入先を絞りたかった為、あえてIFERRORではなくエラーを表示し、他仕入れ先対象のものを行ごと削除したいです。お手数ではございますがご教示お願いいたします。

    「VBA でvlookup エラーなどは削」の補足画像1
      補足日時:2022/12/31 02:23

A 回答 (8件)

CountIfで行う場合



Sub test01()
Dim Ws1 As Worksheet, Ws2 As Worksheet
Set Ws1 = Worksheets("受注明細")
Set Ws2 = Worksheets("商品マスタ")
Dim Cmax1 As Long, Cmax2 As Long
Cmax1 = Ws1.Range("A65536").End(xlUp).Row
Cmax2 = Ws2.Range("A65536").End(xlUp).Row
Dim Product_code As String
Dim i As Long
Dim rngDel As Range
For i = 6 To Cmax1 'Worksheets("受注明細")
Product_code = Ws1.Range("F" & i).Value
If Application.CountIf(Ws2.Range("A2:A" & Cmax2), Product_code) > 0 Then
Ws1.Range("I" & i).Value = Product_code
Else
If rngDel Is Nothing Then
Set rngDel = Ws1.Cells(i, "I")
Else
Set rngDel = Union(rngDel, Ws1.Cells(i, "I"))
End If
End If
Next
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete

End Sub
    • good
    • 0
この回答へのお礼

多くのパターンを教えてくださりありがとうございます。ご教示いただきました中でこちらの内容が一番思った通りになりましたのでベストアンサーとさせていただきます。。本当にありがとうございました。ご尽力感謝いたします。

お礼日時:2023/01/01 02:33

No3です。


補足ありがとうございました。
製品番号が*(アスタリスク)を含むことはありますか?

K001*
K*001
のようなケースです。

含まないのであれば、既に良い回答がでていますので、私のほうからの回答はひかえさせていただきます。
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。今後もお伺いすることがあると思いますので、アドバイス大変ありがたく思います。

お礼日時:2023/01/01 02:29

#5の方法でご質問コードを添削して書き込み削除するか


下記を試してみてください
Sub test()
Dim Ws1 As Worksheet, Ws2 As Worksheet
Set Ws1 = Worksheets("受注明細")
Set Ws2 = Worksheets("商品マスタ")

Dim Cmax1 As Long, Cmax2 As Long
Cmax1 = Ws1.Range("A65536").End(xlUp).Row
Cmax2 = Ws2.Range("A65536").End(xlUp).Row

Dim Product_code As String
Dim i As Long
Dim codeCell As Range
Dim rngDel As Range
For i = 6 To Cmax1 'Worksheets("受注明細")
Product_code = Ws1.Range("F" & i).Value
Set codeCell = Ws2.Range("A2:A" & Cmax2).Find( _
What:=Product_code, After:=Ws2.Range("A" & Cmax2), LookIn:=xlValues, LookAt:=xlWhole)
If Not codeCell Is Nothing Then
Ws1.Range("I" & i).Value = codeCell.Value
Else
If rngDel Is Nothing Then
Set rngDel = Ws1.Cells(i, "I")
Else
Set rngDel = Union(rngDel, Ws1.Cells(i, "I"))
End If
End If
Next
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete

End Sub
    • good
    • 0

>先頭はF6で最終行は


For I = 2 To Cmax1 => For I = 6 To Cmax1
 
ご質問のループで行う・・A:A,1,FALSE

For i = 6 To Cmax1
Product_code = Ws1.Range("F" & i).Value
Product_name = "#N/A"
For j = 2 To Cmax2
If Product_code = Ws2.Range("A" & j).Value Then
Product_name = Product_code
Exit For
End If
Next
Ws1.Range("I" & i).Value = Product_name
Next
    • good
    • 0

こんにちは


>初心者ですので、コードを記載してくださるようお願いいたします。
不明な点がありますので取り敢えず、ご自身で出来る事として

ご質問には 3つシートが出てくるようですが(打ち間違えかな?)
実際には4つシートが出てきています(1つは たぶん重複)
①別シート("商品マスタ")
②Worksheets("受注明細")
③Worksheets("受発注明細")
④ActiveSheet 上記にたぶん重複
どのシートに対して処理をするのか考えて(Ws1.Rangeみたいに)
下記コードのシートオブジェクトを明示してみましょう

lRow = Cells(Rows.Count, "A").End(xlUp).Row
For I = lRow To 2 Step -1
If (Cells(I, "I") = "商品" Or Cells(I, "I") = "#N/A") _
Or Cells(I, "I") = "" Then
Rows(I).Delete
    • good
    • 0
この回答へのお礼

わたしの提示した文章が間違えており、シートは2シートです。
①別シート("商品マスタ")
②Worksheets("受注明細")
②Worksheets("受注明細")Fと①別シート("商品マスタ")のAをVlookupし、エラーになった行を削除したかったです。

お礼日時:2022/12/31 00:50

各シートの正確なレイアウトが判りません。


添付図のような画像を提示していただけませんでしょうか。
(このような画像はwindows アクセサリのSnipping toolで作成できます)

上の画像が商品マスタです。(B列は想像です)
下の画像が受発注明細です。(I列は想像です)
尚、画像作成時、列と行のガイド(添付図の赤線で囲んだ部分)を必ず含めてください。そうしないと、正確なレイアウトが判りません。
「VBA でvlookup エラーなどは削」の回答画像3
    • good
    • 0

こんばんは。



直接の回答ではありませんが、関数で処理してはダメなのでしょうか?
IFERROR関数との組み合わせで、エラー時は空白表示にすれば良い様な
気がしますが。。。

●VLOOKUPのエラーをIFERROR関数で非表示に
https://www.becoolusers.com/excel/iferror-vlooku …
    • good
    • 0
この回答へのお礼

①別シート(商品マスタ)抽出したい仕入先のみに絞ったデータ
②Worksheets(受注明細) 受注先の情報のみで製品の仕入先の情報が入っておりません。共通のものは製品番号のみですので、製品番号でvlookupし、エラーは今回は必要のない仕入先になります。
②Worksheets(受注明細)Fと①別シート(商品マスタ)のAをVlookupし、エラーになった行を削除したいのは、受注製品の製品番号で仕入先を絞りたかったためです。ここまでが第一段階で、その後また違う処理があります。今回お伺いした作業以外のVBAはなんとか作成できましたが、仕入先を絞りたい作業のVBAが自分ではどうしてもうまくいかなくてお助けいただきたかったのです。説明が足りなかったようで大変申し訳ございませんでした。

お礼日時:2022/12/31 01:04

なにをしようとしているかわからない。

ISERROR関数は使ってますか?削除ってなにをどう削除したいのか意味がわからない。

【Excel】ISERROR関数の使い方|VLOOKUP関数やIF関数との組み合わせ
https://leo-pcblog.com/excel-iserror/
    • good
    • 0
この回答へのお礼

①別シート(商品マスタ)抽出したい仕入先のみに絞ったデータ
②Worksheets(受注明細) 受注先の情報のみで製品の仕入先の情報が入っておりません。共通のものは製品番号のみですので、製品番号でvlookupし、エラーは今回は必要のない仕入先になります。
②Worksheets(受注明細)Fと①別シート(商品マスタ)のAをVlookupし、エラーになった行を削除したいのは、受注製品の製品番号で仕入先を絞りたかったためあえてIFERRORではなくエラーを表示し、他仕入れ先対象のものを行ごと削除したかったのです。ここまでが第一段階で、その後また違う処理があります。今回お伺いした作業以外のVBAはなんとか作成できましたが、仕入先を絞りたい作業のVBAが自分ではどうしてもうまくいかなくてお助けいただきたかったのです。私だけではなく、関数が苦手な方も同じ資料を出力できるものを作成したかったので何とかしていただきたくてお願いいたしました。説明が足りなかったようで大変申し訳ございませんでした。

お礼日時:2022/12/31 01:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!