本記事では「VBAでテキストファイルを読み込む処理」について書いていきます。
ここで紹介する内容は下の通りです。
・「Line Input」で一行ずつファイル内データを読み込む方法
・「FileSystemObject」で一気にファイル内のデータを読み込む方法
では、さっそく解説していきます。
テキストファイルのデータを1行ずつ読み込む
ここで使うデータは下の「テキストファイル」になります。
テキスト内のデータを1行ずつ全てを読み込む
下のコードでテキストファイルの全てのデータを読み込みコードです。
1 2 3 4 5 6 7 8 9 |
Sub Sample1() Dim str As String Open "C:\Users\username\Desktop\data.txt" For Input As #1 Do Until EOF(1) Line Input #1, str MsgBox str '確認用 Loop Close #1 End Sub |
3行目:「Open」ステートメントでテキストファイルを開く。
4行目:「現在位置がファイルの末尾に達するまで」処理をループする指定をする
EOF(ファイル番号):現在位置がファイルの末尾に達したときに”True”を返す
Until:”true”になるまでDo~Loopの間の処理を繰り返す
※Do Loopが分からない人は『Do Loopの使い方』を参考にする
5行目:読み込み処理
※Line Inputが分からない人は『Line Inputの使い方』を参考にする
7行目:ここまでがループ範囲
8行目:3行目で開いたファイルを閉じる(閉じるときはファイル番号で指定する)
【応用編】読み込んだデータをエクセルに書き込む
「Line Inputを使ってデータを読み込むだけ」というのは実用性に欠けます。
なので、ここでは”読み込んだデータをエクセルに書き込んでいく”というコードを書いていきます。
※A列上でずらしながら、1つのセルに1行のデータを入れる。
1 2 3 4 5 6 7 8 9 10 |
Sub Sample2() Dim str As String, i As Long Open "C:\Users\username\Desktop\Data.txt" For Input As #1 Do Until EOF(1) Line Input #1, str i = i + 1 Cells(i, 1) = str Loop Close #1 End Sub |
上のコードは前回のコードに6,7行目の処理を追加しただけです。
7行目:指定したセル内に読み込んだデータ(str)を入れる。
Cells(行番号,列番号)
列番号を”1”に固定することでA列で固定した状態になる。
行番号に当たる、変数iを6行目で「i+1」することで、ループするごとに行番号が1ずつ増え、1行ずつずれていく。
一気にデータを読み込む(FileSystemObject)
上ではLine Inputでファイルの読み取りを行いました。
ですが、実はファイル読み込み時によく使われるのは『FileSystemObjectクラス』だったりします。
そのFileSystemObjectを使ったコードは下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Sample3() Dim data As String, tmp As Variant, i As Long With CreateObject("Scripting.FileSystemObject") With .GetFile("C:\Users\username\Desktop\Data.txt").OpenAsTextStream data = .ReadAll .Close End With End With tmp = Split(data, vbCrLf) For i = 0 To UBound(tmp) Cells(i + 1, 1) = tmp(i) '※Cells(行番号, 列番号) Next i End Sub |
FileSystemObjectを使ったファイル読み込みは全てを1つの変数に詰め込みます。
なので、そのまま読み込んだ値をセルに移すと”すべての文字列が1つのセルに入ってしまう”のです。
なので、上のコードでは取得した文字列を『Split関数』を使って1行ずつに分けて、一行ずつ別々のセルに入れていくようにしています。
3行目:FileSystemObjectのインスタンス化
4行目:対象ファイルを開く
5行目:ファイル内のデータを全て読み込む
6行目:対象ファイルを閉じる
9行目:”改行”を区切り文字にして、1行ずつ区切られた配列を返す
10行目:「0から配列(tmp)のインデックス最大値(UBound関数で取得)までループを繰り返す」を指定
11行目:A列で固定して、A1から順に分けた文字列を入れていく
1位 | 2位 | 3位 |
---|---|---|
Excel VBA 脱初心者のための集中講座 | パーフェクトExcel VBA | ExcelVBA 実戦のための技術 |
初心者~中級者 | 中級者 | 初心者~中級者 |
【初心者が手に取るべき参考書】 ・「書籍+動画」で圧倒的に理解しやすい入門書になっている。 ・丁寧で詳しい解説でボリューム感がある。 | 【より深い理解をしたい方にお勧めな参考書】 ・テーマに対して丁寧な解説・適度な深さで解説されている。 ・幅広くテーマを扱っていることから、基礎知識をあらかた網羅できる。 | 【入門書と一緒に買うべき参考書】 ・1つ1つのテーマを経験豊富なエンジニア視点で解説してくれている。 ・実践的で効果的なコードの書き方が理解できる。 |
【読んでみた一言】 正直、入門書はコレ一冊でいいかも。あとは中級者用の参考書に進むべし。 | 【読んでみた一言】 深く書かれているが、少々専門的に書かれていることから、読む前に数冊の入門書を読破したほうが良い。 | 【読んでみた一言】 基礎知識を持っている人が次のレベルに達するきっかけを与えてくれる参考書である。 |
スポンサーリンク