CSV形式・TSV形式などのテキストファイルを読み込んで、イミディエイトウィンドウに出力するマクロをご紹介しました。
この考え方をベースに、もう少し実際にお仕事で使える形にしたマクロをご紹介しておきましょう。テキストファイルのデータを読み込んで、ワークシートへ書き出すマクロです。
ここでは書き出す処理を、行単位で行うマクロと、セル単位で行うマクロの2つをご紹介しておきます。
データを読み込んで一行単位でワークシートに書き出すサンプルマクロ
以下のマクロを実行すると、定数・TXTに指定されたTSV形式のテキストファイル「c:\tmp\sample.txt」を読み込んで、新規ワークシートにデータが書き出されます。
Const TXT = "c:\tmp\sample.txt"
Dim num As Long ' ファイル番号
Dim rcd As String ' テキストファイルの1行分の文字列(1レコード)
Dim arr() As String
Dim r As Long ' 書き込みを行うワークシートの行番号
num = FreeFile
Open TXT For Input As num
Sheets.Add Before:=Sheets(1)
r = 1
Do Until EOF(num)
Line Input #num, rcd
arr = Split(rcd, vbTab)
Range(Cells(r, 1), Cells(r, UBound(arr) + 1)).Value = arr
r = r + 1
Loop
Close num
End SubFreeFile関数でファイル番号を取得してファイルを開く部分は、既にご紹介している、イミディエイトウィンドウに出力するマクロと同じです。
num = FreeFile
Open TXT For Input As num
つづいて、アクティブブックの先頭にシートを追加して、データの書き出しを行う行番号を表す変数を初期化しています。
Sheets.Add Before:=Sheets(1)
r = 1
イミディエイトウィンドウに出力するマクロと同じく、Do~Loopループの中で1行ごとにデータを変数・rcdに読み込んでおいて、
Do Until EOF(num)
Line Input #num, rcd
ワークシートにデータを書き出すために、Split関数を使って、1行分のデータを、タブ文字ごとに区切って配列にします。
arr = Split(rcd, vbTab)
配列に格納された1行分のデータをセルに書き出してから、
Range(Cells(r, 1), Cells(r, UBound(arr) + 1)).Value = arr
行番号を表す変数・rをインクリメントしています。
r = r + 1
テキストファイルを読み込んでセル単位でデータを書き出すサンプルマクロ
テキストファイルのデータを読み込んで、セル単位でデータを書き出すのなら以下のようなマクロです。
Const TXT = "c:\tmp\sample.txt"
Dim num As Long ' ファイル番号
Dim rcd As String ' テキストファイルの1行分の文字列(1レコード)
Dim arr() As String
Dim r As Long ' 書き込みを行うワークシートの行番号
Dim c As Long ' 書き込みを行うワークシートの列番号
num = FreeFile
Open TXT For Input As num
Sheets.Add Before:=Sheets(1)
r = 1
Do Until EOF(num)
Line Input #num, rcd
arr = Split(rcd, vbTab)
For c = 1 To UBound(arr) + 1
Cells(r, c).Value = arr(c - 1)
Next c
r = r + 1
Loop
Close num
End Sub全体の構造は先のマクロと同じですが、書き出す処理だけが異なります。
先のマクロでは行単位で書き出しを行っていましたが、
Range(Cells(r, 1), Cells(r, UBound(arr) + 1)).Value = arr
このマクロではFor~Nextループを使ってセル単位で書き出しています。
For c = 1 To UBound(arr) + 1
Cells(r, c).Value = arr(c - 1)
Next c
先にご紹介した1行ごとにデータを書き出すマクロでは、すべてのデータが文字列として書き出されますが、セル単位で書き出すマクロでは数値データは数値として書き出されます。
一見、セル単位で書き出すほうが良さそうに感じる方がいらっしゃるかもしれませんが、例えばテキストファイル内の「0001」といったデータは、このままの形で読み込みたいというニーズはあるはずですので、どちらを採用するかは、実際のデータ・業務を精査して決めてください。
まず配列関連の処理を理解しましょう
この記事でご紹介しているマクロは、いずれも配列を利用していますので、そもそも配列に慣れていない方は、ローカルウィンドウで配列に格納されているデータを確認しながら、配列について理解することをおすすめします。
Split関数とUBound関数、二次元配列をワークシートへ一気に書き出す処理あたりを、先に理解しましょう。
- Newer:VBAでピボットテーブルのフィルターを全てクリア・解除する
- Older:VBAでテキストファイル・CSVファイルを読み込むには-Openステートメント・Line Input #ステートメント
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » テキストファイルを読み込んでワークシートへデータを書き出すExcelマクロ