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

シート1名称:商品マスタ 
A列に管理番号、B列に商品名 
管理番号、商品名にかぶりなし
シート2名称:販売履歴 
A列に年月日(シリアル値)、B列に管理番号、C列に商品型式、D列に商品名、E列に価格
管理番号、商品名にかぶりあり

シート2は約2年間分の販売履歴のデータがあります。同じ管理番号で年月日によって価格が違うため最新の価格のみをシート1のC列に転記したいです。いろいろな方がネットでやり方を掲載されているので自分なりに作成し、転記はできるのですが、シート2のA列の年月日から最新の価格を見つけるというコードが作れません。ここからどのように修正知ればうまく作動するかお教え願えますでしょうか。
よろしくお願いいたします。


Sub test()

Dim WS1, WS2
Dim LastR1, R1, LastR2, R2
Dim CodeNo, Kakaku

Application.ScreenUpdating = False

Set WS1 = Worksheets("sheet1")
Set WS2 = Worksheets("sheet2")

LastR1 = WS1.Cells(Rows.Count, "A").End(xlUp).Row
LastR2 = WS2.Cells(Rows.Count, "B").End(xlUp).Row

For R1 = StartR1 To LastR1
CodeNo = WS1.Cells(R1, "A")
Kakaku = -1
For R2 = StartR2 To LastR2
If WS2.Cells(R2, "B") = CodeNo Then
Kakaku = WS2.Cells(R2, "E")
Exit For
End If
Next R2

If Kakaku = -1 Then
WS1.Cells(R1, "C") = "無"
Else
WS1.Cells(R1, "C") = Kakaku
End If
Next R1

Application.ScreenUpdating = True


If MsgBox("マクロの実行を終了しますか?", vbYesNo) = vbYes Then
MsgBox "終了します"
End
End If
MsgBox "マクロを最後まで実行しました"
End Sub

A 回答 (3件)

こんばんは


最新の定義を設定する必要があるのではと思いますが・まぁ。

全ループで上から・・
Worksheets("sheet2")をA列キーで昇順ソートするとか、どうでしょう?
Exit For となっているので最初に見つかった行が最新なのでは、、と思います
昇順ソート(シートの並び替え)するだけで行けそうですけれど
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。それだけで出来るのですね。試してみます。大変助かりました。ありがとうございます!

お礼日時:2022/04/07 21:47

No.2です。



【VBA】For-Next文の繰り返し処理を逆順で実行する方法!
https://www.higashisalary.com/entry/for-next-rev …

ループを下から調べていって最初に見つかった条件を満たすものが目的の物ではないのかな?
    • good
    • 1

>シート2は約2年間分の販売履歴のデータがあります



このデータ入力はランダムに行を指定するのではなく、上から順に打ち込んでいるのなら下から調べては如何でしょう?

あと値を入れていない変数(StartR1 , StartR2)って何なのかな?
R1,R2 と勘違いだとしても・・・?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
>このデータ入力はランダムに行を指定するのではなく、上から順に打ち込んでいるのなら下から調べては如何でしょう?
試してみます。ありがとうございました。

お礼日時:2022/04/07 23:36

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