前述したテキストストリームオブジェクトを取得する3つのメソッドのうち、 このページでは最後の OpenTextFile メソッドを使用してテキストファイルを読み書きする方法を説明します。
OpenAsTextStreamメソッドの使用方法
OpenAsTextStream メソッドは ファイルオブジェクトのメンバーメソッドです。ASCII形式のテキストファイルを読み込みモードで開く場合、引数はすべて省略することができます。
引数名 | 省略 | 説明 |
---|---|---|
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”の内容です。
下図はテキストファイル”fs027_03.TXT”の内容です。
上記サンプルマクロを実行すると、テキストファイル2つを読み込んでその内容をイミディエイトウィンドウへ表示します。
テキストファイルの追加書込例
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ステートメント
下図はテストフォルダの状態です。ログファイルが複数あります。
マクロ実行前のログファイルの内容です。
上記サンプルマクロを実行すると、ログファイル名の数値部分が一番多きファイルに日時が追加されました。
ファイルシステムオブジェクトのプロパティ・メソッド
Openステートメントを使用したテキストファイル読込
Openステートメントを使用したテキストファイル追加書込