VBAでExcelファイルのシートを集計する方法

このQ&Aのポイント
  • ExcelのVBAを使用して、同じフォルダ内の複数のExcelファイルから特定のシート(「結果」という名前)をコピーし、別のExcelファイル(集計.xls)の対応するシートに貼り付ける方法を教えてください。
  • ループ処理を使用して、最初にコピーしたシートを「集計.xls」の1番目のシートに貼り付け、2番目にコピーしたシートを2番目のシートに貼り付けるように、シートの数だけ繰り返す方法を教えてください。
  • 初心者ですが、自分で試行錯誤してみましたが、解決策が見つからずに行き詰っています。お手伝いいただけると助かります。
回答を見る
  • ベストアンサー

VBA どのように記述すれば良いか教えてください。

はじめて、質問させていただきます。 まだExcel VBAの勉強を始めたばかりの者です。 下記のようなツールを作ることになったのですが、非常に困っています。どなたかわかる方がみえましたら、どうか教えて下さい。(Excel2003を利用) <すべてAという同じフォルダ内> book1.xls book2.xls ・  ・ book*.xls →ファイル数は変動します。集計.xls以外のファイルはすべて同じシート名で構成されて         います。すべてのファイルのシート名 ”結果”が対象です。 集計.xls →このファイルにマクロを作りたいです。        シート名が1、2、3・・と116まで用意されています。 __________________________________________________________________________________________________________________________________ Aフォルダ内の複数ファイルの同じシート名(”結果”)というシートのみコピーをし、同じフォルダ内のファイル「集計.xls」のシートへ値貼り付けをしたいのですが、 一番初めにコピーしたシートを「集計.xls」の1という名のシートへ値貼り付け、2番目にコピーしたシートは「集計.xls」の2という名のシートへ値貼り付け。。3番目にコピーしたシートは「集計.xls」の3という名のシートへ値貼り付け。。というのを、シート数分繰り返す。。という記述を教えて頂きたいのです。 ループ??ですが、【一番初めにコピーしたシートを「集計.xls」の1という名のシートへ値貼り付け】 次に【2番目にコピーしたシートは「集計.xls」の2という名のシートへ値貼り付け】というのを一連の流れにしてループ処理したいのです。 こんなこと出来るのでしょうか??  初心者とはいえ丸投げは駄目だと、1週間ほどネットやいろいろなテキストで自分で何とかできないかと頑張ってみたのですが、部分部分しか記述できず時間だけが過ぎていき。。すっかり行き詰ってきてしまいました。 どうかお力を貸してください。宜しくお願い致しますm(uu)m

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

  • ベストアンサー
回答No.1

