• 締切済み

ブックを開かずに、フォルダ内にある複数ブックの、特定セルの値を抽出した

ブックを開かずに、フォルダ内にある複数ブックの、特定セルの値を抽出したいのですが、やり方をご存じの方がいらっしゃったら教えてください。 フォルダ内には150個ほどエクセルファイルがあり、中身のシート名・フォーマットは同じなのですが、すべてファイル名が違います。 ファイルを開くことなく、これらのファイルの特定のシートの特定のセルにある値を、全て1枚の表にまとめることは可能でしょうか? フォルダ名 →"AGENDA_RIREKI" 参照したいファイル名 →ファイルによって異なる "#1111 AAA.xls"など 参照したいシート名→ "AGENDA" 参照したいセル→ "A7" と "E20~E70(E列のみ) データをまとめたいファイル名→ "AGENDA_matome.xls" データをまとめる時の形↓ (A列)          (B列)            (C列)        (D列) ファイル1のA7の値 ファイル1のE20の値  ファイル2のA7の値  ファイル2のE20の値                     E21の値                    E21の値                     ・                     ・                     ・     VBAは初心者です。。できればコードをそのまま拝借したいです。 お知恵を貸してください。よろしくお願いします。

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1でご紹介のあったExecuteExcel4Macroで遊んでみました。 ファイル名、シート名、アドレスを指定して、値をVariant型変数に取得し、セルに貼付ます。 こんな事をやるより、#2の様に処理する方がきっと速いと思います。 なお、VarTypeで分岐して処理しないと、001→1、日付→シリアル値になってしまうといった問題があり、深みにはまってしまいます。(そこまでは対策していません) Sub test() Dim rtnVariant As Variant Dim destRange As Range Set destRange = ActiveSheet.Range("A1") '読んだ値(一個または複数)をA1から貼り付ける場合 rtnVariant = readDatas("c:\hoge.xls", "Sheet1", "A1:D1") If IsArray(rtnVariant) Then Set destRange = destRange.Resize(UBound(rtnVariant, 1), UBound(rtnVariant, 2)) destRange = rtnVariant Else destRange.Value = rtnVariant End If End Sub 'Activesheetのセル範囲をVariant配列生成と、アドレス変換用に使用してみました(中味の値はいじらない) Function readDatas(wbFullpath As String, sheetName As String, addressA1 As String) As Variant Dim argString As String Dim myPath As String Dim buf As Variant Dim i As Long, j As Long On Error GoTo errorHandle myPath = "'" & Left(wbFullpath, InStrRev(wbFullpath, "\")) myPath = myPath & "[" & Mid(wbFullpath, InStrRev(wbFullpath, "\") + 1, Len(wbFullpath)) & "]" myPath = myPath & sheetName & "'!" With ActiveSheet If .Range(addressA1).Cells.Count > 1 Then buf = .Range(addressA1) With .Range(addressA1) For i = 1 To UBound(buf, 1) For j = 1 To UBound(buf, 2) argString = myPath & .Cells(i, j).Address(ReferenceStyle:=xlR1C1) buf(i, j) = ExecuteExcel4Macro(argString) Next j Next i End With Else argString = myPath & .Range(addressA1).Address(ReferenceStyle:=xlR1C1) buf = ExecuteExcel4Macro(argString) End If End With readDatas = buf Exit Function errorHandle: '2023 ファイルまたはシートが見つからない readDatas = Err.Number & " " & Err.Description End Function

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

