ファイルシステムオブジェクトを使用してテキストファイルを操作するには、まず、操作対象ファイルを表すテキストストリームオブジェクトを取得する必要があります。
テキストストリームオブジェクトの取得
テキストストリームオブジェクトを取得するには以下3つのメソッドのいずれかを使用します。どのメソッドを使用するのかは、テキストファイルに対する操作や処理内容により判断します。
- CreateTextFile ・・・ 主にテキストファイルを新規作成する場合に使用
- OpenTextFile ・・・ 主に既存テキストファイルを読み書きする場合に使用
- OpenAsTextStream ・・・ 主に既存テキストファイルを読み書きする場合に使用
メソッド | 新規 作成 |
読込 | 書込 (新規) |
書込 (追加) |
---|---|---|---|---|
○・・・可能、×・・・不可能 | ||||
fso.CreateTextFile folder.CreateTextFile |
○ | × | ○ | × |
fso.OpenTextFile | ○ | ○ | ○ | ○ |
file.OpenAsTextStream | × | ○ | ○ | ○ |
このページでは上記メソッドのうち、CreateTextFile メソッドを使用してテキストファイルを操作する方法を説明します。
CreateTextFileメソッドの使用方法
CreateTextFile メソッドは ファイルシステムオブジェクトとフォルダオブジェクトのメンバーメソッドです。そのときの処理に応じて使いやすいオブジェクトを選択します。CreateTextFile メソッドにより取得したテキストストリームオブジェクトは自動的に新規書き込みモードとなります。
引数名 | 省略 | 説明 |
---|---|---|
FileName | × | 作成するファイルのパスを表す文字列を指定します。 親オブジェクトがファイルシステムオブジェクトの場合は絶対パス、相対パスともに指定可能ですが、 フォルダオブジェクトの場合は相対パスのみ指定可能です。 |
Overwrite | ○ | 既にあるファイルを上書きする場合は True 、上書きしない場合は False を指定します。 既定値は True(上書きする)です。 |
Unicode | ○ | Unicode で作成されたファイルの場合は True 、ASCII で作成されたファイルの場合は False を指定します。 既定値は False (ASCII)です。 |
引数 FileName は同一メソッドでも親オブジェクトによって指定できるパスの種類と相対パスの基準が異なりますので注意してください。
- fso.CreateTextFile
・・・ 絶対パス、相対パスともに指定可能。 相対パスの基準は カレントフォルダ。 - folder.CreateTextFile
・・・ 相対パスのみ指定可能。相対パスの基準はフォルダオブジェクト。
出力に関する主なプロパティ・メソッド
書き込みモードでテキストストリームオブジェクト(表中、tsoと記載)を取得した後、以下のプロパティおよびメソッドを使用することで文字列の出力や出力行数の取得などが可能になります。
内容 | tso のプロパティ /メソッド |
---|---|
ファイルポインタ位置(行数)取得 | tso.Line |
行のカラム位置取得 (行頭からの文字位置) |
tso.Column |
文字列書き込み | tso.Write |
空白行書き込み | tso.WriteBlankLines |
文字列書き込み (自動的に改行) |
tso.WriteLine |
ファイルクローズ | tso.Close |
- tso.Line
現在のファイルポインタ(行)を取得します。先頭行は 1 となります。 tso.WriteLine メソッドなどを使用すると文字列はこの行へ出力されます。
- tso.Column
現在のカラム位置(行頭からの文字位置)を取得します。 行頭は 1 となります。tso.Write メソッドを使用すると文字列はこの位置へ出力されます。
- tso.Write ( String )
引数 String (省略不可)にはファイルに出力する文字列を指定します。 文字列の後ろに改行文字は付与されません。
- tso.WriteBlankLines ( Lines )
引数 Lines (省略不可)にはファイルに出力する改行文字の数を指定します。
- tso.WriteLine ( [String] )
引数 String (省略可)にはファイルに出力する文字列を指定します。 文字列の後ろに改行文字が自動的に付与されます。この引数を省略すると改行文字だけが出力されます。
- tso.Close
開いているテキストファイルを閉じます。
CreateTextFileメソッドの使用例
テキストファイルの出力例1
fso.CreateTextFile メソッドでテキストストリームオブジェクトを取得後、tso.Write メソッドで同一行に1文字ずつ出力する例です。CreateTextFile メソッドの第2引数 Overwrite を省略しているため、同名のファイルが存在した場合は上書き(前の内容は消去)されます。
Sub sample_fs026_01()
Dim fso As Object
Dim tso As Object
Dim strPath As String
Dim i As Integer
'ファイルシステムオブジェクトの生成
Set fso = CreateObject("Scripting.FileSystemObject")
'テキストストリームオブジェクトの取得
strPath = "C:\Users\xxxx\Desktop\vba\fs026_01.txt"
Set tso = fso.CreateTextFile(strPath)
With tso
For i = 1 To 5
'イミディエイトウィンドウへ出力位置と値を表示
Debug.Print "行 = " & .Line & _
" 位置 = " & .Column & _
" 値 = " & i
'文字列出力(改行なし)
.Write i
Next i
.Close 'ファイルのクローズ
End With
'オブジェクト変数のクリア
Set fso = Nothing
Set tso = Nothing
End Sub
For…Next Withステートメント Setステートメント
上記サンプルを実行すると下図のテキストファイルが出力されます。
テキストファイルの出力例2
folder.CreateTextFile メソッドでテキストストリームオブジェクトを取得後、tso.WriteLine メソッドにより行単位で出力する例です。
以下の例では、指定されたフォルダ内のテキストファイルの数をカウントし、そのカウント + 1 の値を新規作成するファイル名に含めています。また、WriteBlankLines メソッドにより、途中で空白行を2行出力しています。
Sub sample_fs026_02()
Dim fso As Object
Dim folderObj As Object
Dim fileObj As Object
Dim tso As Object
Dim count As Integer '初期値はゼロ
Dim strFile As String
Dim i As Integer
'ファイルシステムオブジェクトの生成
Set fso = CreateObject("Scripting.FileSystemObject")
'フォルダオブジェクトの取得
Set folderObj = fso.GetFolder("C:\Users\xxxx\Desktop\vba\")
For Each fileObj In folderObj.Files
'テキストファイルの個数をカウント
If LCase(fileObj.Name) Like "*.txt" Then
count = count + 1
End If
Next
'ファイル名の設定
strFile = "text_" & Format(count + 1, "0000") & ".txt"
'テキストストリームオブジェクトの取得
Set tso = folderObj.CreateTextFile(strFile)
With tso
For i = 1 To 5
'イミディエイトウィンドウへ出力位置と値を表示
Debug.Print "行 = " & .Line & _
" 位置 = " & .Column & _
" 値 = " & i
'文字列出力(改行あり)
.WriteLine i
'空白行の出力
If i = 3 Then .WriteBlankLines 2
Next i
.Close 'ファイルのクローズ
End With
'オブジェクト変数のクリア
Set fso = Nothing
Set folderObj = Nothing
Set fileObj = Nothing
Set tso = Nothing
End Sub
fso.GetFolder For…Next Withステートメント
Setステートメント
Like演算子 Format関数
下図はマクロ実行前のテスト用フォルダの状態です。
上記サンプルマクロを実行すると、新規にテキストファイルが作成されます。