テキストファイルを操作する(読み込む)


ファイルから読み込む

最初は、次のようなテキストファイルを例にします。

ファイルの場所(フルパス)は「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についての詳細は、下記のページをご覧ください。

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行ずつ読み込むのが得策です。