VBAでフォルダ内のブックの特定シートのセル値をまとめる方法

このQ&Aのポイント
  • VBAを使用して、特定のフォルダ内にある複数のブックの特定シートのセルの値を抽出し、1つのブックにまとめる方法について教えてください。
  • 「予定表*.xls」ファイル内の「sheet予定*」シートに格納されている値を取得し、それを「管理表.xls」の「sheet1」に1行ずつまとめる方法を知りたいです。
  • VBAを使用して、フォルダ内の複数の「予定表*.xls」ブック内の「sheet予定*」シートの特定範囲の値を抽出し、それらを「管理表.xls」の「sheet1」に1行ずつまとめる方法について教えてください。
回答を見る
  • ベストアンサー

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*」予定のセルの範囲のみが貼り付けられて終わってしまいました。 長々と書いてしまって申し訳ありませんが、わかる方いらっしゃいましたら、ご指導いただきたいと思います。

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

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

ブックのループは出来るとして、それ以外についてのサンプル。 1つのブックをコピーします。 Sheet2はデータのない状態にしておいて下さい。 以下のコードを貼り付けます。 Sub test()  Dim ws As Worksheet  Dim r As Range  Dim v, i As Integer  v = Array("J3", "O3", "G3", "H3")  Set r = Worksheets("Sheet2").Range("A1")  For Each ws In Worksheets      If InStr(ws.Name, "予定") Then         With ws              For i = 0 To 3                  r.Offset(, i).Value = .Range(v(i)).Value              Next              r.Offset(1).Resize(32, 17).Value = .Range("B14:R45").Value              Set r = r.End(xlDown).Offset(1)         End With      End If  Next  Set r = Nothing End Sub シート名に”予定”が含まれていると、そのシートのデータをSheet2に 代入していきます。 シートが変われば順次Sheet2に続けて代入します。 ご参考になれば。

tapian
質問者

お礼

どうもありがとうございます! なんか動きました! ですが、1つ目のファイルは問題なく終わるのですが、2つ目のファイルに行ってから r.Offset(, i).Value = .Range(v(i)).Valueで止まってしまいます。 実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。 と、表示されてしまいます。 それと「シート予定*」の他に「シート予定*記入例」みたいなシートが隠れておりまして、そのシートまで拾われてしまいます。でもこれに関してはファイルの検索でも使っていたことだし、ワイルドカードでも使って対応してみようと思います。 丁寧に教えていただきありがとうございます。 助かります!

その他の回答 (4)

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

ANo.4です。 >ですが、1つ目のファイルは問題なく終わるのですが、2つ目のファイルに行ってから >r.Offset(, i).Value = .Range(v(i)).Valueで止まってしまいます。 ブックのループは一切考慮していませんので、エラーになりますね。 例えば、 Set r = Worksheets("Sheet2").Range("A1") は Set r = ThisWorkbook.Worksheets("Sheet2").Range("A1") とかブックを指定しなければなりません。 また For Each ws In Worksheets でも、どのブックのワークシート群なのかを指定しなければなりません。 基本的にサンプルですので、あとはどのように変更してエラーになったのかは、 エラーの発生した文とエラー内容のみではわからない時もあります。 全体のコードの提示が必要かと。 (提示したサンプルそのままでエラーになった場合なら、回答者側でも  検証は出来ますけど)

tapian
質問者

お礼

たびたびご迷惑をおかけしております。 本当に助かります!ありがとうございます! Set r = Nothingを消したらフォルダ内の検索はうまくいきました! また、シート名の検索も If Instr(ws.Name, "予定")Then から If ws.Name Like "*予定")Then に変更し、問題ないと思います。 ただ、ひとつだけ問題があり、sheet予定2のシートだけが、B45~R45のデータが取れないのです。おそらくsheet予定2のB43~R43が空白だからカウントされないんだと思うのですが。もう少し調べてみます!

回答No.3

他の方の回答にあるように、マクロが入っていることは関係ないと思います。 セルの結合が原因でコピペができないのであれば、マクロでセルの結合を解除してコピペすれべいいのではないでしょうか?(開いたファイルを上書き保存せずに閉じれば、元データは変更されません)もしくは、行全体をコピペするという手もあると思いますが、ダメでしょうか?

tapian
質問者

お礼

回答ありがとうございます。 結合を解除してコピペですか。 ということは書式等も初期値にしたほうがよいのでしょうか。 結局欲しいのは値だけなので、書式は関係ないでしょうか。 少し調べてみます。 どうもありがとうございます!

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

コピペより代入の方がよかったりするかも? >セルが結合されていたり どこがどのように結合されてるか見えないのでなんとも。。。

