Excel VBAでフォルダ内の複数ファイルをシート毎に貼付ける方法

このQ&Aのポイント
  • Excel VBAを使用して、フォルダ内の複数のログファイルをExcelファイルの各シートに貼り付ける方法を教えてください。
  • 質問者は、1つのフォルダに数十のログファイルがあり、各ファイルには3万〜5万行の記述があります。これらのファイルを1つのExcelファイルにまとめたいと考えています。
  • VBAの流れとしては、(1) ログフォルダを選択し、(2) ログファイル名を取得し、(3) 既存のExcelファイルにシートを追加し、(4) 各ログファイルをシートに貼り付ける、(5) ログファイルを閉じる、という手順を実行します。しかし、複数ファイルの場合のファイル名を順次取得してシート名に付与する方法がわかりません。質問者は既に単一ファイルの読み込みや情報のコピーアンドペースト、ファイルの閉じ方については解決しています。
回答を見る
  • ベストアンサー

フォルダ内全ファイルをシート毎に貼付方法について

VBA仙人様ご教授お願い致します。 1フォルダに数十のログファイル(.txt)が格納されています。 1ファイルは3~5万行記述あります。 これを1つのExcelファイルにしたいと思っています。 VBA流れとして (1)ログ格納フォルダを選択 (2)ログファイル名を取得 (3)既存Excelファイルに(2)で取得したファイル名(.txt除いた)で順次シートを追加 (4)ログファイル=シートとなるようにファイル読み込み/貼り付け (5)ログファイルを閉じる VBAイメージ 格納フォルダ:C:\test \test内    :A001.txt,A002.txt,B003.txt・・・・・・・・Z051.txt(このフォルダにはログのみ格納) C:デスクトップ\集計マクロ.excel (VBAの記述のあるExcelシートにはSheet1のみが存在) VBA前 集計マクロ.excel/Sheet1 VBA実行後 集計マクロ.excel/Sheet1,A001,A002,B003,D004・・・・・・・・・Z051が追加、シート毎にログ情報記載 単一ファイルの読み込み/ファイル名をシート名に付与/情報コピペ/ファイル閉じについては、 作成できたのですが、複数ファイルの場合のファイル名を順次取得し、シート名として付与するなど objやValiant変数などで試行錯誤しましたが解決できず、こちらに質問されていただきました>< このVBAで作成されたシートからの集計マクロについては完成していますが、 その手前でつまづいています>< ご教授のほどお願い致します><

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

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

#3です。 Set destRange = sh.Range("A1").Resize(UBound(buf) + 1, 1) が正しいです。試験したファイルは最後にもCrLfが入っていたため、見落としてしまい申し訳ありません。 改行コードCrLfが一個も入っていないファイルの場合、UBound(buf)が0となるため、ご指摘のエラーになります。 また、行の区切りがCrLfでない場合は、 Const delimiter As String = vbCrLf の所を、vbLfなのか、その他の任意の文字か分かりませんが、それに変更する必要があります。 行の区切りと、セルの区切りがある場合は、下記の様にできると思います。ただし、すべての行の要素数が同じとします。 buf = Split(textFile.ReadAll, delimiter) buf2 = Split(buf(0), cellDelimiter) Set destRange = sh.Range("A1").Resize(UBound(buf) + 1, UBound(buf2) + 1) For i = 0 To UBound(buf) destRange.Rows(i + 1) = Split(buf(i), cellDelimiter) Next i

その他の回答 (4)

  • ZExcel
  • ベストアンサー率0% (0/1)
回答No.5

ご苦労様です。 単一ファイルでできたのであれば、それをループさせるだけだとは思いますが、 Excelで複数ファイルを立ち上げて「終了」させるにはきちんとExcelオブジェクトを順に終了させていかなければ できないことがあります。 そのためにはExcelオブジェクトのApp→workbook→worksheet→cellとアクセスし、終了させるときはその逆に終了させていく (オブジェクトを解放する)ようにしなければExcelが終了しません。 やりたいことはテキストファイルの合体だと思うのですが、既にツールがあります。

vba_knowledge
質問者

お礼

助かりました^^ありがとうございます><

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

