アプリ版:「スタンプのみでお礼する」機能のリリースについて

別シートのデータを参照して値を入れたい。
まとめデータシートの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

「別シートのデータを参照して値を入れたい。」の質問画像

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

  • 下記コードに変更し実行したところ、「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

      補足日時:2022/08/17 15:13

A 回答 (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

変数を使っていないので初期化はありません

(まとめて出力する場合など)
変数、範囲、配列などで取得して出力部分をループの外に出す場合は、
値(変数など)の状態を取得して分岐処理で出力ようにするとエラーや誤動作を防げると思います(出力後、さらに繰り返し処理をする場合、初期化をします)
    • good
    • 0
この回答へのお礼

ご丁寧な説明で理解度が増しました。助かりました!
ありがとうございます♪

お礼日時:2022/08/17 16:45

Product_price が long型ですから初期化なら


Product_price = 0
で比較の方は他回答者様におまかせ。

まあ、どう回答してもスルーされる様なのでこれで最後。私は退散しますね。
    • good
    • 0
この回答へのお礼

ありがとうございます。「0」にしてみましたが
しかし型が一致しません?

お礼日時:2022/08/17 16:39

こんにちは



>「みかん」、「ばなな」に「りんご」の値が入ってしまいます。
直接の原因は、検索でヒットしてもしなくても、ループ処理内で必ず
>Ws1.Range("G" & i).Value = Product_name
>Ws1.Range("H" & i).Value = Product_price
が実行されるようになっているからでしょう。


ヒットしない場合には何もしないので良ければ、「まとめデータ」側の各行の値で検索するループにした方が簡単です。
(こちらの場合でも、一覧に存在しないものがある場合にどうするのかという問題は残りますが・・)
「まとめデータ」に記載の無いものはクリアするなどの処理が必要な場合は、「一覧データ」の各行についてループで検索する手順の方がやりやすいでしょう。

いずれにしろ、検索にはFINDメソッドやMATCH関数を利用する方が、コードを簡略化できる可能性が高いです。
また、連続セルの値の転記は、Rangeでまとめて行えますので、
 Range1.Value = Range2.Value
のような形式にした方がコードを単純化することができます。
    • good
    • 1
この回答へのお礼

ありがとうございます。

お礼日時:2022/08/17 16:47

こんにちは


無条件で出力しているようですが・・・
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
仕様によっては条件を見直してください
    • good
    • 1

間違えた。



Product_code = Ws1.Range("D" & i).Value

の真下。訂正します。
    • good
    • 1
この回答へのお礼

ありがとうございます

お礼日時:2022/08/17 16:47

#1です。

あー、、初期化の位置は

If Product_code = Master_code Then

の真下がいいかもです。
要は初期化がしないとループ処理で前回マッチした内容がそのまま残っているのが原因です。
    • good
    • 0

こんにちは。



アンマッチした時、Product_name, Product_price を初期化して下さい。

If Product_code = Master_code Then
(略)
  Exit For
Else
  Product_name = ""
  Product_price = ""
End If
    • good
    • 0

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