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

VBA初心者のため、教えていただきたいです。
シートが"レポート"、"リスト"、"前月レポート"とある体です。
"レポート"にA4:F50までの表があり、A列を基準にD列にそれぞれ合う情報を反映したいです。
D列の情報は、"リスト"か"前月レポート"のどちらかにありますが、1個ずつ指定もできません。。
タイトルの通り、Vlookupで反映したいのですが、調べたりしてIsErrorが使えるかなと思い下のようなものを書いてみました。ですが、これだと最終的にD列すべて"前月レポート"の結果が反映されてしまい、#N/Aが出てしまいました。IsError=Trueは逆に"リスト"の結果が全て反映されてしまいました。
"リスト"の情報を反映した後、#N/Aのみを"前月レポート"から反映したいです。できますでしょうか?

Set rng1 = Worksheets("リスト").Range("A:V")
Set rng2 = Worksheets("前月レポート").Range("A:W")
Sheets("レポート").Range("D4:D50") = Application.VLookup(Sheets("レポート").Range("A4:A50"), rng1, 6, False)
If IsError(Sheets("レポート").Range("D4:D50")) = False Then
Sheets("レポート").Range("D4:D50") = Application.VLookup(Sheets("レポート").Range("A4:A50"), rng2, 3, False)
End If

A 回答 (3件)

こんばんは


何処に原因があるか分かりますでしょうか?
If IsError(Sheets("レポート").Range("D4:D50")) これは、範囲に対して検証しています。

他にも色々やり方が考えられますが、ご質問のロジックで考えるのなら、
Sheets("レポート").Range("D4:D50") = Application.VLookup(Sheets("レポート").Range("A4:A50"), rng1, 6, False)で出力したのち
エラーに対して
’If IsError(Sheets("レポート").Range("D4:D50")) = False Then
・・・・
End If
ではなく

If IsErrorは単セルの結果に対して実行する必要があります
のでループ処理になると思います

For Each r In Sheets("レポート").Range("D4:D10")
If IsError(r) Then r.Value = Application.VLookup(r.Offset(, -3), rng2, 3, False)
Next

Offset(, -3)が分かり難いようでしたら
= Application.VLookup(Range("A" & r.Row).Text, rng2, 3, False)
とかになります。
    • good
    • 1
この回答へのお礼

ありがとうございます。
説明まで補足いただき実行できない理由が納得出来ました。
想定していた結果にもなりました。とても助かりました。

お礼日時:2021/11/24 09:53

こんにちは



上手くいかない原因については、既出の通りでしょう。

シート関数を利用した計算を行うのなら、中途半端にワークシート関数を利用するよりも、そのまま関数を設定してしまった方が簡単ではないかと思います。
(範囲指定も無用に広いようなので、修正してあります)

Const f = "=IFERROR(VLookup(A4,リスト!A:F,6,0),VLookup(A4,前月レポート!A:C,3,0))"
Set r = Worksheets("レポート").Range("D4:D50")

r.FormulaLocal = f
r.Value = r.Value

みたいな感じでしょうか。
    • good
    • 1
この回答へのお礼

ありがとうございます。
そのまま関数を使ってもできるのですね。

お礼日時:2021/11/24 09:50

こんばんは。



直接の回答では無いかも知れませんが、
例えば、事前にCountifなどで、"レポート"が1以上かを確認して、あるなら
.VLookup(Sheets("レポート").Range("A4:A50"), rng1, 6, False) を、
なければ、
.VLookup(Sheets("レポート").Range("A4:A50"), rng2, 3, False) を
実施しては?と思いましたが、如何でしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
そういった方法もあるのですね。勉強になりました。

お礼日時:2021/11/24 09:47

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