Excel VBA VLOOKUP 範囲を変数で指定する方法とは?

このQ&Aのポイント
  • Excel VBAでVLOOKUP()の第2引数の範囲を行と列の数値の変数で指定する方法を教えてください。
  • 以下の式がエラーにならないように具体的に直してください。
  • 愛知という値に対して、Worksheet「Sheet1」の範囲を行2から782、列3から5までとし、4列目の値を検索したいです。
回答を見る
  • ベストアンサー

EXCEL VBA VLOOKUP 範囲を変数で

Excel VBA で VLookup()の第2引数の範囲を行と列の数値の変数で指定したいのすが どのように記述すればよいでしょうか。 以下の式がエラーにならないように具体的に直していただけないでしょうか。 よろしくお願いします。 ----------------------------------- Dim d1 As String Dim d2 As String Dim r1 As Integer Dim r2 As Integer Dim c1 As Integer Dim c2 As Integer Dim c3 As Integer d1 = "愛知" r1 = 2 r2 = 782 c1 = 3 c2 = 5 c3 = 4 d2 = VLookup(d1, Worksheets("Sheet1").Range(Cells(r1, c1), Cells(r2, c2)), c3, False)

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

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは   With Worksheets("Sheet1")     .Range(.Cells(r1, c1), .Cells(r2, c2)).Select     d2 = WorksheetFunction.VLookup( _       d1, .Range(.Cells(r1, c1), .Cells(r2, c2)), c3, False)   End With で、更に、 検索対象範囲が3列しかないのに、c3 = 4となっているのはダメなので、 D列の値を知りたいのなら、c3 = 2 E列の値を知りたいのなら、c3 = 3 にして下さい。

yam2012
質問者

お礼

上記のコードで正しく動作するようになりました。 ・VLookupの前にWorksheetFunctionが必要 ・Cells()にもWorksheets("Sheet1")が必要 ・c3の値 の3つの問題の箇所がありましたが、 親切に教えていただきまして解決することができました。 ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

質問に下記を補足したら。 VBAでもVLOOKUP関数は使える。その時はApplication.WorkSheetFunction.VLOOKUP (・・)になることぐらい調べたのだろうね。 範囲指定の、c1、C2、さらにC3はどうして決まるのか質問に書かないで質問しても答えようがない。第3引数C3まで変わるの? それと範囲はこのモジュール実行中は変わらないのだろうね。 各行処理ごとに何かの要素で変わるなどのケースなら説明が必要だ。 == 動きもしない、コードなどは書かなくてよい。 簡単な実例を挙げて、どういう要素を見て、どういう結果になってほしいいかかくのが当たり前だろう。 ーー 実行中は一定の範囲なら Rangeの範囲指定にApplication.InputBoxのType 8nなんてしていもあるがご存じか。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

済みません。 確認用の余計なコード .Range(.Cells(r1, c1), .Cells(r2, c2)).Select 消し忘れました。 削除して下さい。

