まえがき
テキストやCSVの帳票やLOGをエクセルに取り込む事で、情報整理や分析がやりやすくなります。手動で切り貼りしても良いですが、ファイル数が膨大であったり毎日の業務であれば、自動化した方が効率的です。
本記事では[1行ずつ読み込む方法]と[1ファイルまとめて読み込む方法]の2種類について解説しています。
本記事のやり方で、テキストなどのメモファイルをExcelに取り込んでデータ整理できるようになると思います。Excel以外のデータも連携できるようになると自動化できる範囲が広がりますので、是非ご活用ください。
結論
まずは備忘録として使う人向けと、単品のやり方が知りたい人向けに結論から書きます。
緑文字は必要に応じて変更する箇所です。
1行ずつ読み込む方法
Open “C:\TEST\Test.txt” For Input As #1 |
Do Until EOF(1) |
Line Input #1, Data1 |
【変数Data1を使った処理】 |
Close #1 |
1ファイルまとめて読み込む方法
Set fso = CreateObject(“Scripting.FileSystemObject”) |
With fso.GetFile(“C:\TEST\Test.txt“).OpenAsTextStream |
DataAll = .ReadAll |
【変数Data1を使った処理】 |
.Close |
End With |
Set fso = Nothing |
1行ずつ読み込む方法の使用例(解説入り)
実際にプログラムを作りには、事前のエラー処理やファイルの読み込みの仕組みが必要となります。ファイル読込単品では無く、実践として必要な流れを説明してきます。
自動化するのであれば複数ファイルを読み出す目的が多いと思いますので、まずはフォルダからファイルを読み込むやり方を説明します。
検索対象のフォルダ(DLC)をCells(1,3)に入力させるとします。
DLC = Cells(1, 3) |
検索フォルダの後ろに\が付いていない場合のみ\を付けます。Right(DLC, 1) はDLCの右から1文字という意味です。
If Right(DLC, 1) = “\” Then |
Else |
DLC = DLC & “\” |
End If |
対象のフォルダが存在するかチェックします。対象フォルダが無ければ、最後のラベル(END1)まで飛ばします。
If Dir(DLC, vbDirectory) = “” Then |
MsgBox “検索フォルダが存在しません。” |
GoTo END1 |
End If |
以下の行で対象フォルダ(DLC)からファイル名(FileName1)を取得します。ファイル名と拡張子は*で何でも良いようにしていますが、必要に応じて変更してください。
FileName1= Dir(DLC & “*.*”) |
列を操作する変数(RETSU)と最大行数を格納する変数(GYOUMAX)の初期値を定義します。
RETSU = 0 ‘列を操作する変数 |
GYOUMAX = 0 ‘最大行数を格納する変数 |
最後のファイルまで繰り返します。
Do While FileName1 <> “” |
列を操作する変数(RETSU)をファイル読込後に1足します。
RETSU = RETSU + 1 ‘列を操作する変数 |
ファイル名(FileName1)を2行目の頭に入れます。
Cells(2, RETSU + 1) = FileName1 |
以下の行でファイル(FileName1)を1行ずつ、最後の行(EOF(1))まで取得します。#1はファイルナンバーで、この値でOpenからCloseまで1セットで扱うので、複数ファイルを同時に扱う場合は#2などと数値を変更して使います。
読み込んだ行数をカウントするための変数をGYOUとします。今回の例では入力行の指定にも利用しています。(不要であれば省略して下さい。)
Open DLC & FileName1 For Input As #1 |
GYOU = 0 ‘行を操作する変数 |
Do Until EOF(1) |
ファイルを1行読み込み、読み込んだ値を変数(Data1)に格納します。
Line Input #1, Data1 |
入力させたい行が3行目からとして、2列目からデータ(Data1)を入れます。処理の部分は一番カスタマイズが発生するところなので参考として下さい。RETSU + 1とすることで新しいファイルは次の列に格納されます。
GYOU = GYOU + 1 |
Cells(GYOU + 2, RETSU + 1) = Data1 |
1ファイルに対するLooPの終了箇所を記載します。
Loop |
最後に行列を表す数値を入力するために、1ファイルずつ最大行を確認しておきます。最大値が上なら更新します。
If GYOUMAX < GYOU Then |
GYOUMAX = GYOU |
End If |
最終行を読み終えた後にファイル(#1)を解放します。
Close #1 |
次のファイルをDir関数で格納します。
FileName1 = Dir() |
Loop |
全部の処理が終わったら、1列目の3行目以降に列番号を入れます。
For i1 = 1 To GYOUMAX |
Cells(i1 + 2, 1) = i1 |
Next i1 |
Cells(2, 1) = “行数↓ / ファイル名→” |
異常終了時に飛ばすラベルを記載します。
END1: |
コード全体(解説無し)
先ほどのコードの通しです。こちらはコメントを緑文字としています。
Sub test() |
DLC = Cells(1, 3) ‘検索対象のフォルダ |
If Right(DLC, 1) = “\” Then |
Else |
DLC = DLC & “\” |
End If |
If Dir(DLC, vbDirectory) = “” Then |
MsgBox “検索フォルダが存在しません。” |
GoTo END1 |
End If |
FileName1 = Dir(DLC & “*.*”) |
RETSU = 0 ‘列を操作する変数 |
GYOUMAX = 0 ‘最大行数を格納する変数 |
Do While FileName1 <> “” |
RETSU = RETSU + 1 ‘列を操作する変数 |
Cells(2, RETSU + 1) = FileName1 |
Open DLC & FileName1 For Input As #1 |
GYOU = 0 ‘行を操作する変数 |
Do Until EOF(1) |
Line Input #1, Data1 |
‘【変数Data1を使った処理】 |
GYOU = GYOU + 1 ‘行を操作する変数 |
Cells(GYOU + 2, RETSU + 1) = Data1 |
Loop |
If GYOUMAX < GYOU Then ‘最大行数を確認 |
GYOUMAX = GYOU |
End If |
Close #1 |
FileName1 = Dir()‘新しいファイル名を格納 |
Loop |
For i1 = 1 To GYOUMAX ‘一番左の列に行数を入力 |
Cells(i1 + 2, 1) = i1 |
Next i1 |
Cells(2, 1) = “行数↓ / ファイル名→” |
END1: |
End Sub |
動作画面
実際に動作させるとこのようになります。
まずはテスト用のファイルを準備します。
マクロ実行前の画面です。C1セルにフォルダ名を入れています。
マクロ実行後の画面です。A列に行数が入り、2列目にファイル名が入り、3列目以降にテキストの内容が読み込まれます。
1ファイルまとめて読み込む方法の使用例(解説入り)
1ファイルをまとめて読み込むメリットは読み込み速度が速い事です。100行程度であればあまり変わらないですが、行数が多いほどメリットは大きいです。用途は以下の通りです。
- 対象の文字列を一斉置換(Replace)する
- 対象の文字列を分割(Split)する
- 対象文字列がある場合のみ実行して処理を高速化する
- 配列に格納して処理を高速化する
使用例として、「文字列を置換して別ファイルに保存するマクロ」を解説します。先ほどと重複する部分の解説は一部割愛させて貰います。
以下で最後のファイルになるまで実行します。
Do While Filename1 <> “” |
データをまとめて読み込んで変数(DataAll)に格納します。
Set fso = CreateObject(“Scripting.FileSystemObject”) |
With fso.GetFile(DLC & Filename1).OpenAsTextStream |
DataAll = .ReadAll |
.Close |
End With |
Instr関数で文字列(test5)があるかチェックします。文字列が無い場合は0となり、処理はスキップします。文字列がある場合は、文字列を見つけた頭の文字位置を返します。
If InStr(DataAll, “test5“) <> 0 Then |
新しいファイル(“R” & Filename1)を作成します。
fso.CreateTextFile DLC & “R” & Filename1 |
[test5]から[Chikan5]にデータ(DataAll)を置換します。
DataAll = Replace(DataAll, “test5“, “Chikan5“) |
新しいファイル(“R” & Filename1)を読み込んで、置換後のデータを書き込みます。
With fso.GetFile(DLC & “R” & Filename1).OpenAsTextStream(8) |
.Write DataAll |
.Close |
End With |
オブジェクトを解放します。
Set fso = Nothing |
新しいファイル名を格納します。
Filename1 = Dir() |
データを初期化します。
DataAll = “” |
コード全体(解説無し)
先ほどのコードを解説無しにしたものを記載します。
Sub test() |
DLC = Cells(1, 3) ‘検索対象のフォルダ |
DLC = “C:\Users\81906\Desktop\test\” |
Filename1 = Dir(DLC & “*.*”) |
Do While Filename1 <> “” |
Set fso = CreateObject(“Scripting.FileSystemObject”) |
With fso.GetFile(DLC & Filename1).OpenAsTextStream |
DataAll = .ReadAll |
.Close |
End With |
If InStr(DataAll, “test5”) <> 0 Then |
fso.CreateTextFile DLC & “R” & Filename1 |
DataAll = Replace(DataAll, “test5”, “Chikan5”) |
With fso.GetFile(DLC & “R” & Filename1).OpenAsTextStream(8) |
.Write DataAll |
.Close |
End With |
End If |
Set fso = Nothing |
Filename1 = Dir() |
DataAll = “” |
Loop |
END1: |
End Sub |
動作画面
実行前のフォルダです。
置換対象となる文字列を含むファイルは[5.txt]で中身はこのようになっています。
マクロを実行します。先ほどのフォルダに[R5.txt]というファイルが作成されました。
[R5.txt]を開けるとこのようになっています。置換対象の文字列が同じ行に2つあっても両方とも置換できている事が分かります。
あとがき
本記事では割愛しましたが、テキストを取り込む際は文字コードなどを注意して文字化けしないように注意しましょう。
通常時は1行づつ読み込んで処理を行い、速度を上げたい場合は全体読み込みで判定をかけてから配列格納して処理するといった流れになると思います。
通常の用途であれば本記事の内容で困る事は無いと思いますが、より高速で読み込む方法(Binary(配列化無))について検証されている記事がありますので紹介させて貰います。