エクセルマクロで別ファイルの数値を参照する方法

このQ&Aのポイント
  • エクセルのマクロを使って別ファイルの数値を参照する方法について教えてください。
  • 具体的には、現在開いているファイルから別のファイルの特定のセルの値を取得したいです。
  • INDIRECT関数を使わずに、マクロ(VBA)を使って参照する方法を教えてください。
回答を見る
  • ベストアンサー

エクセルのマクロで、別ファイルの数値を参照する方法

現在aaa.xlsというファイルを開いていて、 そのセルA1には20070621という数値が入っています。 別にbbb_20070621.xlsというファイルがあって、 そのファイルのsheet1内の、B1の値を参照したいと思います。 bbb_20070621.xlsのようなファイルが無数にあるので、 ファイルを開かなければいけないINDIRECT関数は使いたくありません。 =INDIRECT("[bbb_"&A1&".xls]Sheet1!B1") ファイルを開かず参照できるように、 できればマクロ(VBA)で組みたいと思っています。 RangeやCellでいろいろ試してみたのですが、 どうもうまくいかず、 分厚いマニュアルにも書いてありませんでした。。 初歩的な質問ですいませんが、 どなたかよろしくお願いします。

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

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

こんにちは。 >変数を使わず、 初歩的な内容ですから、少しじっくりと考えれば答は出てくるはずです。 ただ、変数を使わず、マクロに代入というのは、リテラル値(文字列)といいますが、ミスが多くなります。なるべく、そのような方法は変数が見極めるようになってからしたほうがよいです。VBAの基本は、変数の型をきちんと入れます。 セルから取る場合は、一旦、変数で受けて、それを代入させます。 ("'c:\data\file\" & "[bbb_" & A1 & ".xls" & "]" & Sheet1!B1) これは、VBAの書き方ではありませんから、それ自体の書き方でエラーになってしまいます。 シート2 のA1 に、ファイル名を、アドレスを、シート1 のB1 に入れるには、以下のような書き方になります。しかし、VBAは、ワークシート関数とは、まったく違う種類のものですから、その考え方を変えないと、VBAを使いこなすのは大変です。 '標準モジュールがベターです。 Sub TestR() Dim myPath As String Dim xlFile As String Dim myAddress As String  myPath = "c:\data\file\"  xlFile = "bbb_" & Worksheets("Sheet2").Range("A1").Value  myAddress =Worksheets("Sheet1").Range("B1").Value  MsgBox getDirectData(myPath, xlFile, myAddress) End Sub Function getDirectData(myPath As String, Fname As String, oAddress As String) 'ダイレクトにxlファイルから値を取り出すサブルーチン関数 Dim r1Address As String Dim myData As Variant Dim k As Integer On Error GoTo ErrHandler r1Address = Mid$(oAddress, 1, InStr(oAddress, "!") - 1) & "'!" & _       Range(oAddress).Address(1, 1, xlR1C1)          If Right(myPath, 1) <> "\" Then myPath = myPath & "\"   k = InStr(Fname, ".xls")   If k > 0 Then    Fname = Mid$(Fname, 1, k - 1)   End If     myData = ExecuteExcel4Macro _     ("'" & myPath & "[" & Fname & ".xls]" & r1Address)   If Not IsError(myData) Then     getDirectData = myData   End If ErrHandler: End Function

kenny100
質問者

お礼

御礼が遅くなってすいません。 ご丁寧にありがとうございます! >しかし、VBAは、ワークシート関数とは、まったく違う種類のものですから、 >その考え方を変えないと、VBAを使いこなすのは大変です。 そうですよねー。。 でも教えていただいたものを応用して、何とかいけそうです。 心より感謝いたします!<(_ _)>

その他の回答 (2)

  • K-19
  • ベストアンサー率30% (3/10)
回答No.2

ほかのエクセルのシートのある値を参照するには、 bbb_20070621.xlsのSheet1のB1からB9までにデータが入ってます。 aaa.xlsのSheet1のA1に bbb_20070621.xlsのSheet1のB1の値を参照するには、 A1のセルに ='C:\Documents and Settings\user1 \My Documents\[bbb_20070621.xls]Sheet1'!$B$1 と記入すればよいのでは?? 'C:\Documents and Settings\user1 \My Documentsはbbb_20070621.xlsが格納されている場所を 指示します。 bbb_20070621.xlsを開かなくてもできますよ。 試してみてください。

kenny100
質問者

補足

こんにちは、早速ありがとうございます! 説明の言葉足らずで申し訳ありません。。 ファイルは日々追加されていきますし、 今後条件式などを入れて処理が複雑になっていきますので、 変数を使ったマクロを組みたいと思っています。

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

こんにちは。 二種類の方法があります。 ひとつは、データベース・オブジェクトを使って取り出す方法です。 もうひとつは、古い方法ですが、 Sub getClosedData() Dim myPath As String Dim FName As String Dim ShName As String Dim MyData As Variant Dim myRow As Long Dim myCol As Integer myPath = Application.DefaultFilePath & "\" 'デフォルトパス FName = "Test01.xls" ShName = "Sheet1" myRow = 1 myCol = 2  'B1の値を取り出す     MyData = ExecuteExcel4Macro _     ("'" & myPath & "[" & FName & "]" & ShName & "'!R" & myRow & "C" & myCol)   If Not IsError(MyData) Then     MsgBox MyData   End If     End Sub >ファイルを開かず参照できるように、できればマクロ(VBA)で組みたいと思っています。 可能なのですが、今まで、私がせっかくコードを書いても評価は受けたことがありません。より複雑になるからだとは思います。実際に、どういう手順になるのか、良く考えてからやってみると良いです。そういう私も、この方法を掘り下げて考えたことがありません。

kenny100
質問者

補足

こんにちは、早速ありがとうございます! 少し応用しまして、変数を使わず、 下記のように書いてみましたが、エラーになってしまいます・・。 MyData = ExecuteExcel4Macro _ ("'c:\data\file\" & "[bbb_" & A1 & ".xls" & "]" & Sheet1!B1) こういう使い方は許されないのでしょうか・・。

関連するQ&A

  • セルのデータを使って、ファイルを参照する方法

    現在aaa.xlsというファイルを開いていて、 そのセルA1には20070620という数値が入っています。 別にbbb_20070620.xlsというファイルがあって、 そのファイルのshhe1内の、B1の値を参照したいと思います。 こんな感じかなと想像したのですが、うまくいきません。。 ↓ =["bbb_" "& A1 &"".xls"]sheet1!B1 初歩的な質問ですいませんが、 どなたかよろしくお願いします。

  • Excelでの外部ファイル参照

    環境:windowsXPPro、Excel2000 初めまして。 Excelの外部ファイル参照で悩んでいることがあり解決方法を模索中です。 基礎値.xls、集計.xls というBookがネットワーク上のファイルサーバーにあるのですが 集計.xlsに基礎値.xlsの値を参照する式がセルに設定されています。 [=vlookup(a1,'\\server\[基礎値.xls]Sheet1'!$A$1:$B$50,2,false)] 2つのファイルが同じサーバーのフォルダーにある場合は問題ないのですが、 集計値.xlsを各ローカルPCに移動して使用したところ基礎値.xlsの参照先が [=vlookup(a1,'c:\job\[基礎値.xls]Sheet1'!$A$1:$B$50,2,false)] となってしまいサーバー上のファイルを参照してくれません。 VBAなどで細工すれば解決はすると思いますが、マクロ・VBAを使わないで運用しなくてはなりません。 ファイルを移動させても参照先フォルダーを固定させるよい方法はないでしょうか?

  • Excel2007で外部ファイルを参照したい

    やりたい事は、以下のような事です。 1.A.xlsの a1 セルに抽出したい番号を入れます。(ex:11) 2.この時、別フォルダに(ex: D:aaa\a11\)にある、別ファイル(ex: b11.xls)のa1から情報を抜き出したいのです。 3.A.xlsのa1に12を入力した時は D:aaa\a12\b12.xls から情報を抜き出す。 試した事を以下に書きます。 1. A.xlsのb1セルに ="'d:aaa\"&a1&"\["&"b"&a1&".xls]sheet1'!$A$1" と書き 2. A.xlsのc1セルに =INDIRECT(b1,TRUE) とした場合 3. A.xlsのa1セルに 10 を入力すると 4. b10.xls を開いていれば正常に参照できます。 5. b10.xls を閉じていると、#REF! とエラーになってしまいます。 こういう場合、関数では無理がある… ならば VBAやマクロで可能なら、その方法を御教え下さい。

  • excelマクロ 別ファイルの特定列をコピーしたい

    C:\testの配下にexcelファイル「aaa.xls」「aaa_yyyymmdd.xls」「bbbxls」があります。 「aaa_yyyymmdd.xls」は「aaa.xls」のバックアップファイルです。 又、「bbbxls」にマクロを記述しようと思います。 ☆処理内容☆ 「aaa.xls」「aaa_yyyymmdd.xls」が開いていない状態で、「aaa.xls」のシート「sheet1」内の E列をコピーして「bbbxls」のシート「sheet3」のA列に貼り付け。 「aaa_yyyymmdd.xls」のシート「sheet1」内の E列をコピーして「bbbxls」のシート「sheet3」のB列に貼り付け。 その後、張り付けたA列を正としB列と比較して、差異があった場合はB列の差異があった部分の セルに色つけをした後、「aaa_yyyymmdd.xls」をC:\test:\oldフォルダに移動する。 上記のようなexcelマクロを作成中なのですが、できなくて困っております。 有識者の方、助けを貸してください。 よろしくお願い致します。

  • エクセル2000マクロ検索方法

    Aのファイル a.xls シート名 aaa Bのファイル b.xls シート名 bbb Aのファイルに下記のデータベースがあります。   A列 B列   0001 100   0002 200   0004 300 Bのファイルに下記のデータベースがあります。   A列 B列   0001 300   0002 200    抽出条件方法 AのファイルとBのファイルのA列を参照して違うものだけを、Aのファイルから 別のファイルに取り出す方法をマクロでの記述方法を教えてください。 別のファイルに取り出すデータは、下記の通リです。   A列 B列   0004 300 以上よろしくお願いします。

  • ■マクロを使い別のワークブック&シートを参照して表示させる

    ■マクロを使い別のワークブック&シートを参照して表示させる AとBのワークブックがあり、集計をしてワークブックBシートaに( ) の中身を入れたい場合マクロで記述するにはどうしたらいいでしょうか ? ワークブックA(出荷部門報告) No. 商品番号 注文数 出荷完了(1:完了、0:未完) 1  AAA   50   1 2  BBB   30   0 3  CCC   10   1 4 DDD 20 0 ワークブックB シートa(管理) 未出荷商品番号 残必要数 必要日数 (BBB)    (15)  (1) (DDD) (19)  (19) シートb(生産部門報告) 商品番号 生産完了  BBB 10 BBB 5 CCC 10 DDD 1 シートc(調達部門報告) 商品番号 生産必要日数/1 AAA   25 BBB   30 CCC   3 DDD   1 <ワークブックBシートaに入るのは出荷未完(0)のみ> <シートb、cは追加(変更)されていきます> 質問で意味が分からない部分がありましたら、追加いたしますのでよろ しくお願い致します。

  • エクセルのファイルを絶対参照したい

    各ファイルを1つのファイルにリンクさせたいのですがファイル名を絶対参照ってできるのですか? (例) A1=[BOOK1.xls]sheet1'!$A1 B1=[BOOK2.xls]sheet1'!$A1… A1=[BOOK1.xls]sheet1'!$A2 B1=[BOOK2.xls]sheet1'!$A2… A1=[BOOK1.xls]sheet1'!$A3 B1=[BOOK2.xls]sheet1'!$A3…       :             :       :             : 

  • エクセルのマクロで作成した関数を他のエクセルのファイルから参照できるのですか?

    エクセルVBAに関して質問です。 a.xlsというファイルに複数のシートがあり すべてのシートにあるデータと「計算」ボタンがあります。 「計算」ボタンを押下すると、マクロが実行され 計算結果が同じシートに表示されます。 データの内容はシートごとに違いますが、 「計算」ボタンで呼び出したいマクロはすべて同じです。 この「計算」ボタンを押すと実行されるマクロを b.xlsに記述したいのですが、 (他のエクセルのファイルにも使いまわしたいので) そのようなことは可能なのでしょうか。 またどのようにマクロを記述すればこのマクロを 呼び出すことができるのでしょうか。 分かりにくい文章で申し訳ございませんが ご教授くださるとうれしいです。

  • エクセルマクロでコピーの質問です。

    エクセルマクロでコピーの質問です。 こんにちわ^^; よくわからないエラーが起こっているため困っています。 1.xlsという別のエクセルを開いて指定のセルをコピーし、貼り付けるということで下記のマクロを作ってみました。 ちなみにマクロを書いたファイルはsum.xlsで、1.xlsのコピーしたいセルには数値のみ入っています(書式は会計)。 Sub before() Workbooks.Open Filename:="c:¥aaa¥1.xls" Range("a1:a5").Copy ActiveWindow.Close Range("a1").PasteSpecial End Sub しかし、このマクロをThisWorkbookに貼り付けると文字列として保存されてしまいます。 そこで最後の行を Range("a1").PasteSpecial Paste:=xlValues にするとエラー400が出ます。 一応、sheet1(sheet1)に貼り付けて実行してみたところ、コピー自体ができませんでした。 まだ余りエクセルマクロを理解していないため、なぜなのかが良くわからないのでアドバイスをお願いいたします。 ちなみに使っているのはoffice2003のエクセルです。

  • マクロ:エクセルVBAでのワークシート関数の参照について

    VBA内でワークシート関数を使用する際の、引数の参照について困っています。 満たしたい条件は、 (1)マクロ実行後のシート上においても、セル選択状態で数式「=B1*sum(A1:A3)」 といったように、「値」ではなく、「数式」が入力されているようにしたい。 ↑ Application.WorksheetFunction.Sum(・・・は使えない? (2)上記例のB1およびA1:A3については、マクロ内のユーザ入力によって位置が変わり、C1にもD1にもなり得るので、 cells(1,1)="=B1*sum(A1:A3)" といった「B1」[A1:A3]的な参照を使いたくない。 イメージとしては、 sub sample() number = inputbox("数字を入力してください") cell_a = inputbox("セル1") cell_b = inputbox("セル2") yourrange = range(cells(cell_a,1),cells(cell_b,1) cells(1,1)="=number*sum(yourrange)"・・・※ end sub みたいなことをしたいのですが、※のようなことを する方法はありますでしょうか? 説明が下手なもので、補足等あれば随時いたします。 使用環境はWindows2000、Office2000です。 よろしくお願いします。

専門家に質問してみよう