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メソッドを使って既存ファイルの内容を上書きします。上書きのため、元の内容は削除されます。

サンプルコード2:追記で書き込み

以下のコードは一般的なテキストファイルの最終行に追記するサンプルです。

追記で書き込む場合はサンプルのようにOpenTextFileメソッドのIOMode引数にForAppendingを指定する必要があります。

テキストファイルを開いて、Writeメソッドを使って既存ファイルの内容に続いて書き込みます。元の内容は削除されません。