複数ファイルを1ファイルにまとめるには
ここでは指定フォルダの中にあるテキストファイルを1ファイルにまとめる方法を紹介します。
VBAを使わなくても、ほとんどの場合はコマンドプロンプトでtypeコマンドを使えば複数ファイルを1ファイルにまとめることが出来ます。
例えば、a.txt、b.txt、c.txtの3ファイルがあったとして、それをall.txtというファイルにまとめてしまいたい場合は、コマンドプロンプトで「type *.txt > all.txt」と入力してEnterを押せば終わりです。1ファイルずつ「type a.txt b.txt c.txt > all.txt」と指定して、入力+Enterでも同様です。
細かいことを言えば、ファイルがあるフォルダまで「cd C:\aaa\」のようにcdコマンドで移動する必要はありますが、それでも作業は簡単に終わります。ほとんどの場合はこれで対応可能です。
ただ、typeコマンドでのファイル結合は、素直にファイルの内容をくっつけるだけのため、元ファイルの最終行に改行がない場合は、改行されないまま結合されてしまいます。
結合前後で完全一致させたい場合など、その方が都合がいい場合もありますが、1ファイルにまとめたい場合はファイルごとに改行したうえで結合させたいことの方が多いため、以下ではそれを考慮した方法を紹介します。
事前設定
以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。
FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。
詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。
コード
以下のコードは、指定フォルダにあるファイルを引数で指定したファイル名の1ファイルにまとめます。まとめるファイルは同じフォルダに作成します。ファイルを結合する際にファイルの末端に改行コードが無い場合は改行コードを付与します。
対象とするファイルは拡張子がtxtまたはTXTのテキストファイルに限定しています。処理内で拡張子の判定を行っている箇所がありますが、そこを変えれば他の拡張子も結合対象にすることが可能です。
処理内容は大体コメントに書いているのでそちらをご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
'// 引数a_sFolderは任意のフォルダパス '// 引数a_sCombineFileNameはまとめる1ファイルのファイル名。パスは不要。 Sub combineFiles(a_sFolder As String, a_sCombineFileName As String) Dim oFso As New FileSystemObject '// FileSystemObjectクラス Dim oTs As TextStream '// TextStreamクラス Dim sFolder As String '// フォルダパス文字列 Dim oFolder As Folder '// フォルダ Dim oFile As File '// ファイル Dim iCharCode As Integer '// ファイル終端の文字コード Dim oTsCombine As TextStream '// 書き込みファイル用のTextStreamクラス Dim sRead As String '// 読み込みデータ Dim sExtension As String '// 拡張子文字列 '// フォルダがない場合 If (oFso.FolderExists(a_sFolder) = False) Then '// 以降を処理せず抜ける Exit Sub End If '// 指定フォルダをFolderオブジェクトとして取得 Set oFolder = oFso.GetFolder(a_sFolder) '// まとめるファイルを新規ファイルとして作成 Set oTsCombine = oFso.CreateTextFile(oFolder.Path & "\" & a_sCombineFileName, True, False) '// カレントフォルダ内の全ファイルを1ファイルずつ取得 For Each oFile In oFolder.Files '// 作成するファイルの場合 If oFile.Name = a_sCombineFileName Then '// 読み込み対象からは除外する GoTo CONTINUE End If '// 拡張子を取得 sExtension = oFso.GetExtensionName(oFile.Name) '// 拡張子が処理対象ではない場合 If (LCase(sExtension) <> "txt") Then '// 読み込み対象からは除外する GoTo CONTINUE End If '// ファイルを開く Set oTs = oFso.OpenTextFile(oFile.Path, ForReading) '// データを全て新規ファイルに書き込み sRead = oTs.ReadAll Call oTsCombine.Write(sRead) '// ファイルにデータがある場合 If oFile.Size > 0 Then '// 終端文字の文字コードを取得(終端が全角文字の考慮でAscWを利用) iCharCode = AscW(Right(sRead, 1)) Else iCharCode = -1 End If Call oTs.Close '// ファイル終端が改行コード(CR(13)、LF(10))ではない場合 If (iCharCode <> 13 And iCharCode <> 10) Then '// 改行コードを書き込む Call oTsCombine.Write(vbCrLf) End If CONTINUE: Next Call oTsCombine.Close End Sub |
使い方
上の関数の引数にファイルがおいてあるフォルダパスと、まとめたあとのファイル名を指定して実行します。実行すると、指定フォルダ内にある全てのテキストファイルの内容を結合させて、1ファイルで作成します。
1 2 3 4 5 6 7 |
Sub combineFilesTest() Dim sFolder As String sFolder = "V:\aaaa\" Call combineFiles(sFolder, "all.txt") End Sub |
注意点
上にも少し書いていますが、テキストファイルの終端が改行コードでない場合は、まとめる先のファイルに書き込む際に改行コードも書き込んでいます。
そのため、元の各テキストファイルの総ファイルサイズと、まとめたファイルのファイルサイズが付与した改行コードの分だけ一致しないことがあります。
元の各テキストファイルとまとめたファイルを完全一致させたい場合は上記VBAのコードではなく、冒頭のtypeコマンドでのファイル結合を行ってください。