• ベストアンサー

エクセル VBA VLOOKUP

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

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答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・・・と変数も増える事を 質問に明確に書かなかったのでお詫びします。 ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8522/19371)
回答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

  • VLookupで一致しなかった時のVBAでの処理

    On Error ~を使わないで、 VLookup()で一致しなかった時の処理をさせたいのですが どのように記述すればよいでしょうか。 例えば、以下のようなコードの場合、 一致したデータがない時にyに-1を代入するには 以下のコードをどのように記述すればよいのでしょうか。 --------------------- Dim x As Integer Dim y As String x = 7 y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) --------------------- 以下はいずれもエラーになりますが、以下のような感じで処理がしたいです。 --------------------- If IsError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- y = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False), -1) --------------------- なお、以下のように本来エラーではない処理で On Error Resume Nextを使うのは、 本当のエラーの処理と混同するため不可 --------------------- On Error Resume Next y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) If Err <> 0 Then y = -1 On Error GoTo 0 ---------------------

  • vba vlookupについて

    VBAで範囲検索をしたくて、 vlookuを使おうと思ったのですが 1000~2000 2001~3000 3001~4000 4001~5000 5001~6000 6001~7000 7001~8000 8001~9000 9001~10000 このような表から 1237 を検索しようとすると失敗してしまいました(・・;) wskyu.Range("D24") = Application.WorksheetFunction.VLookup(kihon, .Range("D:H"), 5, True) このコードでエラーは起きず、 kihonに1237が入っています 1000 2001 ↑がD列です H列は 309 359 406 569 630 680 700 703 904 こんな感じです 思い通りにいけば1237を検索するので当てはまるのは1列目で 309が表示される予定だったのですが 実際やってみると630が表示されました、、、 なぜなのでしょうか そもそもVLOOKUPでこのような検索方法はできないのでしょうか? 補足として 最初はSELECT CASEを使い 1000~2000の間にあれば 309を表示 という風にしていたので 表などが間違っているのではないようです しかしそれだとコードがとても長くなってしまうので VLOOKUPにしようと思いました どうかよろしくお願いします!!

  • VBA WorksheetFunction.VLookupとoffsetプロパティー

    エクセル2002使用です。 VBAの記述で、WorksheetFunction.VLookupを使って求めた値の入っているセルの列方向に一つ下の値を取得したいのですが・・・・ range("A1").Value =WorksheetFunction.VLookup( range("B1").Value, Range("A3:C10"), 3, 1) 例えば上記で得た値がC4セルにあるのであれば、C5セルの値を取得したいのです。 offset(0,1)プロパティーをどこにおけば良いのか良くわかりません。 どうかよろしくお願いします。

  • エクセルVBAで、VLOOKUP関数を使うとエラーが出る

    Excel97を使用しています。 ユーザーフォームを作っています。 下記のコードで、課名に対応した部名を表示させようとしたのですが、 「WorksheetFunctionクラスのVlookupプロパティを取得できません」 と出てきてしまいます。 Private Sub CB_課名_AfterUpdate()  LB_部名.Caption = Application.WorksheetFunction.VLookup(CB_課名, "部", 2, False) End Sub CB_課名はコンボボックス、LB_部名はラベル、 "部"は名前を付けたセル範囲です。その1列目はCB_課名のRowSourceで、2列目が部名です。 VBAでVlookup関数を使ったコードを公開されているサイトがありましたので、使えないことはないと思ったのですが、どこか書き方がおかしいのでしょうか? ご存知の方、どうぞよろしくお願いいたします。

  • VBAでVLOOKUP関数を使う

    「在庫検索」に下記条件を追加するには、どうすれば良いのでしょうか。 1)G列が1500より大きければ Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 2, False) 2)G列が1500より小さければ Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 3, False) どちらの際も空白の条件、If ActiveCell.offset(i, 1).value = ""は残ります。 1)、2)とandを組み合わせる方法でチャレンジしたのですが、出来ませんでした。 ------------------------------------------------------------------------ 以下がベースの「在庫検索」です。 一度、質問して解決したのですが、更なる問題が発生してしまいました。 ご指導ください。 ------------------------------------------------------------------------ Sub 在庫数検索() Dim SerchName As String Dim SerchArea As Range Dim Results As Variant '初期設定 Range("A2").Activate ItemCode = Range("A2").Value i = 0 '検索範囲の設定(ポイント1) Set SerchArea =Worksheets("シート2").Range("List1") '商品コードが空になったら終わり Do Until ItemCode = "" If ActiveCell.offset(i, 1).value = "" Then '★1 On Error Resume Next ItemCode = ActiveCell.offset(i, 0).value Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 2, False) If Err <> 0 Then Results = "" ActiveCell.offset(i, 1) = Results End If '★1 i = i + 1 Loop

  • VBA VLOOKUP 別のファイルを参照

    VBA VLOOKUP 別のファイルを参照 いつもこちらでお世話になっている者です。 VBAの勉強をしております。 別のファイルからVLOOKUPで値を参照したいのですが、 範囲を指定してみましたが、 「worksheetFunctionクラスのVlookupプロパティを参照できません」 とのメッセージが出てしまいます。 なお、値は空白になる行もありますので、 if関数で回避してみましたがうまくいきません。 いろいろ試しましたが、何度やってもうまくいかないので こちらに質問させていただきました。 お詳しい方、ご伝授いただければ助かります。 よろしくお願い致します。 環境はExcel2007です。 Sub sample() Dim 範囲 As Range Dim wb As Workbook, wb2 As Workbook Dim r As Integer,intRow As Integer Workbooks.Open Filename:="***.xlsm" Set wb = ThisWorkbook Set wb2 = ActiveWorkbook Set 範囲 = wb2.Sheets("PvtSht2").Range("Database3") r = wb.Sheets("sheet1").Range("A28:N28").End(xlToRight).ColumnintRow = 3 With wb.Sheets("sheet1") Do Until .Cells(intRow, 1).Value = "" .Cells(intRow, (r + 1)) = Application.WorksheetFunction.If((Application.WorksheetFunction.VLookup(Cells(intRow, 1), 範囲, 2, False)) = 0, "", Application.WorksheetFunction.VLookup(Cells(intRow, 1), 範囲, 2, False)) intRow = intRow + 1 Loop End With End sub

  • エクセルマクロでvlookupが上手く出来ない

    お世話になります。 現在、エクセルで読み込んだエクセルファイルのセル上のデータ と変換表のデータが一致したときに変換データを返すというマクロ を組んでいるのですが上手く動きません。 具体的には、 .Cells(W_ROW, 39) = xlAPP.WorksheetFunction.VLookup(WS_ORGN.Cells(R_ROW, 4), Worksheets(KANJO_CODE).Range("A2:D24297"), 4, False) という内容で、エラーで Err.Number 9 : インデックスが有効範囲にありません。 となってしまいます。 かなり困っています。よろしくお願いします。

  • 日付セルをVBAのVLOOKUPで見つけられません

     今日は、質問させていただきます。どうぞよろしくお願いいたします。  環境:Excel2010+Win7 でございます。  今、A列の日時データの中から、特定の日時のセルの行を取得しようといたしまして、下記のようにコーディングいたしました。が何故か WorksheetFunction.CountIfでは見つかっているのですが WorksheetFunction.VLookupではエラーが帰ってまいります。 【A列のデータ】(ユーザ定義で「yyyy/mm/dd hh:mm:ss.000」としております。) 2015/05/16 22:00:00.002 2015/05/16 22:00:00.182 2015/05/16 22:00:00.342     :     : 【VBA】 Sub test()  Dim WS_DATA As Worksheet  Set WS_DATA = ThisWorkbook.Worksheets("Sheet1")  With WS_DATA   str時間 = "2015/05/16 22:00:00.002"   If WorksheetFunction.CountIf(.Range("A:A"), str時間) > 0 Then    MsgBox (Application.WorksheetFunction.VLookup(str時間, .Range("A:A"), 1, False)) '←ここでエラーになります   Else  MsgBox str時間 & "がリストに存在しません。"   End If  End With End Sub 【実行結果】  コード中に記しましたエラー箇所で、 「実行時エラー1004   WorksheetFunctionクラスのVlookupプロパティーを取得できません」となります。検索範囲内に見つからない場合のエラーのようでございます。  あとVBAに 日時 = Format(str時間, "yyyy/mm/dd hh:mm:ss.000") を追記して、この「日時」を探してみましたが、同じ結果になりました。。。 (CountIfでは見つかっていますが、Vlookupではエラーになります。)  データが大量にありますので高速に検索出来る方法を探しておりますが (=おそらく、VLookUpを使うか、もしくはA列をVariant型に入れて検索する?)、 何か良い方法はないものでございましょうか?  もしお詳しい方がいらっしゃいましたら,是非アドバイスいただきたく 何卒よろしくお願いいたします。

  • VLOOKUP関数をエクセルVBAで使いたいのですが、

    VLOOKUP関数をエクセルVBAで使いたいのですが、 式が間違っているのかどうかは分かりませんが実行できませんでした。 式は以下の通り、書きました。 どこが違うかご指摘願います。 よろしくお願いします。。 'VLOOKUPを行う Sheets("過去履歴").Range("BJ6").Value = Application.WorksheetFunction.Vlookup(Sheets("登録書").Range("A2").Value,Sheets("過去履歴").Range("B6:BG65536"),1,0)

  • Excel2010 VBAについて

    以下のソースを書いて実行したのですが 「実行エラー'1004' WorksheetFunctionクラスのVlookupプロパティを取得できません」 と表示されます Sub 時刻表示() '日本の時間と選択した年の時刻・時差を1秒ごとに表示しなおす Dim City As String Dim Jisa As Long Application.ScreenUpdating = False City = Range("C6").Value Jisa = WorksheetFunction.VLookup(City, _ Worksheets("都市リスト").Range("B3:C14"), 2, False) Range("E7").Value = Jisa Range("C4").Value = Now Range("C7").Value = DateAdd("h", Jisa, Now) Range("C4, C7").NumberFormat = "m/d h:mm:ss" Application.ScreenUpdating = True Application.OnTime Now + TimeValue("0:00:01"), "時刻表示" End Sub Sub 時刻表示終了() '時計を止める Application.OnTime Now + TimeValue("0:00:01"), "時刻表示", Schedule:=False End Sub デバックをすると Application.OnTime Now + TimeValue("0:00:01"), "時刻表示", Schedule:=False がマーカーで引かれます 一応本通りには打ったと思うのですが、、、。 どこが間違えているか教えてください

専門家に質問してみよう