テキストファイルの読み込み
テキストファイルを読み込むプログラムを作成してみたいと思います。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