サンプルのコードをご紹介します。 注意点は下記の通りです。 ・「book*.xls」の*は、1から始まる連番であること、また半角であること。  2や3から始まる場合、また1・2・3・5などの場合はうまく処理できません。 ・集計BOOKのシート名も1から始まる連番であること、また半角であること。 ・格納フォルダ名やファイル名(「book」部分)が変更になる場合は  変数にセットする文字列も変更して下さい。 指定された対象フォルダーを検索してファイル名を取得し処理を行ったり 集計BOOKのシートも自動でその都度自由に作成したりすることもできますが 質問者さんはご自分で勉強しながらという姿勢をお持ちのようでしたので あえて「ベタ」なマクロにしています。 今後、少しずつ覚えながら工夫していって下さい。 では、頑張って下さい! ※※回答内容確認画面では、ソースコードのインデントがうまく表示されず   左揃えになっています。(恐らく確認後もそうなると思われる)   見にくいかも知れませんが、コピペ後に適切にインデント設定をして下さい。 Sub Sample_Macro() ' ' フォルダー内のBookファイルを順に開き、「結果」シートの内容を取得 ' 当Bookファイル(集計)のシートにその内容を展開する ' ' 変数の定義 ' -------------------------------対象フォルダー設定用変数 Dim FolderName As String ' -------------------------------対象ファイル設定用変数1(「book」部分) Dim Filename As String ' -------------------------------ループ用変数(兼「book*.xls」の「*」部分用) Dim FileCounter As Integer ' -------------------------------対象ファイル設定用変数2(「book*.xls」) Dim TargetName As String ' ' -------------------------------処理対象フォルダー名をセット(末尾に「\」付加) FolderName = "D:\A\" ' -------------------------------処理対象ファイル名(前半固定部分)をセット Filename = "book" ' -------------------------------ループ用カウンターを初期化 FileCounter = 0 ' --------------------------------------------------画面更新OFF Application.ScreenUpdating = False ' --------------------------------------------------警告画面表示OFF Application.DisplayAlerts = False ' --------------------------------------------------ループ処理開始 Do FileCounter = FileCounter + 1 ' --------------------------------------------------対象ファイル名の組み立て TargetName = Filename & FileCounter & ".xls" ' --------------------------------------------------対象ファイルの存在チェック '                           存在しなければ下記の処理結果表示処理へ If Dir(TargetName) <> "" Then ' ************************************************** '   対象ファイルが存在するためコピー処理開始 ' ************************************************** ' ----------------------------------------------対象ファイルをオープン Workbooks.Open FolderName & TargetName ' ----------------------------------------------対象シートを選択 Sheets("結果").Select ' ----------------------------------------------対象シート全てを選択しコピー Cells.Select Selection.Copy ' ----------------------------------------------集計用ファイルを選択 Windows("集計.xls").Activate ' ----------------------------------------------貼り付け用シートを選択(「book*.xls」の「*」部分) Sheets(FileCounter).Select ' ----------------------------------------------コピー内容を貼り付け Cells.Select ActiveSheet.Paste ' ----------------------------------------------対象ファイルをクローズ Workbooks(TargetName).Close Else ' ************************************************** '   対象ファイルが存在しないため '   終了メッセージを表示し処理を終了 ' ************************************************** ' ----------------------------------------------ループ件数をチェック If FileCounter > 0 Then ' ----------------------------------------------1件以上の処理が実施された場合は、処理件数を表示 MsgBox FileCounter - 1 & " ファイルの処理が完了しました" Else ' ----------------------------------------------処理が実施さなかった場合は、対象ファイルが存在しないことを表示 MsgBox "対象ファイルが存在しません" End If ' ----------------------------------------------ループ脱出 Exit Do End If Loop ' --------------------------------------------------画面更新OFF Application.ScreenUpdating = True ' --------------------------------------------------警告画面表示OFF Application.DisplayAlerts = True End Sub

noirff
質問者

お礼

うわぁぁあ。。 すごいです。。まさかこんなに早く回答を頂けるとは思ってなかったことと、本当に丁寧な解説までして下さって。。感激です(><)ありがとうございます!! あの。。実は質問の際、付け加え忘れてしまったのですが、book1.xls、book2.xls・・は会社別の名前がついたファイルなのです。でもこれはblue_rumbleさんの回答にあったように「ファイル名(「book」部分)が変更になる場合は変数にセットする文字列も変更して下さい。」で対応出来る(出来るのか不安ですが頑張ります!)と思いますが、Aフォルダの中のファイルは100近くある時もあるので、フォルダを開かないで「集計表.xls」のみ開いてマクロを実行したいのです。。充分すぎる回答頂いて再質問で恐縮なのですが、もしもお分かりになれば是非教えてくださいm(uu)m m(uu)m

その他の回答 (1)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

