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ではなく商品で突合されてしまったため組み込んでおります。初心者ですので、コードを記載してくださるようお願いいたします。お手数ではございますが、ご教示を何卒よろしくお願いいたします。
No.7ベストアンサー
- 回答日時:
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
多くのパターンを教えてくださりありがとうございます。ご教示いただきました中でこちらの内容が一番思った通りになりましたのでベストアンサーとさせていただきます。。本当にありがとうございました。ご尽力感謝いたします。
No.6
- 回答日時:
#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
No.5
- 回答日時:
>先頭は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
No.4
- 回答日時:
こんにちは
>初心者ですので、コードを記載してくださるようお願いいたします。
不明な点がありますので取り敢えず、ご自身で出来る事として
ご質問には 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
わたしの提示した文章が間違えており、シートは2シートです。
①別シート("商品マスタ")
②Worksheets("受注明細")
②Worksheets("受注明細")Fと①別シート("商品マスタ")のAをVlookupし、エラーになった行を削除したかったです。
No.3
- 回答日時:
各シートの正確なレイアウトが判りません。
添付図のような画像を提示していただけませんでしょうか。
(このような画像はwindows アクセサリのSnipping toolで作成できます)
上の画像が商品マスタです。(B列は想像です)
下の画像が受発注明細です。(I列は想像です)
尚、画像作成時、列と行のガイド(添付図の赤線で囲んだ部分)を必ず含めてください。そうしないと、正確なレイアウトが判りません。
No.2
- 回答日時:
こんばんは。
直接の回答ではありませんが、関数で処理してはダメなのでしょうか?
IFERROR関数との組み合わせで、エラー時は空白表示にすれば良い様な
気がしますが。。。
●VLOOKUPのエラーをIFERROR関数で非表示に
https://www.becoolusers.com/excel/iferror-vlooku …
①別シート(商品マスタ)抽出したい仕入先のみに絞ったデータ
②Worksheets(受注明細) 受注先の情報のみで製品の仕入先の情報が入っておりません。共通のものは製品番号のみですので、製品番号でvlookupし、エラーは今回は必要のない仕入先になります。
②Worksheets(受注明細)Fと①別シート(商品マスタ)のAをVlookupし、エラーになった行を削除したいのは、受注製品の製品番号で仕入先を絞りたかったためです。ここまでが第一段階で、その後また違う処理があります。今回お伺いした作業以外のVBAはなんとか作成できましたが、仕入先を絞りたい作業のVBAが自分ではどうしてもうまくいかなくてお助けいただきたかったのです。説明が足りなかったようで大変申し訳ございませんでした。
No.1
- 回答日時:
なにをしようとしているかわからない。
ISERROR関数は使ってますか?削除ってなにをどう削除したいのか意味がわからない。【Excel】ISERROR関数の使い方|VLOOKUP関数やIF関数との組み合わせ
https://leo-pcblog.com/excel-iserror/
①別シート(商品マスタ)抽出したい仕入先のみに絞ったデータ
②Worksheets(受注明細) 受注先の情報のみで製品の仕入先の情報が入っておりません。共通のものは製品番号のみですので、製品番号でvlookupし、エラーは今回は必要のない仕入先になります。
②Worksheets(受注明細)Fと①別シート(商品マスタ)のAをVlookupし、エラーになった行を削除したいのは、受注製品の製品番号で仕入先を絞りたかったためあえてIFERRORではなくエラーを表示し、他仕入れ先対象のものを行ごと削除したかったのです。ここまでが第一段階で、その後また違う処理があります。今回お伺いした作業以外のVBAはなんとか作成できましたが、仕入先を絞りたい作業のVBAが自分ではどうしてもうまくいかなくてお助けいただきたかったのです。私だけではなく、関数が苦手な方も同じ資料を出力できるものを作成したかったので何とかしていただきたくてお願いいたしました。説明が足りなかったようで大変申し訳ございませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「直需」の意味を教えてください
-
作番ってどういう意味でしょうか?
-
VBA でvlookup エラーなどは削...
-
フォームにレコード数を表示したい
-
「失注」の意味を教えてくださ...
-
excelマクロの処理を早くしたい...
-
受注受付期間とはなんですか?...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Accessでテーブルの値をテキス...
-
Accessでテーブル名やクエリ名...
-
ACCESSのクエリで集計で、先頭...
-
Access テキスト型に対する指定...
-
accessのレポートで元になるテ...
-
テーブルの存在チェックについて
-
Accessのリンクテーブルのパス...
-
セルの右クリックで出る項目を...
-
Accessクエリーで両方のテーブ...
-
空白をそのままインポートする...
-
Oracle 2つのDate型の値の差を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「直需」の意味を教えてください
-
作番ってどういう意味でしょうか?
-
「失注」の意味を教えてくださ...
-
受注受付期間とはなんですか?...
-
ACCESSで、DMax関数の条件の書き方
-
アクセスのクエリで、前回に入...
-
Access:サブフォームのレコー...
-
アクセスで営業日を計算させる...
-
VBA でvlookup エラーなどは削...
-
マクロ転記で指定した列の最終...
-
フォームにレコード数を表示したい
-
access 1対1と1対多のテーブ...
-
データシート形式のサブフォー...
-
ACCESS 選択した値を別...
-
Accessの受注発注について
-
ACCESS 受注数の集計について
-
受注があるわけではないのに設...
-
ACCESS2000の帳票フォーム詳細...
-
ACCESSの同時にデータ入力★初心...
-
Accessテーブルのデータ型を変...
おすすめ情報
皆様ご返信をありがとうございます。レイアウトと説明が足りなかった部分を追記いたします。①別シート(商品マスタ)抽出したい仕入先のみに絞ったデータで2,000行ほどあります。②Worksheets(受注明細) 全ての受注先のデータで5,000行ほどあり、製品の仕入先の情報は入っておりません。共通のものは「商品」タイトル列にある製品番号のみですので、製品番号でvlookupし、エラーは今回は必要のない仕入先に及び受注していない製品になります。②Worksheets(受注明細)F「商品」タイトルと①別シート(商品マスタ)のA「商品」タイトルをVlookupし、エラーになった行を削除したいのは、受注製品の製品番号で仕入先を絞りたかった為、あえてIFERRORではなくエラーを表示し、他仕入れ先対象のものを行ごと削除したいです。お手数ではございますがご教示お願いいたします。