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

お世話になります。

VLOOKUPの範囲を変数で取得したいのですが教えて下さい。

下記コードは動きますが、検索範囲の("A1:C4")の『C4』を変数に変更はできますでしょうか。
(データは増える予定ですなので)

Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range("A1:C4"), 2, False)

宜しくお願い致します。

A 回答 (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」のように範囲を指定して計算させた方がモアベターと一般に考えられています。
マクロを使うなら「範囲を調べて限定して計算させる」のも,上述したようにその旨命令を書き足すだけのことですから。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

lastrow=Cells.SpecialCells(xlLastCell).Rowにして
動きました。

この記述を参考に利用させて頂きます。

お礼日時:2011/12/01 13:52

>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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

vlookupでわざとエラーをさせたところ、途中で中断しました。
エラーした際の処理も参考にさせて頂きました。

お礼日時:2011/12/01 13:55

"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"だけを変数に出来ます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

ありがとうございました。

お礼日時:2011/12/01 13:51

>検索範囲の("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)

として、行を指定しなければ良いだけですが、これでは駄目なのですか?
    • good
    • 0
この回答へのお礼

迅速なご回答ありがとうございます。

Range("A:C")を知りませんでしたので勉強になりました。

ありがとうございます。

お礼日時:2011/12/01 13:48

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A