関連するQ&A

  • VBA vlookup 検索範囲に変数指定 

    仕事で必要となり、初めてVBAを組んでおります。行き詰まってしまい、ご相談です。 「マクロ実行.xls」にある、ボタン「実行」をクリックすると、当月データに過去データをvlookupにて貼り付けるよう組んでおります。ただ、肝心なVLOOKUPが結果を出してくれません。 検索範囲の設定と変数の関係だと思いますが・・。 '使用量(月間).txtを6つ開く Dim i As Integer Dim a0 As String Dim a As String Dim a1 As String Dim a2 As String For i = 0 To 5 a0 = Format(Now, "yyyy/mm ") a = DateAdd("m", -i, a0) a1 = Format(a, "使用量" & "yyyy" & "." & "mm") & ".txt" a2 = Format(a, "使用量" & "yyyy" & "." & "mm") '使用量(月間).txt、の場所 Dim b1 As String b1 = Application.Workbooks("実行マクロ.xls").Path & "\データ\************\" '使用量(月間).txtを開く(14配列) 省略 '月間データの編集:最終行の取得 Dim lngCount3 As Long lngCount3 = Workbooks(a1).Worksheets(a2).UsedRange.Rows.Count 途中省略 '現在一覧.txtと月間データのVLOOKUP Workbooks("現在一覧.txt").Worksheets("現在一覧").Activate Range(Cells(2, 20), Cells(lngCount3, 20)).FormulaR1C1 = "=vlookup(RC[-18],[workbooks(a1)]worksheets(a2)!R2C2:R&lngCount3&C2,5,0)" ↑ここが問題です。 next for~NEXT内でvlookupを使用する事が出来ないのか・・。 検索範囲の設定をどのように書くのか・・。 ご教授頂けると幸いです。

  • EXCEL2010エラーVBA

    下記を実行するとエラーになりEXCEL2010が終了してしまいます。 fDebug:0 offset00009391 がエラーメッセージです。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim rg As Range Dim r As Variant Dim c As Long Dim hanni1 As Range Dim atai As Range Set ws = Worksheets("あああ") Set rg = Worksheets("コード").Range("A1:B10") r = ws.Cells(Rows.Count, 1).End(xlUp).Row Set hanni1 = ws.Range(Cells(2, 2), Cells(r, 3)) Set atai = ws.Range(Cells(2, 3), Cells(r, 3)) atai = Application.VLookup(hanni1, rg, 2, False) End Sub

  • VLookupで参照する範囲を変数で渡したい

    マクロ内で開いた別ファイルにあるリストをVLookupで参照するマクロを作っています。 固定のファイルで行う場合には以下の内容で動いています。 ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-4],'070801.xls'!R1C1:R2430C6,6,FALSE)" このファイル名[070801.xls]とセル範囲(行数がファイルによって違う)のを変数で渡す必要があります。 #細かい部分は割愛しています。 Workbooks.Open Filename:=Fname, ReadOnly:=True 'ファイル読み込み Range("A1").CurrentRegion.Select 'データ全体選択 Selection.SpecialCells(xlCellTypeLastCell).Select '最終行検出 endRcell = ActiveCell.Row ********ここの間に入る処理 ********多分「Range(Cells(1, 1), Cells(endRcell, 6))」など ThisWorkbook.Activate Range("H2").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-4],?????,6,FALSE)"                              ↑ここに指定する変数 2カ所について、どのように指定すればよいのか分かりません。 色々試してみたのですが・・・・ よろしくお願いいたします。

  • VBA VLOOKUPとセルのコピーができません

    助けてください マクロでVLOOKUPを使い、データを持ってこようとしてますが上手くいきません やりたいこと:Sheet3(在庫を貼付)にある4列目の数値を、Sheet1のG列で照合し、Sheet1の9列目に持ってきたい Sheet1:cells(6,9)にVLOOKUPの式を入れる 関数で言えば=VLOOKUP($G,Sheet3!C:F,4,FALSE) cells(6,9)をcells(7,9)からcells(2000,9)までコピー これを実行すると 「アプリケーション定義またはオブジェクト定義のエラーです。」 とでて止まってしまいます ActivesheetsやWorkbooks、WorksheetsやSheetsで設定したりしてもエラーは変わりますが 止まってることには変わりありません どうしたら動くようになりますか? Sub vlook() Dim Nname As String macx = "ルーチンワーク20130223.xlsm" 'マクロ用ファイル「ルーチンワーク20130223.xlsm」がある Sheets(1).Select Workbooks(macx).Activate Worksheets(1).Activate ddir = Cells(33, 2) 'cells(33,2)にフォルダ情報がある Nname = Dir(ddir & "在庫推移.xlsx") '在庫推移.xlsxというVLOOKUPしたいファイルがある Workbooks.Open Filename:=ddir & Nname Workbooks(Nname).Activate Sheets(1).Select Worksheets(1).Activate 'VLOOKUPで在庫を持ってくる ActiveCell.FormulaR1C1 = "=VLOOKUP(RC7,'在庫を貼付'!C[-6]:C[-3],4,FALSE)"   '自動記録マクロから持ってきてます Worksheets(1).Activate Sheets(1).Select Range(Cells(6, 9)).Copy Destination:=Sheets(1).Range(Cells(7, 9)) 'この行でエラーが出る

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • 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

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • エクセルVBA VLOOKUPについて

    エクセル VBA初心者です。 関数でのVLOOKUPをVBAで作りたいのですが、上手くいきません。 あらかじめ、Sheet2の1から300行までに A列  / B列 商品名 / 商品コード が入力されています。(名前の定義=商品コード) Sheet1にユーザーフォームを利用して、データを書き込んだ後、 B列に商品名が書き込まれると、 A列に商品コードが表示されるようにしたいと考えています。 A列に =IF(B2="","",VLOOKUP(B2,商品コード,2,FALSE)) と入力していたのですが、 VBAでIfを使って出来ないかと考えてみたのですが、 上手くいきませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sRow As Long Dim sColumn As Long sRow = ActiveCell.Row sColumn = ActiveCell.Column If Cells(sRow, 2).Value = True Then Cells(sRow, 1).Value = WorksheetFunction.VLookup(Cells(sRow2).Value, Worksheets("Sheet2").Range("A1:B300"), 2, False) ElseIf Cells(sRow, 2).Value = " " Then Cells(sRow, 1).Value = " " End If End Sub ご教授いただけないでしょうか? エクセル2003 WindowsXP

  • エクセルVBAでの変数

    いつもお世話になります。 今回の『壁』は”変数”です。 変数の中に更に変数を持たせることはできますか? 何をしたいかと言いますと… dim mon1 as string dim mon2 as string dim mon3 as string dim mon4 as string dim mon5 as string dim tue1 as string dim tue2 as string …というように月曜から日曜までの頭3文字プラス1~5の組み合わせの変数を作りたいのですが、 この調子で作っていくと35コになってしまいます。 そこで、曜日の頭3文字より後ろは決まって1~5のため、 dim i as integer for i = 1 to 5 next i …と組み合わせられないかと思ったのです。 どなたか知恵をお貸しください。 よろしくお願いします。

  • 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 ---------------------

専門家に質問してみよう