- ベストアンサー
エクセル VBA VLOOKUP
お世話になります。 VLOOKUPの範囲を変数で取得したいのですが教えて下さい。 下記コードは動きますが、検索範囲の("A1:C4")の『C4』を変数に変更はできますでしょうか。 (データは増える予定ですなので) Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range("A1:C4"), 2, False) 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まぁ,ヒトによって趣味もありますが,自分なら dim lastRow as long lastrow = range("A65536").end(xlup).row range("E1") = application.vlookup(range("D1").value, range("A1:C" & lastrow), 2, false) ぐらいにします。 どこをどう調べたら「一番下」を確定できるのか,実際のデータシートを見ながらマクロを書きます。 #「変数」にせずにrange("A:C")を検索対象範囲にして計算させてしまうのも,たしかに一つの合理的な解決策と思います。 ただVLOOKUP関数のFALSEの計算は「重たい」のが常ですので,可能なら「A1:C4」のように範囲を指定して計算させた方がモアベターと一般に考えられています。 マクロを使うなら「範囲を調べて限定して計算させる」のも,上述したようにその旨命令を書き足すだけのことですから。
その他の回答 (3)
- mu2011
- ベストアンサー率38% (1910/4994)
>VLOOKUPの範囲を変数で取得したい ⇒ワークシート関数ならば、Range("A:C")で十分ではないでしょうか ところで、このVLOOKUPコードの場合、見つからないとマクロが中断し、以降の処理が できません。 対応としては、次の様にコードを変更すれば、エラー(#N/A)が戻されるので以下のような 方法があります。 resurt = Application.VLookup(Range("D1"), Range("A:C"), 2, False) If IsError(result) Then エラー処理 else Range("E1") = result 因みにこの程度の抽出なら自作してみるのは如何でしょうか。 一例です。 For i = 1 To cells(Rows.Count,"A").End(Xlup).Row If Cells(i,"A") = Cells(1,"D") Then Cells(1,"E") = Cells(i,"A").Offset(0,1).Value Exit For Endif Next
お礼
ご回答ありがとうございます。 vlookupでわざとエラーをさせたところ、途中で中断しました。 エラーした際の処理も参考にさせて頂きました。
- Cor_moriyan
- ベストアンサー率41% (92/221)
"A1:C4" は、文字列なので。String型の文字列で扱えば良いです。例えば Dim strRANGE As String strRANGE = "A1:C4" Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range(strRANGE), 2, False) なら、同じ意味の式になりますね。 strRANGE = "C4" Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range("A1:" & strRANGE), 2, False) とすれば、"C4"だけを変数に出来ます。
お礼
ご回答ありがとうございます。 C4が変数になりますが、データが増えるのでC5 C6・・・と変数も増える事を 質問に明確に書かなかったのでお詫びします。 ありがとうございました。
- chie65536(@chie65535)
- ベストアンサー率44% (8770/19899)
>検索範囲の("A1:C4")の『C4』を変数に変更はできますでしょうか。 できます。 dim Hanni as string とでも定義して、どこかで Hanni = "A1:C4" と代入しておいて Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range(Hanni), 2, False) にすれば良いです。 >(データは増える予定ですなので) データが増える為に行数が不定で、かつ、データが入っている下に別の表が無いのであれば、変数にする必要は無く、単に Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range("A:C"), 2, False) として、行を指定しなければ良いだけですが、これでは駄目なのですか?
お礼
迅速なご回答ありがとうございます。 Range("A:C")を知りませんでしたので勉強になりました。 ありがとうございます。
お礼
ご回答ありがとうございます。 lastrow=Cells.SpecialCells(xlLastCell).Rowにして 動きました。 この記述を参考に利用させて頂きます。