CreateTextFile について
既存のテキストファイルを開くだけでなく、新規にテキストファイルを作成するようなシーンも考えられるので、CreateTextFileメソッドについても勉強します!
■CreateTextFileメソッド
新規ファイルを作成して、そのTextStreamオブジェクトを返すメソッドです
既存ファイルはデフォルトで上書きします
・構文
構文は以下の通りです
object.CreateTextFile (filename, [ overwrite, [ unicode ]])
objectはFileSystemObjectのオブジェクトです
・パラメータ
メソッドのパラメータは以下の通りです
- filename … 作成するファイルのパス
- [overwrite] … 既存ファイルを上書きするかどうか
- [unicode] … ファイル形式がUnicodeかASCIIか
filenameには、作成するファイルのパスを設定します(必須項目)
[overwrite]には、既存のファイルを上書きするかどうかを指定可能です
True : 上書きする【デフォルト】、False : 上書きしない
※既存ファイルのパスで[overwrite]をFalseにするとエラーが発生する
[unicode]には、作成するファイルがUnicodeかASCIIかを指定可能です
True : Unicode、False : ASCII【デフォルト】
・戻り値
メソッドの戻り値は以下の通りです
- TextStreamオブジェクト
どうやらこのTextStreamオブジェクトは、書き込み専用のようです!(?)
既存ファイルが読み取り専用だとした場合、上書きできないのでエラーになります
上書き可能な状態の場合は、空の状態で作成されるので、読み取りできるものがなく、書き込みしか受け付けない状態です!
■例
・簡単なサンプル
①-1:CreateTextFileの参照設定を使用したサンプル
Sub CreateTextFile_Sample(filename As String, oText As TextStream) Dim obj As FileSystemObject ' オブジェクトを作成 Set obj = New FileSystemObject ' TextStreamオブジェクトを取得 Set oText = obj.CreateTextFile(filename, True, False) ' オブジェクトを破棄 Set obj = Nothing End Sub
FileSystemObjectのScriptingライブラリを参照設定しておけば、上記サンプルのように、FileSystemObjectオブジェクトもTextStreamオブジェクトも変数や引数の型で指定できます
①-2:CreateTextFileの実行時バインディングのサンプル
Sub CreateTextFile_Sample2(filename As String, oText As Object) Dim obj As Object ' オブジェクトを作成 Set obj = CreateObject("Scripting.FileSystemObject") ' TextStreamオブジェクトを取得 Set oText = obj.CreateTextFile(filename, True, False) ' オブジェクトを破棄 Set obj = Nothing End Sub
実行時バインディングを使用した書き方は①-2のようになりますね!
上記のように、FileSystemObjectオブジェクトを作成して、そのCreateTextFileメソッドでTextStreamオブジェクトを取得します!
①-3:TextStreamを実行時バインディングで呼び出そうとしたサンプル
Sub TextStream_Sample() Dim obj As Object ' オブジェクトを作成(エラーになる) Set obj = CreateObject("Scripting.TextStream") ' オブジェクトを破棄 Set obj = Nothing End Sub
TextStreamもScriptingライブラリに含まれていますけど、①-3のように書いてもTextStreamオブジェクトは作成できませんのでご注意をー
②-1:呼び出し元関数の(エラーになる)読み取りサンプル
Sub CallCreateTextFile_Sample1() Dim oText As TextStream Dim filename As String ' CreateTextFileファイルパス filename = "E:\VBA\Sample001\Sample.txt" ' 作成した関数を呼び出す Call CreateTextFile_Sample(filename, oText) With oText ' ファイルの最後まで読み込む(エラーになる) Do Until .AtEndOfStream ' 一行(改行コードまで)を読み込む Debug.Print .ReadLine ' 行番号を返す Debug.Print .Line Loop ' フィルを閉じる .Close End With ' TextStreamオブジェクトを破棄 Set oText = Nothing End Sub
CreateTextFileメソッドは空のファイルを作成しますので、それを読み込もうとして、ReadLineメソッドでは何も取得できません
②-1のようにAtEndOfStreamプロパティを参照した時点で「ファイルモードが不正です」とエラーになりますので、CreateTextFileメソッドは書き込み専用のモードであることがわかります
そのため、当然、ReadLineメソッドをも同じ「ファイルモードが不正です」のエラーになります
②-2:呼び出し元関数の(エラーにならない)書き込みの参照設定でのサンプル
Sub CallCreateTextFile_Sample2() Dim oText As TextStream Dim filename As String ' CreateTextFileファイルパス filename = "E:\VBA\Sample001\Sample.txt" ' 作成した関数を呼び出す Call CreateTextFile_Sample(filename, oText) With oText ' 一行(改行コードまで)を書き込む Call .WriteLine("AAA") ' 空行を書き込む Call .WriteBlankLines(1) ' 行番号を返す Debug.Print .Line ' フィルを閉じる .Close End With ' TextStreamオブジェクトを破棄 Set oText = Nothing End Sub
②-2はCreateTextFileメソッドで作成したTextStreamオブジェクトに対して、書き込みを行うサンプルです
- WriteLineメソッドで改行コードを付加して「AAA」を書き込む
- WriteBlankLinesメソッドで指定した行数の空行を書き込む
- Lineプロパティを参照して行番号を取得
- Closeメソッドでファイルを閉じる
この処理で、ファイルは以下の内容になります
Lineプロパティの結果は以下のように[EOF]の行番号である「3」が返ります
②-3:呼び出し元関数の(エラーにならない)書き込みの実行時バインディングの関数を呼び出すサンプル
Sub CallCreateTextFile_Sample2() Dim oText As Object Dim filename As String ' CreateTextFileファイルパス filename = "E:\VBA\Sample001\Sample.txt" ' 作成した関数を呼び出す Call CreateTextFile_Sample2(filename, oText) With oText ' 一行(改行コードまで)を書き込む Call .WriteLine("AAA") ' 空行を書き込む Call .WriteBlankLines(1) ' 行番号を返す Debug.Print .Line ' フィルを閉じる .Close End With ' TextStreamオブジェクトを破棄 Set oText = Nothing End Sub
②-2と②-3での違いは以下の2点だけですね
- 呼び出す関数名が違っている
- TextStreamオブジェクトの宣言
呼び出す関数名の違いは、都合上なので、実質は「TextStreamオブジェクトの宣言」のみです
③:簡略化したCreateTextFileのサンプル
Sub CreateTextFile_Sample2(ByVal filename As String, ByRef oText As TextStream) ' オブジェクトを作成 With New FileSystemObject ' TextStreamオブジェクトを返す Set oText = .CreateTextFile(filename) End With End Sub
・説明
サンプルが多かったので、説明は各サンプルの後ろに付けましたので、ここでは特に書くことがなくなってしまいました
③はいつものサンプルです
実行時バインディングを使用したサンプルは簡略化という点では向いていないので省いていますw
・注意点
- 既存ファイルは上書き指定できる
- 読み取り専用ファイルを上書き指定するとエラーになる
- 上書き指定すると新規ファイルとなり、既存テキストは削除される
- 取得したTextStreamオブジェクトは書き込みしかできない
- 存在しないファイルを指定すれば新規ファイルを作成します
- 存在しない親階層を指定するとエラーになります
- 作成したファイルはTextStreamオブジェクトのCloseメソッドで閉じます
- 作成するファイルのファイル形式(エンコーディング)によって改行コードは異なる
・その他
同じTextStreamオブジェクトを返すOpenTextFileメソッドと比較してみる
メソッド | 対象ファイル | 入出力 | ファイル形式 |
CreateTextFile | 新規ファイル
既存は「上書きする」がデフォルト |
書き込み専用
(変更不可) |
True/Falseで指定 |
OpenTextFile | 既存ファイル
新規は「作成しない」がデフォルト |
読み取り専用
(変更可能) |
Tristate列挙型で指定 |
とまぁ、意外と色々違うんですね!
もう少し、FileSystemObjectのメソッドを色々と調べておきたいのだけど、サンプルで色々試したので、次こそはTextStreamオブジェクトについても詳しく記載しないとね!w
ではでは