アクセス上位ページ
 
最近の更新内容
(2)-g.OpenTextFile メソッド ⇐ [PREV]
[NEXT] ⇒ (3).FSOによるフォルダ操作

Excel VBA ≫ 3.FSO - FSOによるファイル操作(2)-h.OpenAsTextStream メソッド

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

これまで、CreateTextFile メソッド および OpenTextFile メソッドを使用したテキストファイル操作方法を説明しました。 当ページでは最後に OpenAsTextStream メソッドを使用してテキストファイルを読み書きする方法を説明します。



  • CreateTextFile ・・・ 主にテキストファイルを新規作成する場合に使用
  • OpenTextFile ・・・ 主に既存テキストファイルを読み書きする場合に使用
  • OpenAsTextStream ・・・ 主に既存テキストファイルを読み書きする場合に使用

各メソッドで可能な操作
メソッド 新規作成 読み込み 書き込み
(新規)
書き込み
(追加)
○・・・可能、×・・・不可能
CreateTextFile
(対象:fso、folder)
× ×
OpenTextFile
(対象:fso)
OpenAsTextStream
(対象:file)
×

管理人から一言・・・ 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 ・・・ オブジェクトライブラリへの参照設定をしないとこれらの定数は使用できません。 この場合は数値を直接指定するなどしてください。


テキストストリームオブジェクトの入出力に関するプロパティおよびメソッド

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

⇒ テキストストリームオブジェクト入力に関するプロパティおよびメソッド
⇒ テキストストリームオブジェクト出力に関するプロパティおよびメソッド
  • 既存テキストファイルの読み込み例
  • 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
    

    <指定フォルダの内容> 指定フォルダの内容 <テキストファイルの内容> テキストファイルの内容1 テキストファイルの内容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"という条件を指定することで、 何も設定されていないという状態の判別が可能になります。

    OpenAsTextStream メソッドの第1引数は、オブジェクトライブラリへの参照設定をしておくことで、定数“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
    

    <指定フォルダの内容> 指定フォルダの内容 <sample_fs028_02 実行前> sample_fs028_02 実行前 <sample_fs028_02 実行後>
    "LOG_0003.TXT"だけ現在日時が編集されます。 sample_fs028_02 実行後

カテゴリ内ページ



Page
Top