テキストデータの読み込み

ワークブックとして開くのではなく、テキストファイルを直接読み込みます。
デザイン済みのシートにデータを直接読み込むことができます。 ここでは、古くからのBASICのステートメントの記述方法と、FSO(FileSystemObject)を操作する方法で、テキストファイルを読み書きする方法を解説します。
例えば、CSV形式のファイルを直接開くと、見出しもないデータの羅列がワークシートに展開されてしまいますが、ここでのサンプルの方法であればデザインしたワークシートの見出しの下の行からデータを読み込んで表示させたり、ワークシートに表示させないで内部処理を行なうなどのことができます。
なお、これから新しく取り組む方は古いステートメントではなく、最初からFSO(FileSystemObject)を学んで下さい。
まずは、「古くからあるステートメント」の方法です。
通常の文書のようなテキストデータを改行(CRLF)単位に1行ずつ読み込みます。

Option Explicit

' テキストファイル読み込みサンプル
Sub READ_TextFile()
    Const cnsTITLE = "テキストファイル読み込み処理"
    Const cnsFILTER = "全てのファイル (*.*),*.*"
    Dim xlAPP As Application        ' Applicationオブジェクト
    Dim intFF As Integer            ' FreeFile値
    Dim strFileName As String       ' OPENするファイル名(フルパス)
    Dim vntFileName As Variant      ' ファイル名受取用
    Dim strREC As String            ' 読み込んだレコード内容
    Dim GYO As Long                 ' 収容するセルの行
    Dim lngREC As Long              ' レコード件数カウンタ

    ' Applicationオブジェクト取得
    Set xlAPP = Application                                         ' @
    ' 「ファイルを開く」のダイアログでファイル名の指定を受ける
    xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
    vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
                                        Title:=cnsTITLE)            ' A
    ' キャンセルされた場合はFalseが返るので以降の処理は行なわない
    If VarType(vntFileName) = vbBoolean Then Exit Sub               ' B
    strFileName = vntFileName

    ' FreeFile値の取得(以降この値で入出力する)
    intFF = FreeFile                                                ' C
    ' 指定ファイルをOPEN(入力モード)
    Open strFileName For Input As #intFF                            ' D
    GYO = 1
    ' ファイルのEOF(End of File)まで繰り返す
    Do Until EOF(intFF)                                             ' E
        ' レコード件数カウンタの加算
        lngREC = lngREC + 1
        xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)"
        ' 改行までをレコードとして読み込む
        Line Input #intFF, strREC                                   ' F
        ' 行を加算しA列にレコード内容を表示(先頭は2行目)
        GYO = GYO + 1
        Cells(GYO, 1).Value = strREC                                ' G
    Loop
    ' 指定ファイルをCLOSE
    Close #intFF                                                    ' H
    xlAPP.StatusBar = False
    ' 終了の表示
    MsgBox "ファイル読み込みが完了しました。" & vbCr & _
        "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub
@
Applicationオブジェクトの取得です。StatusBarGetOpenFilenameなどで何回も生成されるので、予め変数を宣言してその参照を受け取っておくと良いでしょう。
A
「ファイルを開く」のダイアログを表示させます。
テキストデータの読み込み(ファイルを開く)
(画像をクリックすると、このサンプルがダウンロードできます)
このようになります。ここで読み込むファイルを任意に選ぶことができます。上から2行目の「cnsFILTER」で「全てのファイル」としていますが、テキストファイルだけに絞り込むこともできます。但し、ここでの処理はフルパスでファイル名を受け取るだけで「開く」等の処理は別途記述しなければなりません。
また、ファイル名が決まっている場合は、「strFILENAME」にフルパスのファイル名を直接セットして、このダイアログを表示させずに進めます。
B
Aのダイアログで「キャンセル」や「×」が選択された場合の処置です。
キャンセルされると、Falseが返るのですが、String変数で受け取ってしまうとWindows等のバージョンによって「False」となったり「FALSE」となったりするようです。 このため、一旦、Variant型で受け取り、VarType関数で内部データ型を調べます。 FalseBoolean型なのでBooleanだったらキャンセルだと判断して、ここで抜けてしまいます。 そうでない場合はファイル名が文字列で返されているはずなので文字列型の変数にセットし直しています。
C
FreeFile関数は、使用可能なファイル番号を受け取る関数です。通常は1ファイル目なので「1」に決まっていますが、実行時エラー等でCloseせずに止まった場合は次に起動させても「1」は「使用中」になって実行できなくなります。このため、必ず空き番号をWindowsからFreeFile関数で受け取るようにします。
D
実際のファイルのOpenです。「For」の後ろが入出力モードで「Input」は入力用です。
E
「ファイル番号intFFEOF=Trueになるまで繰り返す」という記述です。「= True」はこのように省略できます。(EOF = End Of File)
F
行単位で1レコードを読み込みます。改行(CRLF)がないデータファイルだと1回目でファイル全体を受け取ってしまいます。「Line Input」をただ「Input」としてもほとんど同じ動作ですが、レコードの途中にカンマがあると、その前までしか受け取りません。行単位の場合は必ず「Line Input」として下さい。レコードの内容は改行(CRLF)が除かれて「strREC」に収容されます。
G
行の変数を加算してから、その行のA列のセルにレコード内容を転記させています。
H
ファイルのCloseです。これによりファイル番号=intFFは解放されます。