この手の事はFileSystemObjectを使うと便利です。詳細は参照URLをご覧下さい。 ファイルリスト取得はDirでも良いのですが、全部FSOでやってみました。 xl2000で試しています(少数&小さなファイルですが...)。ご参考まで。 Sub treatAllFiles() Dim FSO As Object, targetFolder As Object, targetFile As Object Dim textFile As Object Dim folderName As String Dim sh As Worksheet Dim destRange As Range Dim buf As Variant Const delimiter As String = vbCrLf folderName = "C:\test" Set FSO = CreateObject("Scripting.FileSystemObject") Set targetFolder = FSO.getfolder(folderName) For Each targetFile In targetFolder.Files DoEvents '途中でやめたくなった時のための保険 If UCase(FSO.GetExtensionName(targetFile)) = "TXT" Then Set sh = ThisWorkbook.Sheets.Add sh.Name = FSO.getbasename(targetFile) Set textFile = FSO.OpenTextFile(targetFile) 'この部分は速いかなと思って少々奇を衒ってみましたが、メモリ容量上問題が出る場合は、ReadLineで一行ずつ読みこんで処理してください。一行を一つのセルに収納する前提です。複数に分ける場合は、追加の処理が必要です。 buf = Split(textFile.ReadAll, delimiter) Set destRange = sh.Range("A1").Resize(UBound(buf), 1) destRange = Application.Transpose(buf) Set textFile = Nothing End If Next targetFile Set FSO = Nothing End Sub

参考URL:
http://officetanaka.net/excel/vba/filesystemobject/index.htm
vba_knowledge
質問者

補足

ご教授有難うございます。 ご提供いただいたマクロについて一日解読致しました。 私が途中まで自力で作成したものはとてつもない行数のものでした・・・ 実データにて検証致しましたが、マクロ内Set destRange = sh.Range("A1").Resize(UBound(buf), 1)のフォルダ内最初のファイル名でシートが作成されたところでで”オブジェクト定義エラー”となりマクロが停止してしまいました。 テキストログ内にはExcelで区切りせりできるよう、Shellでテキスト内にブランクを挿入して分割しています。これがspilt処理の際に支障となり本件のエラーになっているのでしょうか? 引き続きデバッグを試みますが、mitarashiさん方で原因が分かればお時間あるときに教えてください。よろしくお願いします。

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

質問の説明が丁寧なのは良いが、くどくてわかりにくい面もある。 課題は単純で (1)1フォルダのファイル(名)を順次掴む (2)(1)のファイルのレコードを順次読んで1つにまとめるなり、エクセルのセルに書き出す それだけでしょう (1)のコードはWEBに満ち溢れている なんでGoogleででも「VBA フォルダ ファイル名 取得」などで照会しないのか。 http://itpro.nikkeibp.co.jp/article/COLUMN/20060120/227645/ (FSOの例)ほか多数 それと、質問者は、テキストファイルを扱うVBAに慣れていないのだろう。昔のBasic時代は、何をするにもここから始まったのだが。 ーー 下記例では配列に3つのテキストファイルを指定し、エクセルに書き出している例。3つぐらいの例で勉強したり、テストしたり、質問すれば、後は考えを延長すれば仕舞いなのだ。質問には実際をややこしく説明するのは無駄。 下記例を質問者の場合、FSOのFor Eachで、フォルダの中の1ファイルを捕まえたとき、 そのファイルを見つける繰り返しの中で見つかった場所(コード上の)へ、下記のOpenからCloseまでを入れ子にすればしまい。 その時点ではもちろん、f = Array("test01.txt", "test02.txt", "text7.txt") は不要。 ーーー Sub test01() f = Array("test01.txt", "test02.txt", "text7.txt") i = 1 Open "textx.txt" For Append As #2 For Each fl In f Open fl For Input As #1 While Not EOF(1) Line Input #1, a Print #2, a Cells(i, "A") = a i = i + 1 Wend Close #1 Next Close #2 End Sub これはインプトファイルの1行=>アウトプットファイルの1行の集積なので、必要があれば、エクセルの「区切り位置」操作で 各フィールド(=列項目)に分けることも出来る。 一旦上記例の"textx.txt"に当たる集積テキストファイルを作って、最後にエクセルに読ませる手もある。

vba_knowledge
質問者