#blue_rumble さんへ >ソースコードのインデントがうまく表示されず  VBE での インデント は 半角スペース によって整えられていますので、こういう掲示板に コピペ されるときには、一旦、メモ帳 などで「半角スペース×2個」→「全角スペース×1個」に置換されるとよいです。  さて、noirff さんへ >質問の際、付け加え忘れてしまったのですが。。。  折角の良回答も無駄になってしまいますねぇ~。。。  ところで、お尋ねの件では、 1)Aフォルダ 内の ファイル をどうやって総ざらえするか 2)各ファイル の「結果」シート を「集計.xls」にどうやって コピー するのか が問題になるかと存じます。  (1) に付きましては、[Dir 関数] を利用するのが普通かと存じます(ただし、#1さんがお示しの用途とは異なります)。  コードウィンドウ に「dir」と書いて [F1] キー を押下すると、[Dir 関数] の ヘルプ が開きますので、ご参考にご覧ください。  (2) に付きましては、「結果」シート に 他のシート を参照するような計算式があるのかないのかによっても操作の難易度が変わってくるかと存じますが、 >シート名が1、2、3・・と116まで用意されています。 とお書きのように、予め 116 もの シート を用意しておいて、そこに コピー するというよりは、「結果」シート 自体(内容ではなくて、シート そのもの)をそのまま「集計.xls」に コピー して、リネイム する方が簡単かと存じます(この点に付きましては、noirff さんの用途にもよりましょうから、何とも申せませんが。。。)。  ということで、下記のような具合で、「集計.xls」に Aフォルダ 内のすべての「*.xls」ファイル の「結果」シート を コピー できます(ただし、コピー 後の シート名 は元の ファイル名)。 1)「Aフォルダ」がどこなのかを指定 2)画面更新の抑止 3)「Aフォルダ」内の "*.xls" ファイル の総ざらえ開始 4)コピー元 の ファイルを開く(ただし、「集計.xls」以外) 5)「結果」シート が存在しない場合の エラートラップ 6)「結果」シート を「集計.xls」にそのまま コピー 7)「結果」シート が存在する場合は「Err.Number = 0」となるので、   コピー された「結果」シート の名前を コピー元 のファイル名 にリネイム 8)コピー元 のファイル を閉じる 9)次の ファイル を探す 10)画面を更新 Sub macro()  Const Aフォルダ As String = "D:\hoge\"  Dim myName As String  Application.ScreenUpdating = False  myName = Dir(Aフォルダ & "*.xls")  Do While myName <> ""   If myName <> ThisWorkbook.Name Then    Workbooks.Open Aフォルダ & myName    On Error Resume Next    Workbooks(myName).Worksheets("結果").Copy After:=ThisWorkbook.Worksheets(1)    If Err.Number = 0 Then     ActiveSheet.Name = Replace(myName, ".xls", "")    End If    On Error GoTo 0    Workbooks(myName).Close   End If   myName = Dir  Loop  Application.ScreenUpdating = True End Sub  では、ご健闘をお祈り申します。  <(_ _)>

noirff
質問者

お礼

DOUGLAS_さん、順を追った説明に問題点まで本当にありがとうございました。 ご回答下さった、blue_rumbleさん&DOUGLAS_さんの記述を心の中で(はぁ。。すごいなぁ)を20回くらい繰り返しながらずっと読んでました。 充分・・もおほんと充分!!です(T0T) 丸投げの質問にご回答下さって、お二人には本当に感謝感謝です! 初めて登録して質問させて頂いたのですが、”ありがとうポイント”というのがあるのを知って、お二人に早速!。。と思ったら一人しか選べないんですね。。!(><) 質問投稿時の心境は、1週間テキストやネットとにらめっこしていたものの、わからなさ過ぎてグッタリ。。本当に助けてほしいと思って、初めて投稿したのですが、こんな丸投げで回答頂けないかも。。 と思っていたら、すぐに回答を頂けて感激しました!(><) そこでものすごく悩みましたが、最初に回答を下さったblue_rumbleさんにありがとうポイントを贈らせて頂くことにしました。DOUGLAS_さんごめんなさい心苦しいです。でもとても 感謝していますm(uu)mm(uu)m お二人から教えて頂いた記述を、明日またじっくりにらめっこしながら、VBAの猛勉強します!今度質問するときは丸投げしないように努力したいと思います。 本当にありがとうございました。

