• ベストアンサー

vlookup関数の引数を変数で指定することはできますか?

エクセルのVBAでマクロを組み、同じフォルダ内にあるファイルにvlookup関数でリンクを張ろうかと考えています。 ファイルの構成は以下の通りです。 マクロを組んでいるファイル:Book1.xls マクロが適応されるファイル:Book2.xls vlookup関数で参照されるファイル:Book3.xls 実際にBook1に組んだマクロは以下の通りです。 Workbooks.Open ThisWorkbook.Path & "\Book2.xls" Workbooks("Book2.xls").Activate myFile = ThisWorkbook.Path & "\" & "Book3.xls" b = 2 Do Until ActiveSheet.Cells(b, 1) = "" ActiveSheet.Cells(b, 6) = "=VLOOKUP(E" & b & ",myFile!$A:$F,5,0)" b = b + 1 Loop 上記マクロで実行すると、Book2が開き、vlookup関数が挿入されるところまではいきますが、 変数myFileが正常に変換されないらしく、ファイルが見つからない状態となってしまいます。 myFileの代わりにフルパスでファイルをしていすると正常にマクロは起動することは確認しましたが、 毎回作業するフォルダが変わる為、フルパス指定はできるだけ避けたいです。 基礎的な質問で恐縮ですが、 vlookup関数の引数(参照範囲)を変数で指定する方法を教えてください。 よろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 数式を入れる時には、ActiveSheet.Cells(b, 6) のような暗黙のプロパティはやめたほうがよいです。以下は、FormulaLocal を使用していますが、通常、Formula だけで、R1C1 方式でも入力可能です。また、変数というなら、変数の宣言の習慣は付けたほうがよいですね。 実際のマクロはエラー処理や開いたブックの場合の二重のオープンの部分を避けるようにはしますが、テスト用として割愛しておきます。 相対参照の数式の場合は、ループは使いません。範囲を選択して、同じ数式を入れればよいです。その場合は、R1C1 方式のほうが便利です。 '標準モジュール Sub Test2() Dim wb1 As Workbook Dim wb2 As Workbook Dim myFile As String   On Error Resume Next   Set wb1 = Workbooks.Open(ThisWorkbook.Path & "\Book2.xls")   Set wb2 = Workbooks.Open(ThisWorkbook.Path & "\Book3.xls")   myFile = "[" & wb1.Name & "]Sheet1"   wb1.Activate '本来は、ここが曖昧。Sheet の指定が必要   With Range("A2", Range("A65536").End(xlUp))     If .Count > 1 Then     .Offset(, 5).FormulaLocal = "=VLOOKUP(RC[-1]," & myFile & "!C1:C6,5,0)"     End If   End With   Set wb1 = Nothing: Set wb2 = Nothing End Sub

その他の回答 (4)

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

VBAとVLOOKUPの組み合わせは余り必要ない。 Findメソッドなどによって検索が行われればすむ。 ーー VLOOKUP関数の第1引数は、即実行するため使うときは E" & b & ", になっているが、Range("E" & b),とでもなるのではないか? シートの関数の場合はE3と書いても、VBAで使うときはRange("E3")のような書き方が必要と思うが。 ーー 「検索範囲のあるファイル」のセル範囲は、そのアリ場所のブックを変えられるように、考えているようにしているのは良いとして、シートの指定はどうなっているのか。 他ブックを指定したら式を入れるシートであってもシート名を 指定しないといけないのでは。 ーー また、検索範囲のあるファイルのセル範囲は、 これもRabge(・・・)で指定しないとダメでは。 ーー 今までの経験から、こんなこが問題かと思うが、質問の書き方が荒くて(セルに式の挿入の問題か?こういうのはリンクというのかな?式を挿入したりしないでVBAで処理できるのでは) 式をVBAで埋め込むなら、Ccells(・・).Formula="式”のようになるはず。上記ならValueとして文字列を入れているのでは。 例 Sub test01() Cells(1, 1).Formula = "=A2+A3" End Sub ーー 質問の標題を文字通り受け取ると、 >vlookup関数の引数を変数で指定することはできますか VLOOKU関数には4つ引数が有る。 第何引数のことかを書かないと質問にならない。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

