別シートのデータを参照して値を入れたい。
まとめデータシートのC列D列の値を商品一覧シートのコードが一致した行のF列G列へ入れるため、下記のコードを書きました。まとめデータには、「りんご」、「ぶどう」、「いちご」しかありません。
しかし実行すると商品一覧の「みかん」、「ばなな」に「りんご」の値が入ってしまいます。
コードの修正箇所についてご教示いただけませんでしょうか?よろしくお願いいたします。
Sub 一覧へ転記()
'対象シートを設定
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
'Ws1のD列を取得
For i = 2 To Cmax1
Product_code = Ws1.Range("D" & i).Value
'Ws2のA列を取得
For j = 2 To Cmax2
Master_code = Ws2.Range("A" & j).Value
'Ws1のB列とWs2のA列をマッチング
If Product_code = Master_code Then
'Ws2のC列とD列を取得
Product_name = Ws2.Range("C" & j).Value
Product_price = Ws2.Range("D" & j).Value
Exit For
End If
Next
Ws1のG列とH列に出力
Ws1.Range("G" & i).Value = Product_name
Ws1.Range("H" & i).Value = Product_price
Next
End Sub
No.7ベストアンサー
- 回答日時:
#4です
>If Product_name <> "" And Product_price <> "" Then
Product_price <> "" は13エラー
見落としていました。
#6様がご解答されている通り、Product_priceはLong型ですね
and Product_price <> 0
Product_price = 0 ’初期化代入
となりますので訂正します
>If Product_name <> "" Then だけで成立するのかも知れません
Product_price = "" は Product_price = 0 です
#4の回答はご質問コードの順に処理を行った場合の回答です
問題が起こっている原因(無条件で書き込んでいる為が回答基軸)
ただ、シンプルにロジックを考えると
マッチした時に変数に代入してExit Forループを抜け、書き込みですね
変数代入が必要か不要かは別としてせっかくExit Forがあるのだから、
#1様が回答されているように(多分省略部分)書き込みをループ内に入れても同じことになりますよね(勘違いでしたらごめんなさい)
その場合は、変数の値で分岐する必要がありません
変数を使用していませんが
For i = 2 To Cmax1
Product_code = Ws1.Range("D" & i).Value
'Ws2のA列を取得
For j = 2 To Cmax2
Master_code = Ws2.Range("A" & j).Value
'Ws1のB列とWs2のA列をマッチング
If Product_code = Master_code Then
'マッチした時に書き込み
Ws1.Range("G" & i).Value = Ws2.Range("C" & j).Value
Ws1.Range("H" & i).Value = Ws2.Range("D" & j).Value
Exit For
End If
Next
Next
End Sub
変数を使っていないので初期化はありません
(まとめて出力する場合など)
変数、範囲、配列などで取得して出力部分をループの外に出す場合は、
値(変数など)の状態を取得して分岐処理で出力ようにするとエラーや誤動作を防げると思います(出力後、さらに繰り返し処理をする場合、初期化をします)
No.5
- 回答日時:
こんにちは
>「みかん」、「ばなな」に「りんご」の値が入ってしまいます。
直接の原因は、検索でヒットしてもしなくても、ループ処理内で必ず
>Ws1.Range("G" & i).Value = Product_name
>Ws1.Range("H" & i).Value = Product_price
が実行されるようになっているからでしょう。
ヒットしない場合には何もしないので良ければ、「まとめデータ」側の各行の値で検索するループにした方が簡単です。
(こちらの場合でも、一覧に存在しないものがある場合にどうするのかという問題は残りますが・・)
「まとめデータ」に記載の無いものはクリアするなどの処理が必要な場合は、「一覧データ」の各行についてループで検索する手順の方がやりやすいでしょう。
いずれにしろ、検索にはFINDメソッドやMATCH関数を利用する方が、コードを簡略化できる可能性が高いです。
また、連続セルの値の転記は、Rangeでまとめて行えますので、
Range1.Value = Range2.Value
のような形式にした方がコードを単純化することができます。
No.4
- 回答日時:
こんにちは
無条件で出力しているようですが・・・
Ws1.Range("G" & i).Value = Product_name
Ws1.Range("H" & i).Value = Product_price
条件を加えてみたら・・
If Product_name <> "" And Product_price <> "" Then
Ws1.Range("G" & i).Value = Product_name
Ws1.Range("H" & i).Value = Product_price
Product_name = ""
Product_price = ""
End If
Next
End Sub
仕様によっては条件を見直してください
No.2
- 回答日時:
#1です。
あー、、初期化の位置はIf Product_code = Master_code Then
の真下がいいかもです。
要は初期化がしないとループ処理で前回マッチした内容がそのまま残っているのが原因です。
No.1
- 回答日時:
こんにちは。
アンマッチした時、Product_name, Product_price を初期化して下さい。
If Product_code = Master_code Then
(略)
Exit For
Else
Product_name = ""
Product_price = ""
End If
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba 2つの条件が一致したら...
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
【VBA】2つのシートの値を比較...
-
VBAでのリスト不一致抽出について
-
エクセル 2つの表の並べ替え
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
エクセルVBA intersect colu...
-
マクロ 最終列をコピーして最終...
-
マクロについて。S列の途中から...
-
EXCEL VBA 条件に合致しない行...
-
エクセルVBAにて =A1=B1とすれ...
-
エラーコード1004
-
VBマクロ 色の付いたセルを...
-
【Excel VBA】カンマと改行コー...
-
URLのリンク切れをマクロを使っ...
-
VBAで指定範囲内の空白セルを左...
-
エクセルで最大列を増やす
-
vba 重複データ合算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
VBAのコードを教えてください
-
VBAを使って検索したセルをコピ...
-
B列の最終行までA列をオート...
-
エクセルvbaについて
-
vba 2つの条件が一致したら...
-
Excelで、あるセルの値に応じて...
-
VBA UserFormからの転記で
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
エクセルVBAにて =A1=B1とすれ...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
VBマクロ 色の付いたセルを...
-
VBAで指定範囲内の空白セルを左...
おすすめ情報
下記コードに変更し実行したところ、「If Product_name <> "" And Product_price <> "" Then」で「型が一致しません」となりました?修正についてご教授頂けると助かります。よろしくお願いします。
・・・・・・・・・・・・・
'Ws1のG列とH列に出力
If Product_name <> "" And Product_price <> "" Then
Ws1.Range("G" & i).Value = Product_name
Ws1.Range("H" & i).Value = Product_price
Product_name = ""
Product_price = ""
End If
Next
End Sub