TL;DR — テキストファイルを読むには 3 つの道具があります。
Line Input #は 1 行の生の行を 文字列に読み込みます(分割は自分で行う)。Input #は区切られたフィールドをそのまま変数に 解析します(Write #が作ったファイルにのみ安全)。Input(LOF(f), #f)はファイル全体を 一度に読みます。Do Until EOF(f)でループし、各読み込みの前にEOFをチェックしましょう。 さもないと末尾を通り越してerror 62にぶつかります。
Dim n As Integer, line As String
n = FreeFile
Open "C:\data.txt" For Input As #n
Do Until EOF(n) ' 読む前に末尾かどうかをチェックする
Line Input #n, line ' 1 行の生の行を文字列に
Debug.Print line
Loop
Close #n
ファイルがチャネル上で開かれたら、それを読み戻すのは些細に見えます — 列が
混線して出てくるか、ループが最後の行を落とすまでは。どちらの問題も、間違った読み手を選んだことから
来ます。VBA は 3 つを与え、それらは交換可能ではありません。1 つは生の行を手渡し、1 つはあなたの
ために解析しようとし、1 つはすべてを一度に読みます。この技は、読み手を、ファイルがどう書かれたかに
合わせることです — そして Input # と Write # が対になった組であり、Line Input # と Print # も
同じく対であることを知ることです。
この記事で学べること
- 考え方の軸 — 3 つの読み手、そして間違った選択はデータを混線させる
Line Input #— 自分で分割する生の行(安全な既定)Input #—Write #の双子である解析器(そして素の CSV でつまずく)Do Until EOF()ループ、そしてerror 62を発生させる off-by-oneInput(LOF(f), #f)— ファイル全体を 1 つの文字列に読み込む- CSV を手で解析するよりブックとして開くほうがよいのはいつか
考え方の軸:3 つの読み手、ファイルに合う 1 つ
ほとんどの読み込みバグを防ぐ洞察はこれです。読み手は、ファイルがどう書かれたかに合っていなければ なりません。
Line Input #は 1 行を、改行を取り除いた生の文字列として読みます。解析は一切せず — どう 分割するかはあなたが決めます。予測可能で、あなたのデータを決して読み違えません。Input #は、Write #が書くのと同じ引用符とカンマのルールを使って、 解析された値のリストをそのまま変数に読み込みます。これはWrite #のまさに双子です。Input(LOF(f), #f)(ステートメントではなく関数)は、ファイル全体を 1 回の呼び出しで 1 つの 文字列に読み込みます。
だから対応のルールはすぐに導かれます。Write # で書かれたファイルは Input # で読み、Print #
(あるいは他のどんなプログラム)で書かれたファイルは Line Input # で読んで、あなたが分割します。
組を取り違えれば — 素の CSV を Input # に食わせれば — フィールドは間違った変数に着地します。
Line Input #:自分で分割する生の行
Line Input # は働き者であり、安全な既定です。ちょうど 1 行を文字列に読み込み、その次に何をするかは
あなた次第です。
Dim parts() As String
Line Input #n, line
parts = Split(line, ",") ' 区切り文字を選ぶのはあなた
解析を一切しないので、決して推測を誤りません。唯一気をつけるべきは、素朴な Split(line, ",") が、
引用符で囲まれたフィールドの中にあるカンマも分割してしまうことです("Rome, Italy" が 2 つの
部分になる)。データに引用符付きのカンマがあるなら、引用符をきちんと解析するか、あるいは — たいていは
より簡単に — Excel にやらせましょう。これは後述します。
Input #:Write # の双子(そして素の CSV を壊す理由)
Input # は、解析された値を型付き変数に直接読み込みます。
Dim name As String, city As String, age As Long
Input #n, name, city, age ' "Ann","Rome",42 を期待する(Write # 形式)
Write # が作ったファイルでは、これは完璧で速い — 引用符が、各文字列がどこで始まりどこで終わるかを
Input # に教えます。素の CSV(Ann,Rome,42)でもたいていは動きますが、フィールドが引用符のない
カンマ、アポストロフィ、あるいは余計な引用符を含んだ瞬間に壊れます。フィールドがずれ、" が決して
閉じない文字列を始め、行の残りが間違った変数に着地します。だから Input # が安全なのは Write # で
書かれたファイルにのみです。それ以外には、Line Input # と自分の分割が正直な選択です。
EOF ループと、error 62 を発生させる off-by-one
ファイルに何行あるかは分からないので、末尾まで読みます — そしてその末尾判定こそ、あの古典的なバグの
棲む場所です。各読み込みの前に EOF をチェックしましょう。
Do Until EOF(n) ' 正しい:判定してから読む
Line Input #n, line
' ... line を処理する ...
Loop
壊れた形は先に読んでからあとで判定するので、最後の行を 1 回分通り越して読もうとし、
error 62 Input past end of file を発生させます。
Do While Not EOF(n)
' ... 処理する ...
Line Input #n, line ' 最後のパスでは、これが末尾を通り越して読む -> error 62
Loop
EOF(n) は、最後の行が読まれると True を返します。EOF チェックをループの先頭に置いて、
通り越す読み込みの前に発火するようにしましょう。この順序ひとつが、「ループが最後の行を落とす、または
重複させる」バグを直します。
Input(LOF(f), #f):ファイル全体を一度に読む
ファイル全体を 1 つの文字列としてほしいとき — 検索したり、何かを数えたり、パーサーに渡したり — 1 回の呼び出しで読みましょう。
Dim whole As String
whole = Input(LOF(n), #n) ' LOF(n) = ファイルの長さ(バイト単位)
LOF はファイルの長さを返し、Input(length, #n) はその文字数だけ読みます。小~中サイズのファイルを
読み込むいちばん速い方法ですが、全体をメモリに保持する代償があります — 数メガバイトなら問題なく、
行ごとに走査するだけでよい巨大なログには無駄です。その場合は Line Input # ループのままにしましょう。
解析を飛ばして代わりにブックを開くべきとき
ファイルが本当はスプレッドシートなら — 行と列としてほしく、引用符付きのカンマも正しく扱ってほしい
.csv なら — テキストを手で解析するのは大変な道です。Workbooks.Open は
CSV を本物のシートに読み込み、引用符のルールを代わりに扱い、Cells(r, c) を直接読ませてくれます。
Dim wb As Workbook
Set wb = Workbooks.Open("C:\data.csv") ' Excel が CSV を解析してくれる
組み込みのテキスト読み手は、本物のテキスト作業のために取っておきましょう — ログ、固定幅ファイル、
設定、あるいは Write #/Input # による VBA 同士の往復です。セルに向かう表形式データには、ブックを
開くほうが簡単で、より正しいです。組み込みの読み込みは ANSI なので、アクセント付き文字を含む UTF-8
ファイルを正しく読むには ADODB.Stream か FileSystemObject が要る
ことに注意してください。
正直な結論:既定は Line Input、Input # は Write # ファイルにのみ
3 つの読み手、そして選択は速さの問題ではありません — 書き手に合わせる問題です。
Line Input #が既定 → 生の行を手渡し、決して読み違えません。あなたが分割するので、主導権は あなたに残ります。Input #はWrite #ファイルにのみ → これはWrite #の双子で、 引用符のないカンマや余計な引用符を含む素の CSV では混線します。EOFはループの先頭でチェック → 読んでから判定すると最後の行を通り越し、error 62を発生 させます。- 表形式データ → ブックを開く → CSV の引用符処理を手でやる代わりに、 Excel に任せる。
間違った読み手を選んだいちばんはっきりした印は、列が間違った変数に着地することです。それが起きたら、
あなたは Input # に、それが書いていないファイルを食わせたのです。Line Input # に切り替えて、
自分で分割しましょう。
ExcelMaster の活用
ファイルを読み戻すとは、読み手を書き手に合わせること — Write # ファイルには Input #、それ以外
すべてには Line Input # — EOF チェックを読み込みの前に置いて最後の行を失わないようにし、CSV を
ブックとして開くほうがテキストを手で解析するより勝るのはいつかを知っておくことです。「ファイルを読む」
にしては、たくさんの判断です。
ExcelMaster は、あなたの
ファイルに合う読み手を書きます。ジョブを説明すれば — 「このログをシートに取り込んで」、あるいは
「各行を読んでエラー行を抜き出して」 — Line Input # を使った Do Until EOF ループ、正しい分割、
そして Close を生成し、あるいはそのほうがきれいな道なら CSV をブックとして開きます —
ThisWorkbook.Path に固定して。あなたはほしいデータを説明するだけ。すべての
行をちょうど一度ずつ読むコードを書くのは、それがやります。
よくある質問
VBA でテキストファイルを 1 行ずつ読むには?
For Input で開き、Do Until EOF(n) と Line Input #n, line でループして各パスで 1 行の生の行を読み、
終わったら Close #n します。チャネル番号は FreeFile から取ります。EOF
チェックをループの先頭、読み込みの前に置いて、ループが最後の行を通り越して読もうとして error 62 を
発生させないようにしましょう。
VBA で Line Input # と Input # の違いは何ですか?
Line Input # は 1 行の生の行を文字列に読み込み、解析はあなたに委ねるので、データを決して読み
違えません。Input # は、Write # が書く引用符とカンマのルールを使って、
区切られたフィールドをそのまま変数に解析するので、Write # が作ったファイルにのみ信頼できます。
素の CSV には、Line Input # を使って行を自分で分割しましょう。
VBA の読み込みループが最後の行を飛ばす、または重複させるのはなぜですか?
EOF チェックが間違った場所にあるからです。先に読んであとで EOF を判定すると、ループは最後の行を
通り越すか — error 62 Input past end of file を発生させます — あるいはそれを取り違えます。
Do Until EOF(n) をループの先頭で使い、末尾判定が各 Line Input # の前に走るようにしましょう。
VBA でテキストファイル全体を 1 つの文字列に読むには?
Input 関数を LOF とともに使います:ファイルを For Input で開いたあと whole = Input(LOF(n), #n)。
LOF はファイルの長さをバイト単位で返し、Input(length, #n) はその文字数を 1 回の呼び出しで読みます。
小~中サイズのファイルを読み込むいちばん速い方法ですが、ファイル全体をメモリに保持するので、非常に
大きなファイルには Line Input # ループを使いましょう。
VBA で CSV ファイルを読むには?
CSV がセルに向かう表形式データなら、いちばん簡単で正しい方法は
Workbooks.Open です。引用符のルールを解析し、Cells(r, c) で読める
本物のシートを与えてくれます。どうしてもテキストを直接解析しなければならないなら、Line Input # を
使って各行を分割し、引用符付きのカンマは自分で扱いましょう — そしてファイルが UTF-8 なら、組み込みの
読み込みは ANSI なので、ADODB.Stream か FileSystemObject に手を
伸ばしましょう。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-25。
関連ガイド: VBA FreeFile & Open · VBA Print # vs Write # · VBA Open Workbook · VBA FileSystemObject · VBA Dir
