• ベストアンサー

エクセル VBA VLOOKUP

お世話になります。 VLOOKUPの範囲を変数で取得したいのですが教えて下さい。 下記コードは動きますが、検索範囲の("A1:C4")の『C4』を変数に変更はできますでしょうか。 (データは増える予定ですなので) Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range("A1:C4"), 2, False) 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.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」のように範囲を指定して計算させた方がモアベターと一般に考えられています。 マクロを使うなら「範囲を調べて限定して計算させる」のも,上述したようにその旨命令を書き足すだけのことですから。

BighooterV
質問者

お礼

ご回答ありがとうございます。 lastrow=Cells.SpecialCells(xlLastCell).Rowにして 動きました。 この記述を参考に利用させて頂きます。

その他の回答 (3)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

>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

BighooterV
質問者

お礼

ご回答ありがとうございます。 vlookupでわざとエラーをさせたところ、途中で中断しました。 エラーした際の処理も参考にさせて頂きました。

回答No.2

"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"だけを変数に出来ます。

BighooterV
質問者

お礼

ご回答ありがとうございます。 C4が変数になりますが、データが増えるのでC5 C6・・・と変数も増える事を 質問に明確に書かなかったのでお詫びします。 ありがとうございました。

回答No.1

>検索範囲の("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) として、行を指定しなければ良いだけですが、これでは駄目なのですか?

BighooterV
質問者

お礼

迅速なご回答ありがとうございます。 Range("A:C")を知りませんでしたので勉強になりました。 ありがとうございます。

関連するQ&A

専門家に質問してみよう