Application.ScreenUpdatingで画面更新を制御できますから 開いている事を感じさせないようにする事は可能です。 '標準モジュールに。 Option Explicit Sub try_1()   Const path = "C:\AGENDA_RIREKI\"   Const sname = "AGENDA"   Dim fname As String   Dim ws  As Worksheet   Dim i   As Long   '画面更新停止。開くところを見せない。   Application.ScreenUpdating = False   Set ws = Sheets.Add   i = 1   'Dir関数を使って該当フォルダをLoop   fname = Dir(path & "*.xls")   Do Until Len(fname) = 0     If fname <> ThisWorkbook.Name Then       With Workbooks.Open(Filename:=path & fname, _                 UpdateLinks:=0, _                 ReadOnly:=True)         With .Sheets(sname)           ws.Cells(1, i).Value = .Range("A7").Value           ws.Cells(1, i + 1).Resize(51).Value = .Range("E20:E70").Value         End With         .Close savechanges:=False       End With       '次の書き出し位置       i = i + 2       '列オーバーなら新規Sheetへ       If i > ws.Columns.Count Then         i = 1         Set ws = Sheets.Add       End If     End If     fname = Dir()   Loop   Set ws = Nothing   Application.ScreenUpdating = True End Sub Dir関数を使ったLoop処理について勉強してください。 Bookオープン等の処理はマクロ記録なども参考に。 また、速度を上げたいなら参照数式をセットして値化すれば良いです。 Sub try_2()   Const path = "C:\AGENDA_RIREKI\"   Const sname = "AGENDA"   Dim fname As String   Dim i   As Long   Sheets.Add   i = 1   fname = Dir(path & "*.xls")   Do Until Len(fname) = 0     If fname <> ThisWorkbook.Name Then       With Cells(1, i)         '='C:\AGENDA_RIREKI\[Book1.xls]AGENDA'!A7..みたいな式         .Formula = "='" & path & "[" & fname & "]" & sname & "'!A7"         '値化         .Value = .Value       End With       With Cells(1, i + 1).Resize(51)         .Formula = "='" & path & "[" & fname & "]" & sname & "'!E20"         .Value = .Value       End With       i = i + 2       If i > Columns.Count Then         Sheets.Add         i = 1       End If     End If     fname = Dir()   Loop End Sub

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

他の質問異も書いたがことだが、 基本的にソフトで作られたデータは、そのソフトで開かなければ、内容を読めません。コンピュターのメモリにないデータは、読めないのがコンピュターの鉄則です。エクセルでもそんな開かないでデータを採るなんて、素人は考えないこと。えてして良くわかってない人が出来るのではないかと幻想を抱く。(Excel4.0マクロと言うものに、これの例外と思しきことが出てくるが、これも画面に表示しないが、メモリに保存データを展開して、必要なデータ部分を割り出していると思われる。これは専門家ならではで出来ること、フォーマットがわかっている人に出来るこで、VBAを始めたぐらいの人には不可能) ーー ブックを開く 読むー>でーた(情報)をとるー>書き出す クロズする 個の繰り返し。 迷わずやること。 それがイヤなら初めからそういうデータ項目だけをし集約しファイルをつくることだ。 データベース化してそういうことはやっている。  勉強してください。 エクセルごときでやろうとするから時間がかかるのだ。 データベースで検索が早いのは、それまでに仕組みの構築に時間と手間をかけているからだ。