>ご指摘の通り、""(ダブルクォーテーション)で囲むと変数と宣言していても、文字列と判断されてしまいます。 ActiveSheet.Cells(b, 6) = "=VLOOKUP(E" & b & ",myFile!$A:$F,5,0)" この行しかありませんが

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

下記のようではだめなのか。 Sub test() Workbooks.Open ThisWorkbook.Path & "\Book2.xls" Workbooks.Open ThisWorkbook.Path & "\Book3.xls" Workbooks("Book2.xls").Activate myFile = "[Book3.xls]Sheet1" b = 2 Do Until ActiveSheet.Cells(b, 1) = "" ActiveSheet.Cells(b, 6) = "=VLOOKUP(E" & b & "," & myFile & "!$A:$F,5,0)" b = b + 1 Loop End Sub

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

変数を""で囲ってしまっては単に数式の文字列になってしまいませんか?

taku_2148
質問者

補足

回答ありがとうございます。 ご指摘の通り、""(ダブルクォーテーション)で囲むと変数と宣言していても、 文字列と判断されてしまいます。 ただ、ご指摘の""で囲っているとはどこの部分を指しているのでしょうか? 今回変数を使用したいのは、ファイル名のmyFileと言う変数です。 分かりにくくて申し訳ございません。

関連するQ&A

  • 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カ所について、どのように指定すればよいのか分かりません。 色々試してみたのですが・・・・ よろしくお願いいたします。

  • こんにちは。VLOOKUP関数の引数で「範囲」を選択するとき、他のパス

    こんにちは。VLOOKUP関数の引数で「範囲」を選択するとき、他のパスにあるファイルの参照の仕方についてお尋ねします。 例えば、VLOOKUP関数を使って以下のパスにあるファイルを参照するとします。 ▼パス        :C:\作業 ▼フォルダ名     :作業 ▼ファイル名     :参照先.xls ▼参照するシート名:シート1 関数を入力して保存して再び開くと、このようになります。 =VLOOKUP(A1,'C:\作業\ [参照先.xls]シート1'!$A$2:$F$10,3,FALSE) このパス・ファイル名・シート名をどこかのセルに入力しておき、参照先のフォルダが変わったとしても「パス」を入力するセルの値を変えることで、可変的に参照できるようにしたいと思っています。 例えばA10のセルで、範囲の引数である文字列を <A10のセルの値>'C:\作業\ [参照先.xls]シート1'!$A$2:$F$10 というようにつなげて作成し、 =VLOOKUP(A1,A10,3,FALSE) とやってみましたが参照できるわけもなく、うまい方法はないかなと悩み中です。 わかる方からの回答をお待ちしています。

  • VBAにおいて、""内で変数を使用したい

    VBAにおいて、""内で変数を使用したい 0864_001.xls 0864_002.xls … 0864_009.xls というファイルがあるとき、0864_001.xlsを開く→処理→閉じる→0864_002.xlsを開く→… というように処理をしたいと思い、以下のようなマクロを作成しました。 Sub Test() Dim i As Integer For i = 1 To 9 Workbooks.Open ThisWorkbook.Path & "\0864_00i.xls" 処理 閉じる Next i End Sub 実行しようとしてもファイルを開くことが出来ずに困っています。 ""内で変数を使うことは出来ないのでしょうか? また、どのようにすれば実行できるようになるのか教えてください。

  • エクセル マクロ ファイル名を変数指定したいのですが?

    マクロ超初心者です。 何方かご存知の方教えてください。 起動しているエクセルのファイルを変数で定義して参照したいのですがうまくいきません。下記は何処が悪いのでしょうか? 因みにB N Namaeは変数指定してます。 Worksheeetsは参照します。最後はセルコピーの構文です。 マクロ構文 Workbooks("月報 & B.xls").Activate Worksheets(N & "月").Select Cells.Find(What:=Namae, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 0).Resize(RowSize:=405, ColumnSize:=4).Select Selection.Copy

  • 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を使用する事が出来ないのか・・。 検索範囲の設定をどのように書くのか・・。 ご教授頂けると幸いです。

  • エクセルVBAでパスの¥マークについて

    このマクロを記述したBOOKと同じフォルダー内にある、シート001.xls を開くマクロです。 同一フォルダーにあるのですから、このような記述になると思います。 Sub kakunin1() Workbooks.Open (ThisWorkbook.Path & "\" & "シート001.xls") End Sub しかし、以下の3つはすべてシート001.xls を開くことができました。 Sub kakunin2() Workbooks.Open (ThisWorkbook.Path & "\" & "\" & "シート001.xls") End Sub Sub kakunin3() Workbooks.Open (ThisWorkbook.Path & "\" & "\" & "\" & "シート001.xls") End Sub Sub kakunin4() Workbooks.Open (ThisWorkbook.Path & "\" & "\" & "\" & "\" & "\" & "\" & "シート001.xls") End Sub パスの¥マークは階層をあらわすのだと思っていましたがいくつ重ねてもなぜ開くのでしょうか?非常に初歩的な質問だと思いますが、ご教示いただければ幸いです。

  • 変数を名前に使ったシートにデータをコピーする方法

    いつもお世話になります。 hisworkbookにあるVBAから新たに開いたmyFileにデータをコピーさせようとしています。 myFileである統合.xlsにはあらかじめ該当するシートが作成されています。 myBushoとmyGroupはそれぞれセルの値を参照しています。 それを元に対応するシート名にデータのコピーをしたいのです。 当初workbooks(myFile)をactiveworkbookにしていたのですが、うまくコピーされなかったので、 ファイルパスを記述しました。 sub test() dim cnt as long dim lcnt as long dim myFile as string dim myBusho as string dim myGroup as string cnt = ThisWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row lcnt = ActiveWorkbook.Sheets(myBusho & "_" & myGroup).Cells(Rows.Count, 1).End(xlUp).Row myFile = "C:\統合.xls" myBusho = range("A1").value myGroup = range("A2").value ThisWorkbook.Sheets("Sheet1").Range(Cells(9, 1), Cells(cnt, 21)).Copy _ Workbooks(myFile).Sheet(myBusho & "_" & myGroup).Cells(lcnt + 1, 1) end sub 上記のコードではうまくコピーできませんでした。 よろしくアドバイスのほど、お願いします。

  • エクセルVBAで複数の変数に、パス、ファイルを格納しOpenする方法

    よろしくお願いします。 環境:Excel2003 以下のような形でファイルを開きたいのですが、変数を繫げる方法がわかりません。 *A1はファイルへのパス *A2はファイル名 hoge_path = ActiveSheet.Range("A1").Value hoge_filename = ActiveSheet.Range("A2").Value Workbooks.Open hoge_pathとhoge_filenameを繫げた変数 また、ファイル名がaaの場合、aa*.xls(aabb.xlsやaa1111.xls)も開ける形にもしたいと思っています。 よろしくお願いいたします。

  • エクセルVLOOKUP関数の参照先に関して

    エクセルのVLOOKUP関数に関する質問です。 BOOK(1)とBOOK(2)(それぞれは別フォルダに入っています)があり、 BOOK(1)の中でVLOOKUP関数を用いて、BOOK(2)からデータを参照しています。 参照先のBOOK(2)は管理者以外読み取り専用となっていますが、 たとえ保存できなくても誰かがデータを書き換えたり、別名で保存したりすると、VLOOKUPの参照結果も、書き換え後のデータ(別名保存したファイル)になってしまうようです。 希望としては、VLOOKUPの参照先であるBOOK(2)を固定したいです。 この件に関して、対処法はありますでしょうか。

  • VLOOKUPの範囲指定

    同じことを以前にお聞きしたのですが質問の仕方が分かりにくく解答を下さった 皆様にご迷惑をおかけしました。 今回は画像を添付いたしました。以下の疑問にアドバイスをいただければ幸いです。 なお、マクロを作る関係上、セルの指定をR1C1参照形式にしております。 管理.cells(7,5)に番号を入力すると該当クラスのその番号の生徒氏名が表示されるように、 管理.cells(7,6)にVLOOKUP関数を入れたいのですが、クラスごと別のシートのため、範囲指定が うまくいきません。 以前質問した時に何人かの方に教えていただいたINDIRECT関数を使ってもうまくいきませんでした。 シート名(クラス名)を変数として範囲を指定できないでしょうか。 教えていただければ大変助かります。 よろしくお願いいたします。

専門家に質問してみよう