最初は、次のようなテキストファイルを例にします。
ファイルの場所(フルパス)は「C:\Sample\Data.txt」とします。このファイルから、1行ずつ読み込んでセルに代入してみましょう。
テキストファイルから1行ずつ読み込むには、Line Inputステートメントを使います。
Line Input #番号, 変数
Sub Sample1() Dim buf As String Open "C:\Sample\Data.txt" For Input As #1 Line Input #1, buf MsgBox buf Close #1 End Sub
Line Inputステートメントは、1行分のデータを読み込むと、読み取りポイントを次の行に移します。つまり、Line Inputステートメントを繰り返すことで、テキストファイルの中を、1行ずつ、すべて読み込むことができるわけです。
読み取りがファイルの終端に達するまで、Line Inputステートメントを繰り返します。
Sub Sample2() Dim buf As String Open "C:\Sample\Data.txt" For Input As #1 Do 読み取りポイントが終端に達するまで Line Input #1, buf セル = buf Loop Close #1 End Sub
読み取りポイントがファイルの終端に達したかどうかは、EOF関数で判定できます。EOF関数は、読み取りポイントがファイルの終端に達するとTrueを返します。したがって、EOF関数の結果が「Falseの間だけ」Line Inputを繰り返せばいいです。
Sub Sample2() Dim buf As String Open "C:\Sample\Data.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf セル = buf Loop Close #1 End Sub
読み込んだデータを書き込むセルは、A1→A2→A3のように行が1つずつ増加しますので、カウント用の変数を使います。
Sub Sample2() Dim buf As String, n As Long Open "C:\Sample\Data.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop Close #1 End Sub
これが、テキストファイルを読み込んで、セルに展開する基本です。Line Inputステートメントで1行ずつ読み込むなんて、大量なデータではさぞ時間がかかるだろう…と誤解している人もいるようです。しかし、パソコンのスペックにもよりますが、数100~数1000行程度のファイルなら一瞬で読み込めます。YouTubeやニコ動で動画を再生する方が、パソコンにとっては、よほど大仕事です。テキストファイルを数100行読み込むなんて朝飯前です。
テキストファイルのデータを、1行ずつではなく、一気に読み込むには、FileSystemObjectを使います。FileSystemObjectについての詳細は、下記のページをご覧ください。
Sub Sample3() Dim buf As String With CreateObject("Scripting.FileSystemObject") With .GetFile("C:\Sample\Data.txt").OpenAsTextStream buf = .ReadAll .Close End With End With Range("A1") = buf End Sub
ただし、結果は下図のようになります。
テキストファイルが改行されているからといって、1行分のデータが、ワークシートでも行ごとに代入されるわけではありません。一気に読み込んだデータを、改行ごとに分割して代入するには、たとえば次のようにしなければなりません。
Sub Sample4() Dim buf As String, tmp As Variant, i As Long With CreateObject("Scripting.FileSystemObject") With .GetFile("C:\Sample\Data.txt").OpenAsTextStream buf = .ReadAll .Close End With End With tmp = Split(buf, vbCrLf) For i = 0 To UBound(tmp) Cells(i + 1, 1) = tmp(i) Next i End Sub
あるいは
Sub Sample5() Dim buf As String, tmp As Variant With CreateObject("Scripting.FileSystemObject") With .GetFile("C:\Sample\Data.txt").OpenAsTextStream buf = .ReadAll .Close End With End With tmp = Split(buf, vbCrLf) Range("A1").Resize(UBound(tmp) + 1, 1) = WorksheetFunction.Transpose(tmp) End Sub
けっこう面倒くさいでしょ。だから、基本通りに、Line Inputステートメントで1行ずつ読み込むのが得策です。