関連するQ&A

  • 複数あるブックの特定シートの特定範囲を1つにしたい

    EXCEL2010を使用しています。 あるフォルダに格納されている複数のブックの、特定シートを、1つのシートにまとめたいです。 複数のブックの作りは同じです。 1つのブックに、複数シートがあり、"(配置)"というシートだけを、新規のシートにまとめたいです。 <今ある各ブック> ファイル名は、2014年度特定措置_●●.xlsで、●●だけ、ブック名が違います。 シート名が"(配置)"です。 c3セルに部署名が入っています。 b4セルからe10セルまで数式が入っています。 <行いたいこと> 新規のシートのa列に、各ブックにあるc3セルの部署名を持ってきたい。 b列からe列に、各ブックにあるb4セルからe10セルまでの数式を値張りし、取り込みたい。 以上です。 つたない説明で恐縮ですが、大変困っております。 どうか、ご回答の程、どうぞよろしくお願いいたします。

  • 複数のエクセルブックから特定シートの特定セル抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル値を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 よく似ている質問、回答を読んだのですが、私のレベルではとても応用できず質問させていただきます。 【前提】 ・実行する端末のOSはWindows XP(SP3)、Excelは2003 ・対象フォルダはネットワーク接続フォルダ「\データ解析\データ」  この中に、複数のExcelブックがあります。 ・抽出したい対象は、各ブック内のシート(シート名はファイル名と同じ)の「BO6からBW16までの□の範囲」で統一されています。 【抽出一覧作成イメージ】 ・「集計.xls」ブックの「Sheet1」の2行目から抽出した結果を一覧表示する。 ・表示はA列に抽出元ブック名(=ファイル名)、B列に抽出元BO6セルの値。以降,C列・D列と 順に値を入れていきたい。 ・BO6~BW16までのセル値を「集計.xls」ブックの「Sheet1」に貼り付ける際には「値で貼り付ける」が望ましい。 というようなイメージです。 とても勝手なお願いではありますが、宜しくお願いいたします。

  • 複数のExcelブックから特定シートの特定セル抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル値を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 よく似ている質問、回答を読んだのですが、私のレベルではとても応用できず質問させていただきます。 全く同じものがあれば、そのアドレスを回答いただくだけでも助かります。 【前提】 ・実行する端末のOSはWindows XP(SP3)、Excelは2003 ・対象フォルダはネットワーク接続フォルダ「\\share\target」  この中に、複数のExcelブックがあります。 ・抽出したい対象は、各ブック内の「概要」シートの「C3」セルで統一されています。 【抽出一覧作成イメージ】 ・「集約.xls」ブックの「Sheet1」の2行目から抽出した結果を一覧表示する。 ・表示はA列に抽出元ブック名(=ファイル名)、B列に抽出元C3セルの値。 ・C3セル値を「集約.xls」ブックの「Sheet1」に貼り付ける際には「値で貼り付ける」が望ましい。 というようなイメージです。 とても勝手なお願いではありますが、宜しくお願いいたします。

  • 他ブックのセル参照するのに名前をセルで指定して参照させたい。

    他ブックのセル参照するのに名前をセルで指定して参照させたい。 題名が適当でないかもしれませんが、よろしくお願いします。 オフィス2000もしくは2002です。 200604.xls、200605.xlsという日付を基にした名称の規則的なブックがあります。 ファイル自体はネットワークの共通ドライブにあります。 それぞれsheet1に同様の形式で値のデータ(文字)が入っています。 その中のA1、B1、C1~・・・の値を 別ブック(仮にtest.xls)のA1に2006、A2に5と入力させることによって test.xlsの3行目に200605.xlsのA1、B1、C1~・・・の値を表示させたいです。 ブック名 test.xls    A列  B列  C列 ・・・・・・ 1行 2006 2行  5 3行 200605.xlsのA1、B1、C1~の値を表示させたいです。 4行 フォルダー名\[200605.xls]sheet1'!A1、次B1、次C1、と都度埋め込んでいけば値自体は出るのですが、 ブック名が手軽に変えられなくて困っています。 test.xlsのセルに埋め込んだ ='フォルダー名\[200605.xls]sheet1'!A1の [カッコ内]の文字をA1,A2セルに入れた値で参照させたいのですが、、、。 (A2は5ですが、参照したいのは2006の05というのも少々ミソです) 結果が同じなら手段はそんなには問いません。 よろしくお願いします。

  • 参照先をセルに入力して、他のブックのセルを参照する方法

    Excelで、他のブックのセルを参照したいです。 たとえば、あるExcel(test.xls)上から、別のフォルダにある複数のブック C:\AAA.xls D:\BBB.xls の値を参照する場合ですが(AAA.xlsとBBB.xlsは、値の内容は違うが、同じシート名の同じセルに値が入っている)、 test.xlsのSheet1のA1に「C:\」、A2に「AAA.xls」を入力すると、test.xlsのSheet2にはAAA.xlsの値を表示し、 test.xlsのSheet1のA1に「D:\」、A2に「BBB.xls」を入力すると、test.xlsのSheet2にはBBB.xlsの値を表示するような方法です。 参照先が固定であれば、='C:\[AAA.xls]Sheet名'!D5・・・のような指定ができるのですが、参照するファイル名とパス名が都度変わるので、入力したセルの値で参照先を変えたいのです。 ちなみに、INDIRECTを使うやり方も考えましたが、参照先のブックを開いていないと値が表示されないようなので、却下されました。 (参照先のブックは開かなくても値を参照させたいです) どなたかご存知の方がいらっしゃったら、教えてください。 よろしくお願いします。

  • 複数のExcelブックから特定シートのセル範囲抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル範囲を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 このサイトで殆どよく似た回答を読んだのですがうまくいきません。VBA初心者です。 よろしくお願いします。 【前提】 ・実行する端末のOSはWindows 10 ExcelはOffice365 ProPlus ・対象フォルダはネットワーク接続フォルダ  この中に、複数のExcelブック(xlsx、xlsm)があります。 ・抽出したい対象は、各ブック内の「台帳」シートの「A3:Cの最終行」で  複数のブックの中には「台帳」シートが含まれていないブックも混在しています。 【抽出一覧作成イメージ】 ・「集約.xlsm」ブックの「集計」シートの2行目から抽出した結果を一覧表示する。 ・「集約.xlsm」ブックにマクロは登録する ・表示はA列に抽出元ブック名(=ファイル名)、B列からD列に抽出元「A3:Cの最終行」セルの値。 ・「A3:Cの最終行」セルの値を「集約.xlsm」ブックの「集計」に貼り付ける際には「値で貼り付ける」が望ましい。

  • VBA フォルダ内の特定ブック内のシートを特定し、それらのセルの値を全て1つにまとめる

    はじめまして。 excel2000ですが・・・ 以下の過去ログと類似しているのですが、 http://oshiete1.goo.ne.jp/qa4134321.html 管理表.xlsと同一フォルダ内に、 予定表1.xls (sheet1, sheet予定1, sheet予定2, sheet2) 予定表2.xls (sheet1, sheet予定2, sheet予定3, sheet2) 予定表3.xls (sheet1, sheet2, sheet予定1, sheet予定5) 予定表4.xls (sheet1, sheet予定4, sheet予定2, sheet2) 予定表5.xls (sheet予定2, sheet予定1, sheet1, sheet2) ・ ・ ・ (管理表.xlsもあります) が、あるとします。 フォルダ内の全ての「予定表*.xls」ブックの中の「sheet予定*」シートの一定の範囲の値を「管理表.xls」の「sheet1」にまとめたいと思っています。 ここでやっかいなのが、「sheet予定*」は、同一のフォーマットなので、まとめやすいと思ったのですが、セルが結合されていたり、マクロが入っていたりで、なかなか思うようにペーストできません。必要なのは値だけなので、「Sheet予定*」の一定範囲(B4:I4、B5:I5、B6:I6・・・)の値を「管理表.xls」の「sheet1」のそれぞれ1行ずつ(例えばA4:H4、A5:H5・・・)にまとめていきたいです(コピペではなく参照の方がよいのでしょうか)。 自分でやろうとして色々調べながらできたのは、フォルダ内のファイル名「予定表*.xls」の取得のみです。「sheet予定*」の値の参照もやってみましたが、上書きされ、結局最後にコピーした「sheet*」予定のセルの範囲のみが貼り付けられて終わってしまいました。 長々と書いてしまって申し訳ありませんが、わかる方いらっしゃいましたら、ご指導いただきたいと思います。

  • VBA 複数ブックへ書き込み

    VBA初心者です。 1つのフォルダ内にある100(ファイル名001から100)個のエクセルファイル(ブック)の特定の場所(すべてのエクセル ファイルはファイル名は違うが、同一のシート名で同一のセルの構造になっている。 以上に対して、1つのもとになるファイルA(ブック、シート)の特定のセル(同一列の行を上から順次下る)セルの値を先の同一フォルダ内のエクセルファイル100(001~100)個に対して、ブックオープン、特定セルのデリート、特定セルへの書き込み、ブック保存という一連の作業を行いたいです。 多数のファイルから1つの集計ファイルに値を読み込んできて書き込むサンプルはあるようですが、逆に1つのファイルから同一フォルダ内の多数のファイル(ブック)の特定場所に書き込むためのサンプルコードを教えていただけると大変助かります。 以上よろしくお願いいたします。

  • エクセル 他BOOKへの参照式 セル位置情報

      他BOOKへの参照を設定しているリンク内のセル情報を自BOOKの特定セルのValueを当てはめる方法についてですが、 例えば、 =D:\フォルダA\[他BOOK名.xls]シート名!自BOOKの特定セルの値 とリンクを設定します。 この中の「自BOOKの特定セルの値」のところに 例えば、自BOOKのA4セルに入っている値であるA25と入れたいのですが どういう式を組めばいいでしょうか。 よろしくお願い致します。  

  • 複数のブックから特定データ群を新ブックにまとめたい

    こんにちは。 EXCEL2007について、ご教示ください。 EXCEL2007で、複数ブック内の特定シート上にある特定のデータ(複数) を特定ブックにまとめたいのですが、うまくできずに悩んでいます。 <やりたいこと>  ・参照元は特定フォルダ内にある全ファイルが対象(100程度)  ・ブック内の特定シートが対象(シート名は  ・コピー   (1) 元シートのA4~F4セル(セル結合されています)のデータを、     先シートのB2セルへコピー   (2) 元シートのG4~L4(セル結合)のデータを、先シートのC2セル     へコピー   (3) 元シートのG6~R6セルのデータを、先シートのE2セルへコピー  ・コピー2   次ブックを読み込み、1行下(B3、C3、E3)にコピーする。  ・コピー3   以降1行下にコピーし、ファイルが無くなるまで繰り返す。 以上ですが、マクロでできるように教えていただけないでしょうか。 よろしくお願いいたします。

専門家に質問してみよう