テキストファイルの読み込み

テキストファイルを読み込むプログラムを作成してみたいと思います。TextStreamのReadLineというメソッドでテキストファイルから1行分読み込むことができます。簡単な例を以下に示します。

Sub ReadText()

    'SystemObjectの生成
    Dim objFS As FileSystemObject
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'ファイルパス設定
    Dim fPath As String
    fPath = "C:\work\est.txt"
    
    'ファイル存在チェック
    If objFS.FileExists(fPath) = False Then
        MsgBox "ファイルが存在しません。"
        Set objFS = Nothing
        Exit Sub
    End If
    
    'TextStream取得
    Dim objTS As TextStream
    Set objTS = objFS.OpenTextFile(fPath, ForReading)   '←読み込み専用でファイルを開く
    Set objFS = Nothing '←FileSystemObjectは解放しておく

    '一行読み込み
    Dim lineStr As String
    lineStr = objTS.ReadLine

    MsgBox lineStr  '読み込んだ文字列を表示

    objTS.Close '←ファイルを閉じる
    Set objTS = Nothing '←textStreamの解放

End Sub

これを利用して、テキスト形式のイベントログ(システム)から警告やエラーをセルに表示してみます。ファイルは末尾までループで読み込むことにします。ファイルの末尾はTextStreamのAtEndOfStreamで確認することができるので、これを利用します。また、フィールドの項目はタブ区切りになっています。Split関数を使い、タブを区切り文字として配列に格納し、必要なものをセルに出力するようにしました。あと、1つ大きな問題なのが、1行が1レコードになっていないことです。そのため、2行にわたるものは2行目は切り捨てることにしました。Like関数を使って最初の10行が9999/99/99(※9は数字)の場合のみ配列に格納しました。

Sub getSystemErrLog()
    
    '-------------------------------
    ' 事前準備
    '-------------------------------
    'SystemObjectの生成
    Dim objFS As FileSystemObject
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'A1セルよりシステムログのパスを取得
    Dim fPath As String
    fPath = Cells(1, "A").Value
    
    'ファイルの存在確認
    If objFS.FileExists(fPath) = False Then
        MsgBox "ファイルが存在しません。"
        Set objFS = Nothing
        Exit Sub
    End If
    
    'TextStream取得
    Dim objTS As TextStream
    Set objTS = objFS.OpenTextFile(fPath, ForReading)   '←読み込み専用でファイルを開く
    Set objFS = Nothing '←FileSystemObjectは解放しておく
    
    '-------------------------------
    ' 読み込み処理
    '-------------------------------
    'ファイルポインタが最後になるまでループ
    Dim lineStr As String
    Dim fieldItem As Variant
    Dim y As Integer
    y = 5
    Do While objTS.AtEndOfStream = False
        lineStr = objTS.ReadLine    '一行読み込み
        '最初の10行が9999/99/99の場合(※9は数字)
        If Left(lineStr, 10) Like "####/##/##" Then
            fieldItem = Split(lineStr, vbTab) '←タブを区切り文字として配列に格納
            '種類が情報以外の場合
            If fieldItem(3) <> "情報" Then
                Cells(y, 1).Value = fieldItem(3) '←種類を出力
                Cells(y, 2).Value = fieldItem(0) '←日付出力
                Cells(y, 3).Value = fieldItem(1) '←時刻出力
                Cells(y, 4).Value = fieldItem(2) '←ソース出力
                Cells(y, 5).Value = fieldItem(5) '←イベントID出力
                Cells(y, 6).Value = fieldItem(8) '←説明を一行分出力
                y = y + 1
            End If
        End If
    Loop

    '-------------------------------
    ' 終了処理
    '-------------------------------
    objTS.Close '←ファイルを閉じる
    Set objTS = Nothing
    MsgBox "完了しました。"
    
End Sub