OpenAsTextStreamメソッドによるテキストファイル操作

前述したテキストストリームオブジェクトを取得する3つのメソッドのうち、 このページでは最後の OpenTextFile メソッドを使用してテキストファイルを読み書きする方法を説明します。

OpenTextFile メソッドと OpenAsTextStream メソッドは新規ファイルが作成できるかどうかを除いては機能的に同じです。OpenAsTextStream メソッドはファイルオブジェクトが対象となりますので、操作したいテキストファイルのファイルオブジェクトが取得できている状況ではこちらを使用するとよいでしょう。

スポンサーリンク

OpenAsTextStreamメソッドの使用方法

OpenAsTextStream メソッドは ファイルオブジェクトのメンバーメソッドです。ASCII形式のテキストファイルを読み込みモードで開く場合、引数はすべて省略することができます。

構文
file.OpenAsTextStream ( [IOMode] [, Format] )
引数名 省略 説明
IOMode 読み込みか、書き込みかのモードを指定します。
既定値は ForReading です。

<指定可能な定数(※1)>
ForReading(値:1) ・・・ 読み込み
ForWriting(値:2) ・・・ 新規書き込み
ForAppending(値:8) ・・・ 追加書き込み
Format 開くファイルの形式を指定します。
既定値は TristateFalse です。

<指定可能な定数(※1)>
TristateUseDefault(値:-2) ・・・ システムデフォルト
TristateTrue(値:-1) ・・・ Unicode
TristateFalse(値:0) ・・・ ASCII

※1・・・オブジェクトライブラリへの参照設定をしないとこれらの定数は使用できません。
参照設定をしない場合は直接数値を指定してください。

入出力に関する主なプロパティ・メソッド

これまでのページで説明済みですので以下のリンクを参照してください。

OpenAsTextStreamメソッドの使用例

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

file.OpenAsTextStream メソッドを使用して読み込みモードでテキストストリームオブジェクトを取得後、tso.ReadLine メソッドにより1行ずつ読み込む例です。

以下の例では指定したフォルダ内のテキストファイルを拡張子により判別し、テキストファイルの内容を1行ずつ読み込んでイミディエイトウィンドウへ表示します。拡張子を判別する際、LCase 関数を使用してファイル名を小文字に変換することで、大文字・小文字の区別をなくしています

Sub sample_fs028_01()
    Dim fso         As Object   'ファイルシステムオブジェクト
    Dim fileObj     As Object   'ファイルオブジェクト
    Dim folderObj   As Object   'フォルダオブジェクト
    Dim tso         As Object   'テキストストリームオブジェクト
    Dim strPath     As String   'フォルダパス

    'ファイルシステムオブジェクトの生成
    Set fso = CreateObject("Scripting.FileSystemObject")
    'フォルダパス
    strPath = "C:\Users\xxxx\Desktop\vba\"
    'フォルダオブジェクト取得
    Set folderObj = fso.GetFolder(strPath)

    For Each fileObj In folderObj.Files
        'テキストファイルをファイル拡張子で判別
        If LCase(fileObj.Name) Like "*.txt" Then
            'ファイル名の表示
            Debug.Print "ファイル名:" & fileObj.Name

            'テキストストリームオブジェクトの取得(読み込みモード)
            Set tso = fileObj.OpenAsTextStream

            With tso
                'ファイル末尾まで繰り返し
                Do Until .AtEndOfStream
                    'イミディエイトウィンドウへ行と値を表示
                    Debug.Print "行 = " & .Line & _
                                " 値 = " & .ReadLine
                Loop

                .Close  'ファイルのクローズ
            End With
        End If
    Next

    'オブジェクト変数のクリア
    Set fso = Nothing
    Set fileObj = Nothing
    Set folderObj = Nothing
    Set tso = Nothing
End Sub

 fso.GetFolder For Each…Next  Do…Loop  Withステートメント
 Like演算子 LCase、UCase関数  Setステートメント

下図はテスト用フォルダの状態です。テキストファイルが2つあります。

指定フォルダの内容
指定フォルダの内容

下図はテキストファイル”fs027_01.txt”の内容です。

テキストファイルの内容1
テキストファイルの内容1

下図はテキストファイル”fs027_03.TXT”の内容です。

テキストファイルの内容2
テキストファイルの内容2

