TextStreamクラスのReadメソッド
TextStreamクラスのReadメソッドは、FileSystemObjectクラスのCreateTextFileメソッドやOpenTextFileメソッドで開いたファイルの内容を指定した文字数だけ読み取ります。
指定した文字数よりファイルに書かれている文字数が少ない場合は読み取れる分だけを読み取ります。その場合はエラーにはなりません。
読み込み開始位置は前回Readメソッドを実行して取得した終端の次の文字が対象になります。例えばテキストファイルに「123456789」とデータがある場合にRead(4)を実行すると、”1234″が読み込まれ、次の開始位置は”5″になります。その状態で再度Read(4)を実行すると”5678″が読み込まれ、”9″が次の開始位置になります。さらにRead(4)を実行すると”9″のみが読み込まれます。
FileSystemObjectで扱えるファイルの文字コードはASCIIかUnicodeのどちらかになるため、Readメソッドで指定する文字数もファイルを開いたときの文字コードに準拠します。
TextStreamクラスの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。
構文
Function Read(Characters As Long) As String
Characters | ファイルから読み取る文字数を指定します。バイト数ではありません。全角半角関係なく指定した文字数分だけ読み取ります。 |
戻り値 | 読み込んだ文字列を返します。 |
ファイルの文字コードとReadで指定する文字数とバイト数の関係
先にも少し書いていますが、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を指定したときもReadメソッドで指定するのは文字数ですが、実際に読み込まれるデータはファイルの文字コードのままのデータであり、文字数が同じでも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の使い方」の事前設定をご参照ください。
サンプルコード
一般的なテキストファイルを参照する処理をサンプルで書いています。
テキストファイルを開いて、Readメソッドを使って50文字ずつ読み取り、ファイルを閉じるコードです。
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 29 30 31 32 33 34 35 36 37 38 |
Sub TextStreamRead() On Error GoTo ERR_LABEL Dim fso As New FileSystemObject '// FileSystemObjectクラス Dim ts As TextStream '// TextStreamクラス Dim sFilePath '// ファイルパス Dim sRead '// ファイルデータ '// ファイルパスを設定 sFilePath = "C:\aaa.txt" '// ファイルを開く Set ts = fso.OpenTextFile(Filename:=sFilePath, IOMode:=ForReading, Create:=False, Format:=TristateFalse) Dim i i = 1 '// ファイルを全行ループ Do While ts.AtEndOfStream <> True '// ファイルから50文字取得 sRead = ts.Read(50) Debug.Print CStr(i) & " : [" & Len(sRead) & "]:[" & sRead & "]" i = i + 1 Loop '// ファイルを閉じる ts.Close ERR_LABEL: '// エラー発生時 If Err.Number <> 0 Then '// エラー内容を出力 Debug.Print Err.Number & " " & Err.Description End If End Sub |
実行結果
ファイルを50文字ずつ読み込みそれをイミディエイトウィンドウに出力します。