tapian
質問者

お礼

回答いただきありがとうございます。 私も代入の方がいいと思うのですが、配列というのがどうも理解できなくて・・・。 フォルダ内のファイルを検索して順番にファイルを開いていったり、該当シートをアクティブにしたりすることは何とかできたのですが、コピー、しかも限られた範囲のみというのが思うようにできません。最初はシートを管理表.xlsの空白のシートに丸々コピーしようと思ったのですが、セルが結合されていて貼り付けられなかったり、条件を変えてやってみたのですが、シート毎コピーするのはできたのですが、その次に開いたシートをコピーして、前にコピーした上に上書きみたいな状態になってしまい、先に進みません。 最終的には必要データのみを抜きたいので、シートごとのコピーはなるべく避けたいと思います。 「sheet予定*」は全て同一のフォーマットで、結合されていて値を抜き出したいセルは ・予定表1.xlsから始まると仮定して sheet予定1を選択し・・・ 「J3(J3:M3の結合)」、「O3(O3:Q3の結合)」の2箇所で、その2箇所プラス「G3」と「H3(値が"*月度"となっているので、月度を抜いて"*"だけにしたい)」の合計4項目の値を管理表のsheet1の1行目(A1~D4)に、 あとは、B14~R14の値を「管理表Sheet1の2行目(A2~Q2)へ     B15~R15の値を「管理表sheet1の3行目(A3~Q3)へ B16~R16の値を「管理表sheet1の4行目へ(A4~Q4)へ            ・            ・            ・ B45~R45の値を「管理表sheet1の33行目へ(A33~Q33) sheet予定2を選択し・・・ 「J3(J3:M3の結合)」、「O3(O3:Q3の結合)」の2箇所と、「G3」と「H3(同じく"月度"を抜く)」の合計4項目の値を管理表のsheet1の34行目(A34~D34)に、 あとは、B14~R14の値を「管理表Sheet1の35行目(A35~Q35)へ     B15~R15の値を「管理表sheet1の36行目(A36~Q36)へ B16~R16の値を「管理表sheet1の37行目へ(A37~Q37)へ              ・            ・            ・ B45~R45の値を「管理表sheet1の67行目へ(A67~Q67) sheet予定*がなくなるので予定表1.xlsを閉じる 予定表2.xlsを開く・・・ という感じで行いたいのです。 わがままなお願いかもしれませんが、よろしくお願いします。

  • spnlight
  • ベストアンサー率46% (15/32)
回答No.1

(1)管理表.xlsにすべての予定表*.xlsをリンク貼付けするとか、(予定表1.xlsのsheet予定1のB4:I4、B5:I5、B6:I6・・・を管理表.xlsのsheet1のA4:H4、A5:H5・・・にリンク張付け→sheet予定2のB4:I4、B5:I5、B6:I6・・・をA10:H10、A11:H11・・・にリンク張付け) (2)マクロで1予定表毎にファイルオープンして、データを自動でコピペするとか >結局最後にコピーした「sheet*」予定のセルの範囲のみが貼り付けられて終わってしまいました コピー→張付け→コピー→張付け・・・で出来ませんか? >セルが結合されていたり、マクロが入っていたりで どちらも影響が無いような気がするけど・・・現物見れないんで分かりませんねー

tapian
質問者

お礼

回答いただきありがとうございます。 VBAを使って、使い勝手のよいレイアウトにしようと思ってるので、リンクではなく、コマンドボタンなどで行うと思います。