中核となる記述はこれだけです。
さて、ここではファイル名の取得や読み込み件数など、「本業」以外の記述があって難しく見えてしまいますが、エッセンスはこれだけです。

Option Explicit

' テキストファイル読み込みサンプル2
Sub READ_TextFile2()
    ' 読み込むファイル名(固定)
    Const cnsFILENAME = "C:\TEMP\HOGE.txt"
    Dim intFF As Integer            ' FreeFile値
    Dim strREC As String            ' 読み込んだレコード内容
    Dim GYO As Long                 ' 収容するセルの行

    ' FreeFile値の取得(以降この値で入出力する)
    intFF = FreeFile
    ' 指定ファイルをOPEN(入力モード)
    Open cnsFILENAME For Input As #intFF
    GYO = 1
    ' ファイルのEOF(End of File)まで繰り返す
    Do Until EOF(intFF)
        ' 改行までをレコードとして読み込む
        Line Input #intFF, strREC
        ' 行を加算しA列にレコード内容を表示(先頭は2行目)
        GYO = GYO + 1
        Cells(GYO, 1).Value = strREC
    Loop
    ' 指定ファイルをCLOSE
    Close #intFF
End Sub
プロシージャやコメント行を除くと13行しかありません。理解するのはそれほど難しくないと思います。読み込むファイル名が固定ならばこれでも良いわけです。
但し、最初に書いた通り、この「古くからあるステートメント」は新たに学ぶことはありません。実際のところネットワーク上などの長いファイル名に対応できないなどの制限もあるようです。 これからやってみるという方は、この次のFSO(FileSystemObject)だけを学ぶことで良いと思います。

FSO(FileSystemObject)だと、このようになります。
一方、これをFSO(FileSystemObject)で記述すると、

Option Explicit

' テキストファイル読み込みサンプル3(FSO)
' 参照設定:Microsoft Scripting Runtime
Sub READ_TextFile3()
    ' 読み込むファイル名(固定)
    Const cnsFILENAME = "C:\TEMP\HOGE.txt"
    Dim FSO As New FileSystemObject' FileSystemObject
    Dim TS As TextStream            ' TextStream
    Dim strREC As String            ' 読み込んだレコード内容
    Dim GYO As Long                 ' 収容するセルの行

    ' 指定ファイルをOPEN(入力モード)
    Set TS = FSO.OpenTextFile(cnsFILENAME, ForReading)
    GYO = 1
    ' ファイルのEOF(End of File)まで繰り返す
    Do Until TS.AtEndOfStream
        ' 改行までをレコードとして読み込む
        strREC = TS.ReadLine
        ' 行を加算しA列にレコード内容を表示(先頭は2行目)
        GYO = GYO + 1
        Cells(GYO, 1).Value = strREC
    Loop
    ' 指定ファイルをCLOSE
    TS.Close
    Set TS = Nothing
    Set FSO = Nothing
End Sub
このようになります。このような単純な動作ではOpen,Inputステートメントとの優劣は見つかりにくいですが、フォルダ名を含めたフルパスのファイル名の総長の制限などではFSO(FileSystemObject)の方が有利なので、これからマスターされる方はこちらの方法を理解するようにして下さい。
※この記述方法では「Microsoft Scripting Runtime」の参照設定が必要です。
Microsoft Scripting Runtimeの参照設定
VBEの方の「ツール」メニューから「参照設定」を選んで、「Microsoft Scripting Runtime」にチェックをつけてOKをクリックして下さい。