上記サンプルマクロを実行すると、テキストファイル2つを読み込んでその内容をイミディエイトウィンドウへ表示します。

  • マクロ実行結果(イミディエイトウィンドウ
    ファイル名:fs027_01.txt
    行 = 1 値 = 1234567890
    行 = 2 値 = あいうえおabc
    行 = 3 値 = ABCDE
    ファイル名:fs027_03.TXT
    行 = 1 値 = 2013/08/29 20:37:00
    行 = 2 値 = 2013/08/30 21:01:12
    行 = 3 値 = 2013/08/30 23:56:01

テキストファイルの追加書込例

file.OpenAsTextStream メソッドを使用して追加書き込みモードでテキストストリームオブジェクトを取得後、tso.WriteLine メソッドにより現在日時を追加書き込みする例です。

以下の例ではログファイル”log_####.txt”がフォルダ内に複数存在するという前提で、”####”部分の4ケタの数値が最も大きいファイルに現在日時を追加書き込みする仕様にしています。ファイル名の長さは固定にしてあるため、4ケタの数値を直接比較しなくてもファイル名の大小で比較可能です。
ログファイル名は大文字・小文字を区別しない設定にしていますので、途中で LCase 関数や、StrComp 関数を使用しています。

オブジェクト変数は何も設定しないと”Nothing”という状態になっています。if文などにおいて”[オブジェクト変数] Is Nothing”という条件を指定することで、何も設定されていないという状態の判別が可能になります。

fso.OpenTextFile メソッドの第2引数は、オブジェクトライブラリへの参照設定をしておくことで、定数“ForAppending”が指定可能になります。

Sub sample_fs028_02()
    Dim fso         As Object   'ファイルシステムオブジェクト
    Dim fileObj     As Object   'ファイルオブジェクト
    Dim fileObj_log As Object   'ファイルオブジェクト
    Dim folderObj   As Object   'フォルダオブジェクト
    Dim tso         As Object   'テキストストリームオブジェクト
    Dim strPath     As String   'フォルダパス

    'ファイルシステムオブジェクトの生成
    Set fso = CreateObject("Scripting.FileSystemObject")
    'フォルダパス
    strPath = "C:\Users\xxxx\Desktop\vba\"
    'フォルダオブジェクト取得
    Set folderObj = fso.GetFolder(strPath)

    For Each fileObj In folderObj.Files
        '指定のファイルパターンを判別
        If LCase(fileObj.Name) Like "log_####.txt" Then
            If fileObj_log Is Nothing Then
                '初回のループではfileObj_logに何も設定されてないため、
                '取得したファイルオブジェクトをそのまま設定
                Set fileObj_log = fileObj
            Else
                'ループ2回目以降はファイル名を大文字小文字区別なしで比較。
                'fileObjが大きければfileObj_logに設定する。
                If StrComp(fileObj_log.Name, fileObj.Name, _
                           vbTextCompare) = -1 Then
                    Set fileObj_log = fileObj
                End If
            End If
        End If
    Next

    'ログファイルが存在しているか判断
    If Not fileObj_log Is Nothing Then
        'テキストストリームオブジェクトの取得(追加書き込みモード)
        Set tso = fileObj_log.OpenAsTextStream(8)

        With tso
            .WriteLine Now  '現在日時を追加書き込み
            .Close  'ファイルのクローズ
        End With
    End If

    'オブジェクト変数のクリア
    Set fso = Nothing
    Set fileObj = Nothing
    Set fileObj_log = Nothing
    Set folderObj = Nothing
    Set tso = Nothing
End Sub

 fso.GetFolder For Each…Next Withステートメント Like演算子
 LCase、UCase関数 StrComp関数  Setステートメント

下図はテストフォルダの状態です。ログファイルが複数あります。

指定フォルダの内容
指定フォルダの内容

マクロ実行前のログファイルの内容です。

sample_fs028_02 実行前
sample_fs028_02 実行前

上記サンプルマクロを実行すると、ログファイル名の数値部分が一番多きファイルに日時が追加されました。

sample_fs028_02 実行後
sample_fs028_02 実行後

 
ファイルシステムオブジェクトのプロパティ・メソッド
Openステートメントを使用したテキストファイル読込
Openステートメントを使用したテキストファイル追加書込

タイトルとURLをコピーしました