関連するQ&A

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

    ブックを開かずに、フォルダ内にある複数ブックの、特定セルの値を抽出したいのですが、やり方をご存じの方がいらっしゃったら教えてください。 フォルダ内には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は初心者です。。できればコードをそのまま拝借したいです。 お知恵を貸してください。よろしくお願いします。

  • VBA 他ブックのセルの値を1セルずつ代入したい

    昨日↓でお世話になりました。 http://oshiete1.goo.ne.jp/qa4299999.html おかげさまでだいぶ先に進むことができました。 ですがまた行き詰ってしまったので、お力を借りれたらと思い質問させていただきます。 昨日ご教授いただいたコードでは、「管理表.xls」のコマンドボタンを押すと、同一フォルダ内にあるブック「*予定表*.xls」内のシート「*予定?」の固定の範囲 「G2,H2,N3,O3」を「管理表.xls、sheet2、A1:D4」に 「B14:I44」を「管理表.xls、sheet2、A2:H32」に まだファイル、シートがある場合はループでそれらの次の行に値をいれていくことができたのですが、固定範囲のうちの「G2,H2,N3,O3」を、「管理表.xls、sheet2、A2:H32」のA~D列全てに付けたいのです。 なんかわかりづらい表現になってしまいましたが、 ____A___B___C___D____E____F____G____H____I____J_____K____L 1 G2 G2 N2 O3 B14 C14 D14 E14 F14 G14 H14 I14 2 G2 G2 N2 O3 B15 C15 D15 E15 F15 G15 H15 I15 3 G2 G2 N2 O3 B16 C16 D16 E16 F16 G16 H16 I16             ・             ・             ・ という感じにしたいんです。どうかご教授お願いします。 一応コードを載せておきます。 Sub 予定() Dim Pn As String Dim Fn As String Dim ws As Worksheet Dim r As Range Dim v, i As Integer Pn = ActiveWorkbook.Path ChDir Pn Fn = Dir("*予定表*.xls") v = Array("N3", "O3", "G2", "H2") Set r = ThisWorkbook.Worksheets("Sheet2").Range("A1") Do Until Fn = "" Workbooks.Open Filename:=Fn For Each ws In Worksheets If ws.Name Like "*予定?" Then With ws For i = 0 To 3 r.Offset(0, i).Value = .Range(v(i)).Value Next r.Offset(1).Resize(31, 8).Value = .Range("B14:I44").Value Set r = r.End(xlDown).Offset(1) End With End If Next Workbooks(Fn).Close SaveChanges:=False Fn = Dir() Loop End Sub ++++++++++++++++++++ OS ⇒Windows XP Version⇒Excel 2000 ++++++++++++++++++++

  • Excelで他のブックのセルを参照したいのですが

    コンボボックスにセットする値を、 VBAで他のブックを参照してセットしたいと思っています。 ブックAのシート1にコンボボックスを作り、 ブックBのシート1から取得しようと考えています。 ブックBのシート1には、あらかじめ「範囲A」の名前を定義して この範囲の値を参照するつもりです。 ただ同じフォルダ内にブックBを置いていれば参照できるのですが、 他のフォルダにブックBを置くと参照されません。 <同じフォルダにブックBを置いた場合>○参照できた ComboBox1.ListFillRange = "[ブックB.xls]シート1!範囲A" <他のフォルダにブックBを置いた場合>×参照されない ComboBox1.ListFillRange = "C:\[ブックB.xls]シート1!範囲A" 記述の仕方がおかしいのでしょうか? 宜しければご教授お願い致します。

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

    他ブックのセル参照するのに名前をセルで指定して参照させたい。 題名が適当でないかもしれませんが、よろしくお願いします。 オフィス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というのも少々ミソです) 結果が同じなら手段はそんなには問いません。 よろしくお願いします。

  • とあるシートの複数のセルの範囲の値と、とあるフォル

    とあるシートの複数のセルの範囲の値と、とあるフォルダにあるファイル名が部分一致していたら、そのファイルを別の指定のフォルダに入れるVBAを大まかでいいので教えてください。 (1)アクティブになっているブック内にあるシートのとあるセル範囲のそれぞれの値(例:1111、2222、3333...) (2)開いていないフォルダ内にあるファイル名(例:1111-H8-32.xlsなど) が部分一致したとき、そのファイルを別のフォルダ内に移動させたいのですが、いまいちわかりません、教えていただけないでしょうか?

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

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

  • 別シートへのセル参照について

    別シートへのセル参照についての質問です。 例えばSheet1のA1,B3,C6,G9に値が入っているとします。 その値を順にSheet2のB2,C4,D9,E17に参照したいのですが、 それぞれにセル参照しないとダメなんでしょうか? Sheet1,Sheet2に違う種類の表があって、それぞれに同じ値を入力するんですが、Sheet1に入力すれば自動的に入るようにしたいです。 実際はSheetや、値を入力するセルがかなり多いので、ひとつひとつセル参照するのが大変なので・・・よろしくお願いします。

  • Excelで他Excelファイルのセルの値をVBAで参照したい時

    こんにちは。 Excelで他Excelファイルにあるセルの値をVBAで参照したい時って、 場所をどう指定したらいいのでしょうか。 やろうとしている事ですが、 c:\1.xlsに記述するVBAで c:\2.xlsのsheet1のA1の値を参照して、 それとc1.xlsのsheet1のA1の値が一致した時に、 c:\2.xlsのsheet1のB1の値を、 C:\1.xlsのsheet1のB1に書き出そうとしています。 派遣就業先でAccessで作ればいいものを なぜか社員の方たちでExcelで作ってしまったため、 そのメンテに四苦八苦しています。(笑) ご存知の方ぜひ教えてください。 よろしくお願いします!

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

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

専門家に質問してみよう