お礼

ご教授ありがとうございます。 精進いたします><

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

フォルダ内のファイル名などの情報を取得する方法の一つとして Dir()関数で調べてみると たくさんヒットします。 一例ですが、新しいシートで A1セルに C:\test とフォルダを指定しているとして Sub Sample1() Dim buf As String, i As Long i=6 buf = Dir(Range("A1").Value & "\*.txt") Do While buf <> "" Cells(i + 1, 1).Value = buf i = i + 1 buf = Dir() Loop End Sub を試してみてください。 この部分が理解できたら Cells(i + 1, 1).Value = buf i = i + 1 の部分に >単一ファイルの読み込み/ファイル名をシート名に付与/情報コピペ/ファイル閉じについては、 作成できたのですが のコードを順次実行させるように置き換えます。

vba_knowledge
質問者

補足

ご回答有難うございます。 今回の構文を私のマクロに取り入れて試行しておりますが、未だ解決できずです。少し頑張って解決してみます。

関連するQ&A

  • エクセルのマクロであるフォルダ内にある全エクセルファイルのシート1!(

    エクセルのマクロであるフォルダ内にある全エクセルファイルのシート1!(A1:X365)の値を取得し、コピー元のエクセルファイル名のシートに貼付ける方法を教えて頂けないでしょうか?できればコピー元のエクセルファイルは開かずに実行させたいです。エクセルは2003を使っています。

  • ExcelVBAでフォルダ内のファイルを読み込む

    お世話になります。 ExcelのVBAで、選択したフォルダ内全てのテキストファイル(.txt)を読み込んで、書き出しすることはできるでしょうか? 例えば、 01....05.txt→VBA→01_a...05_a.txt のような感じで、別ファイルで作りたいです。 動作環境はMacOsX、Excel2004forMacです。 Windowsでは動くVBAもMacでは動かなかったりするので、苦戦しています。 お願いします。

  • <ACCESS VBA -> EXCEL>getObjectしたEXCELファイルのシートを指定したい

    ACCESSのVBAマクロでEXCELファイルを指定してデータを取得しようとしています。 GetObject("C:\ファイル名.xls", "Excel.Sheet") でEXCELファイルを取得するまでは良いのですが、そのファイルのシートを指定する方法がわかりません。 基本かもしれませんが、ご教示をお願いします。

  • EXCEL VBA 複数のファイルをひとつのシートにまとめたい

    多数のユーザーから集計表が送られてくるので、いくつかの取り纏めの箇所を経由して集計をまとめようと思います。 マクロでそれぞれの集計表を特定のフォルダに格納し、フォルダ内の対象ファイルを探し、そのファイル名をシートに書き出すところまで行ったのですが、ひとつのファイルのひとつのシートにまとめる方法がわかりません。 (元の集計表は総て同じレイアウトになっています。 これをひとつのシートの下方向に追加していくようにひとつの表にまとめたいのです。) ある取り纏め担当者は3つのファイルをまとめれば済むかもしれませんが、ある担当者は20個のファイルをまとめないといけないかもしれません。 この後をどうすればよいか、どなたかお教えください。 宜しくお願いいたします。 説明が分かり難いようでしたら申し訳ございません。

  • 複数のエクセルファイルを1つのエクセルファイルのシートにコピーをマクロ

    複数のエクセルファイルを1つのエクセルファイルのシートにコピーをマクロで行いたい。 マイドキュメントのデーターというフォルダ内に エクセルファイルA(シート名みかん) エクセルファイルB(シート名りんご) エクセルファイルC(シート名バナナ) エクセルファイルD(シート名ぶどう) エクセルファイルE(シート名いちご) があります。 雛形は同じです。すべてA列~F列までデータが入っています。 行数はファイルによって違います。 また毎日自動で上書き更新され、毎日行数が変わります。 エクセルファイルZがあります。シートが7個あります。 ・変換 ・集計 ・みかん ・りんご ・バナナ ・ぶどう ・いちご エクセルファイルZを開きます。(各シートには昨日のデータが貼り付けてあります。) マイドキュメントのデーターフォルダも開いておきます。 エクセルファイルZにおいて「マクロの記録」を起動。 エクセルファイルZの 【みかん】~【いちご】までの5シートを全データDELETEします。 開いてあるフォルダ「データー」の中からエクセルファイルAを開きます。 (タスクバーにいます) ファイルAのシート【みかん】の全データ選択して エクセルファイルZの【みかん】というシートのA1セルにカーソルを あわせて貼り付けします。 開いてあるフォルダ「データー」の中からエクセルファイルBを開きます。 (タスクバーにいます) ファイルBのシート【りんご】の全データ選択して エクセルファイルZの【りんご】というシートのA1セルにカーソルを あわせて貼り付けします。 これと同じ操作を【バナナ】【ぶどう】【いちご】も行います。 エクセルファイルZにおいて「マクロの記録」を終了させます。 マクロができあがりました。 ファイルZを上書き保存して終了。再立ち上げで記録したマクロを実行。 エラーにはなりませんが、ファイルZの5種類各シートに ファイルA~Eのデータが貼りつきません。 何か無理な事をしているのでしょうか? もしかしてシート名が同じだと駄目?とためしにファイルZのシート名【みかん】~【いちご】を 【みかんZ】~【いちごZ】に変更してマクロを再記録しても 駄目でした。 よろしくお願いします。

  • 複数フォルダ内のファイル群をひとつに纏める

    Excel2003のVBA で、以下の作業を行いたいので宜しくご教示下さい。   サーバー上や自分のPC上にある、任意フォルダA直下には、   複数のフォルダがあり、その複数フォルダ内に多数のファイル(約3万個)が入っている。   そのファイル群を、任意フォルダAの直下に新しいフォルダを1つ作り、全てコピーし纏めたい。   当方の構想(希望)としては、   1.エクセルシート1に全ファイル名を書きだす。(行:フォルダ名、列:ファイル名)   2.同名ファイルの有無を判定し、有ればエクセルシート2にフォルダ名とファイル名を抽出する。     (同名ファイルは、エクセルシート2を確認し、手動で変更する)   3.同名ファイルが無ければ、新しいフォルダに全てコピーする。 コードを記載しご教示頂ければ助かります。 皆様よろしくお願い致します。

  • 同じファイル名で違うフォルダーに格納するには?

    同じファイル名で違うフォルダーに格納するには? Excel VBAで、読み取りパスワードの付いたファイルを、読み取りパスワードを削除し同名ファイルで 違うフォルダーに格納するにはどうすればよいのでしょうか?

  • エクセルの各シートに複数のtxtファイルを取り込む

    Excel2013を用いたデータ整理をしているのですが,複数のファイルを扱う上でマクロを用いた効率化をしたいと思い,質問させていただきました. いま,Folder1 というフォルダに,text1 から text40 までの 40個のtxtファイルがあります. これらのファイルを,エクセル上であらかじめ作成してある Sheet1 から Sheet40 にそれぞれ貼り付けたいと考えています. txtファイルは,4列で構成されており,タブでそれぞれ区切られています. 行数は20,481行です. txtの中には,0 の値が入った箇所もあるため,その情報が消えないで貼り付けられると望ましいです. また,タブのところでしっかり区切られ,違うセルに貼り付けられると,ありがたいです. 質問は以上です. お手数ですが,よろしくお願いします.

  • エクセルのマクロ

    エクセルのマクロ(VBA?)で、あるフォルダ内のファイル名を取得する(拡張子が.txtのもだけ)関数があれば教えてほしいのですが・・・

  • VBA_フォルダ内複数のExcelファイルの集約

    Excel VBAに関する質問です。 特定のフォルダ内(例としてC:\folder1)の複数のExcelファイルにおける シート(例としてSheet1)内のセル範囲A2:I1000の情報をコピーし、 特定のフォルダ内に格納されたExcelファイル(例としてC:\tougou\tougou.xls)の シート(例としてTOUGOU)内のA2を起点に貼り付け処理をしたいのですが、可能でしょうか? <貼り付けイメージ> (例)特定のフォルダ内(例としてC:\folder1)のExcelファイル数が2つの場合 A2 B2 ・・・・・I2 ・ ・ ・ ・ ・ A1999・・・・・・I1999 A2~I1999の範囲にデータが集約される。 どうぞよろしくお願いいたします。