TextStreamクラスのWriteメソッド
TextStreamクラスのWriteメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルにデータを書き込みます。
Writeメソッドは改行コードを付与しません。そのため、Windowsの標準改行コードのCRLFではなく、LFを改行コードとしてファイルに書き込みたい場合はWriteメソッドを使ってLF(VBA定数ではvbLf)を書き込みます。その他、ASCIIコードの特殊文字(0x00から0x1F)を書き込みたい場合も同様です。なお、WriteLineメソッドは改行コードのCRLFが付与されます。
書き込み開始位置は上書きモードで開いた場合はファイルの先頭になり、追記モードで開いた場合はファイルの終端になります。
FileSystemObjectで扱えるファイルの文字コードはASCIIかUnicodeのどちらかになるため、Writeメソッドで書き込む文字列もファイルを開いたときの文字コードに準拠します。
TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。
構文
Sub Write(Text As String)
Text | ファイルに書き込む文字列を指定します。改行コードを書き込む場合は、vbCrLfなどを文字列に含める必要があります。 |
ファイルの文字コードとWriteで指定する文字数とバイト数の関係
先にも少し書いていますが、TextStreamオブジェクトを生成するFileSystemObjectクラスのOpenTextFileメソッドでは対象ファイルの文字コードをASCIIかUnicodeのどちらかであるかを指定できます。
ただ、実際に扱うファイルの文字コードが「Unicode」であることはかなり少ないでしょう。実際に使うファイルの文字コードはほとんどの場合はShift-JISかUTF-8かEUCのいずれかです。
なお、「UTF-8」とVBAで扱う「Unicode」は別物です。何が違うかというと、UTF-8の場合、半角カナは3バイトで全角文字は3から5バイトで半角英数は1バイトになります。そしてUnicodeはDBCS(Double Byte Character Set)言語換算になるため半角全角関わらず全ての文字が2バイトになります。
このことから、ファイルオープン時にASCIIを指定したときもUnicodeを指定したときもWriteメソッドで指定するのは文字数ですが、実際に読み込まれるデータはファイルの文字コードのままのデータであり、文字数が同じでもASCIIとUnicodeではバイト数が異なります。
文字数だけで判定するのであれば問題はありませんが、バイト単位で処理を行う場合にはファイルオープン時の文字コードの指定に注意が必要です。
このあたりについては「VBAのByte単位用関数の問題点」で詳しく書いていますのでご参照ください。
そして、ざっくりした言い方ですが、VBAで扱うのであればファイルはShift-JISが一番ラクです。別の文字コードなのであれば事前にShift-JISに変換してから読み込むようにした方がよいでしょう。例えばUTF-8からShift-JISに変換するのであれば「VBAでUTF-8のファイルをShift-JISに変換する」をご参照ください。
事前設定
以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。
FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。
詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。
サンプルコード1:上書きで書き込み
以下のコードは一般的なテキストファイルを上書きで書き込むサンプルです。
上書きにしたい場合は、サンプルのようにCreateTextFileメソッドのOverwrite引数をTrueにするか、OpenTextFileメソッドのIOMode引数にForWritingを設定してテキストファイルを開く必要があります。
テキストファイルを開いたあとは、Writeメソッドを使って既存ファイルの内容を上書きします。上書きのため、元の内容は削除されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'// 上書きで書き込み Sub TextStreamWriteOverwrite() On Error GoTo ERR_LABEL Dim fso As New FileSystemObject '// FileSystemObjectクラス Dim ts As TextStream '// TextStreamクラス Dim sFilePath '// ファイルパス '// ファイルパスを設定 sFilePath = "C:\overwrite.txt" '// ファイルを開く(上書き) Set ts = fso.CreateTextFile(Filename:=sFilePath, Overwrite:=True, Unicode:=False) Call ts.Write("abc") Call ts.Write(vbCrLf) '// ファイルを閉じる ts.Close ERR_LABEL: '// エラー発生時 If Err.Number <> 0 Then '// エラー内容を出力 Debug.Print Err.Number & " " & Err.Description End If End Sub |
サンプルコード2:追記で書き込み
以下のコードは一般的なテキストファイルの最終行に追記するサンプルです。
追記で書き込む場合はサンプルのようにOpenTextFileメソッドのIOMode引数にForAppendingを指定する必要があります。
テキストファイルを開いて、Writeメソッドを使って既存ファイルの内容に続いて書き込みます。元の内容は削除されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'// 追記で書き込み Sub TextStreamWriteAppend() On Error GoTo ERR_LABEL Dim fso As New FileSystemObject '// FileSystemObjectクラス Dim ts As TextStream '// TextStreamクラス Dim sFilePath '// ファイルパス '// ファイルパスを設定 sFilePath = "C:\append.txt" '// ファイルを開く(追記) Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForAppending, Create:=True, Format:=TristateFalse) Call ts.Write("abc") Call ts.Write(vbCrLf) '// ファイルを閉じる ts.Close ERR_LABEL: '// エラー発生時 If Err.Number <> 0 Then '// エラー内容を出力 Debug.Print Err.Number & " " & Err.Description End If End Sub |