関連するQ&A

  • excel vba 作成について教えて下さい。

    excel VBAを使ってあるブックのセル範囲を別のブック(日報.XLS)のシートへコピー貼り付けをしたいのですが、コピーする側のブックがランダムに取り込まれ(例 8時間ピッチにて自動的にブックが作成される)そのブックを日にちごとに集計し、一か月ごとにまとめるということをやらなければなりません。 例)8時間ごとにフォルダが作成されます。   000001.XLS 000002.XLS   00000F.XLS ・・・・・・・・16進数にて   上記ブックのSheet1のA2:A11までの数値を別のブック(日報月報集計)のに貼り付ける。 別のブック(日報月報集計)は項目ごとに10個のシートがあり 8時間ごとのファイルのセルA2は別ブックのSheet1の日付けに対応するセルへ貼り付け B2は       Sheet2 上記操作を8時間ごと(可変可能)に自動的にコピー貼り付けをやりたいのですが ブック間のコピー貼り付け等わからないことが(初心者です。)多々あり、いろいろ調べてはいるのですが、STOPした状態です。 出来れば、初心者にも理解しやすい解説等あれば宜しくお願いします。

  • Excel VBA別ブックのシートをコピーするには

    Excel2010のVBAで別ブックのシートをコピーしてくる方法 Excelファイル(C:\test\BOOK2.xls)のシート名が TESTというシートを自分のExcelファイル(C:\doc\BOOK1.xls)に コピーするにはどのように記述すればよいのでしょうか。 ・コピー先:自分のExcelファイル(C:\doc\BOOK1.xls)  VBAのコードがあるファイルです ・コピー元:C:\test\BOOK2.xlsのTESTシート  なお、TESTシートを持つ同じ名前(BOOK2.xls)のファイルが  別フォルダにもあります   Workbooks( )の引数にファイル名(BOOK2.xls)は指定できるのですが、 フルパス名(C:\test\BOOK2.xls)で指定できないので困っています。

  • 複数のブックのデータを一つのブックにまとめたい

    http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page1.htm ↑の 7. 指定したフォルダ内にあるExcelファイルを検索して開く の部分のマクロを利用して、集計.xlsというブックで、複数のブックを開くようにしましたが、そのブックを開いた時にそのブックのSheet2の中のデータのみコピーして、集計.xlsに貼り付けたいのですが、どのようにすればよいのか困っています。 指定したフォルダの中には、回答01.xls 回答02.xls ・・・と16個のブックがあります。順番に開いてコピーをするときに、どのようにブック名とシート名を指定すればよいのかわからず困っています。 何か参考になるものがあれば教えてください。 よろしくお願いします。

  • EXCEL マクロ どう記述したらよいですか?

    お世話になります。 まったくの素人です。 以下のような処理をしたいと考えております。 1)1つのフォルダに AAA.xls BBB.xls CCC.xls・・・をまとめておきます。   それとは別に、フォーマット.xls を用意します。 2)AAAを開き、aというシートにある列(1列)を選択、コピーし、   フォーマットの 【F列】 に 【値貼り付け】 で貼り付ける。   AAAは閉じる。 3)BBBを開き、aというシートにある列(1列)を選択、コピーし、   フォーマットの 【G列】 に 【値貼り付け】 で貼り付ける。   BBBを閉じる。 4)CCC・・・(aというシート名は固定、コピーする列も固定で1列のみです)。 5)以下、フォルダ内の全ファイルについて、同じ処理を繰り返し、   すべて貼り付け終えたら、完了。 宿題の丸投げのようで申し訳ないのですが、ご教示いただけると 幸いです。よろしくお願いします。

  • エクセルマクロ コピー元と貼り付け先を指定してコピー&ペーストを実行するマクロ

    単刀直入にやりたいことを述べます。 Cドライブと仮定します。3つのBOOKがあります。 それぞれ ----- BOOK1.xls「○○Sheet」・・・(実行するファイル)   A 1 BOOK2.xls「△△Sheet」・・・(コピーするファイル名の指定です) 2 A2:E2・・・(コピーするセル範囲の指定) 3 BOOK3.xls「□□Sheet」・・・(貼り付け先のファイル名の指定です) 4 A5・・・(貼り付け先のセルの指定) ----- BOOK2.xls「△△Sheet」・・・(コピー元ファイル)   ABCDE 1 あいうえお 2 かきくけこ 3 ・・・・・ ----- BOOK3.xls「□□Sheet」・・・(貼り付け先のファイル)   ABCDE 1 ・・・・・ 2 かきくけこ・・・(貼り付け) 3 ・・・・・ ----- >やりたいこと BOOK1.xls「○○Sheet」のA1のセルの値とA2セルの値を参照し、 その該当BOOKのセル範囲(BOOK2.xls「△△Sheet」のA2:E2)をコピーして、 BOOK1.xls「○○Sheet」のA3のセルの値と、A4セルの値を参照し、 その該当BOOKのセル範囲(BOOK3.xls「□□Sheet」のA5)へペーストする。 別のブックの指定したセルの値を別のブックの指定したセルへ貼り付けるだけなんですが、 以前関数を使って似たような事をしようとしたのですが、うまくいかなかったので、マクロならできるのでしょうか。 よろしくお願いします。(ちなみにエクセル2000又は2003です)

  • excel vba

    テーブル情報に基づきシートをコピーするVBAマクロを記述したい。 ExcelのBook111のSheet1に次のような データが入っています。 (1、2)セルにn=3という数字が入っているものとします。 その数値に合わせて、この場合は3なので Sub Sample01() Workbooks("Book3.xls").Worksheets("booksheet3").Copy After:=Workbooks("Book111.xls").Sheet(1) End Sub のようなつまり、booksheet3なるシートをBook111(固定なBOOK)にコピーしようとしています。 このようなことをVBAで書くにはどうすればいいのでしょうか。 ただしBook名とシート名はあくまでデータの値にもとづいたデータをもってくることになります。 要するに間接参照したデータに基づき処理するのをどのように記述するかという質問です。 A列 B列 1 回数 n=3 2     3     4 Book1.xls book1sheet ←n=1 5 Book2.xls book2sheet ←n=2 6 Book3.xls book3sheet ←n=3 7 Book4.xls book4sheet 8 Book5.xls book5sheet 9 Book6.xls book6sheet ←n=6 10 Abc,xls Defsheet ←n=7

  • エクセル 特定のシートを異なるブックの指定したシートにコピーするマクロ

    エクセルの"貼り付け先.xls"の(シート名="集計")を開いている状態で、 別の異なるブックの"貼り付け元.xls"の(シート名="sheet1")の内容を全部コピーして "貼り付け先.xls"の(シート名="集計元データ")へ貼り付けるマクロは どのようになりますでしょうか? いろいろ調べて下記のように書きましたが、 インデックスが有効範囲にありませんというメッセージが出て、 デバッグを確認すると Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_の部分が黄色く表示されてきます。 (1) "貼り付け先.xls"と"貼り付け元.xls"は同じパソコンのマイドキュメントに保存されています。 (2)"貼り付け元.xls"の"Sheet1"はセルA1から入力されていて、 内容は毎日変わります。 (3)Range("A1")や("A1:IV65536")のセル番地をいろいろ変えたりしても同じでした。 Sub クリップボードを経由せずにコピー貼り付けする_異なるブック() Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_ Workbooks("貼り付け先.xls").Worksheets("集計元データ.xls").Range ("A1:IV65536") End Sub

  • VBAでファイル名を変更したい

    EXCEL2003のVBAでブックを連続して保存をするものを作成したのですが、スキルが足りないため、ファイル名が数字になってしまい、リネームをしたいのですが、出だしからつまずいております。 リネームをしたいブック(ファイル)は一つのフォルダに入っており、 excelのシートには旧ファイル名と新ファイル名の一覧をつくり VBAを実行すると一覧に載っているブック名が変更される というものを作りたいのですが、可能でしょうか。 一覧は 旧ファイル名  新ファイル名 1.xls      1北海道.xls 2.xls      2青森.xls という感じです。 フリーのリネームソフトではなく何とか自力でやりたいと思っております。 お力をお貸しください。 よろしくお願いいたします。

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

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

  • 可能かどうか教えてください。

    excel2003です。 結構excelファイル(ブック)を保有しています。 あるファイルを探しているのですが、 シート名はしっかり覚えているのですが、 ファイル名を思い出せません。 一から関係在りそうなファイルを開いて調べるのはやっかいだ、という横着から、 なんとかシステム的に探したいという必要に迫られています。 ここからが質問です。 パソコン内(フォルダでも構わない)に在るファイルのシート名が 指定したシート名と一致するファイルを探したい。 手で開かずに、ブック名を指定してシート名を参照するテクニックは持っています。 ブック名を入れないと調べようがないのでは、と思っています。  → *.xlsみたいな指定でループできれば可能かと思うのですが。 宜しくお願いします。

専門家に質問してみよう