はじめに
VBAでテキストファイルを受け渡すとき、元ファイルがShift_JIS、出力先がUTF-8というように文字コードが異なることがあります。この場合は、元の文字コードでテキストを読み取り、変換先の文字コードで書き直す必要があります。
ADODB.StreamではCharsetを指定してテキストを読み書きできます。この記事では、Shift_JISからUTF-8への変換を例に、ReadTextとWriteTextを使った基本手順を解説します。
この記事で分かること
ADODB.Streamで文字コードを変換する仕組み- text Streamとbinary Streamの違い
- Shift_JISをUTF-8へ変換するVBAコード
- 文字化けを防ぐための確認ポイント
ADODB.Streamで文字コードを変換する仕組み
文字コード変換は、変換元の文字コードでテキストを読み、変換先の文字コードで書く処理です。Shift_JISからUTF-8なら、次の流れになります。
- Shift_JISを指定したtext Streamで元ファイルを読み込む
ReadTextでVBA文字列として取得する- UTF-8を指定した別のtext Streamへ
WriteTextする SaveToFileで保存する
text Streamとbinary Streamの違い
| Streamの種類 | Type | 読み取り | 書き込み | Charset |
|---|---|---|---|---|
| text Stream | adTypeText(2) | ReadText | WriteText | 使用する |
| binary Stream | adTypeBinary(1) | Read | Write | 使用しない |
ReadとWriteはバイト列を扱うメソッドです。文字コードを指定してテキストを変換するときは、text StreamでReadTextとWriteTextを使います。
Charsetはtext Streamで使用する
Charsetは、text Streamへ入るデータや、text Streamから出るデータをどの文字コードとして扱うか指定するプロパティです。
元ファイルにはShift_JIS、書き出し側にはUTF-8を指定します。Charsetはbinary Streamでは使用されないため、バイト列のコピーと文字コード変換は分けて考えます。
Shift_JISをUTF-8へ変換する手順
Shift_JISとして読み込む
変換元用のStreamをadTypeTextで作り、CharsetへShift_JISを指定してLoadFromFileで読み込みます。LoadFromFile後のPositionは0になります。
ReadTextで文字列として取得する
読み込んだ内容をReadTextでVBA文字列へ取り出します。ここで元ファイルをShift_JISとして解釈した結果を、文字列として受け取ります。
UTF-8としてWriteTextして保存する
変換先用の別StreamをadTypeTextで作り、CharsetへUTF-8を指定します。取得した文字列をWriteTextし、SaveToFileで保存します。
このように、文字コード変換を「元の文字コードで読む処理」と「変換先の文字コードで書く処理」に分けると、変換内容を確認しやすくなります。
VBAコード例
次のコードは、Shift_JISのテキストファイルをUTF-8へ変換する基本例です。ADODB.Streamは遅延バインディングで生成するため、参照設定の追加は不要です。
Sub ConvertShiftJIStoUTF8()
Const adTypeText As Long = 2
Const adReadAll As Long = -1
Const adSaveCreateOverwrite As Long = 2
Dim sourceStream As Object
Dim targetStream As Object
Dim textData As String
Set sourceStream = CreateObject("ADODB.Stream")
With sourceStream
.Open
.Type = adTypeText
.Charset = "Shift_JIS"
.LoadFromFile "C:\path\to\input_shiftjis.txt"
.Position = 0
textData = .ReadText(adReadAll)
.Close
End With
Set targetStream = CreateObject("ADODB.Stream")
With targetStream
.Open
.Type = adTypeText
.Charset = "UTF-8"
.WriteText textData
.SaveToFile "C:\path\to\output_utf8.txt", adSaveCreateOverwrite
.Close
End With
Set sourceStream = Nothing
Set targetStream = Nothing
End Sub
ファイルパスは実際の環境に合わせて変更してください。コードでは、Shift_JISとしてReadTextした文字列を、UTF-8のStreamへWriteTextしています。
ReadとWriteのバイナリ処理だけでは文字コード変換にならない
ReadとWriteはbinary Streamでバイト列を読み書きします。バイト列をそのまま扱う処理には適していますが、文字コード変換では「どの文字コードとして読むか」「どの文字コードとして書くか」を明示する必要があります。
そのため、本記事ではReadTextとWriteTextを使うtext Stream同士の変換を基本形とします。
CSV、XML、JSON、Excelなど出力形式そのものを変える方法は、VBAでCSV、XML、JSON、Excelにデータ変換で解説しています。
文字コード変換時の注意点
変換元のCharsetを正しく指定する
元ファイルと異なるCharsetを指定すると、読み取り時点で文字化けする可能性があります。変換先だけでなく、元ファイルの文字コードを確認してから処理してください。
SaveToFileの上書き指定を確認する
コード例のadSaveCreateOverwriteは、既存の同名ファイルを上書きする指定です。元ファイルを残す必要がある場合は、保存先を分けます。
SaveToFileは現在のStream内容をファイルへ保存するメソッドです。保存時に文字コードを決めるのではなく、保存前にどのCharsetのtext Streamへ文字列を書いたかが重要です。
BOMや改行コードは出力先仕様を確認する
受け側のシステムによって、BOMや改行コードの条件が異なることがあります。BOMなしが必須などの条件がある場合、本記事の基本コードだけで要件を満たすとは限りません。本記事では文字コード変換を中心とし、BOM除去や改行コード変換の実装までは扱いません。
VBA自体の基本から確認したい場合は、Excel VBAとは?マクロとの関係とできることをわかりやすく解説も参考にしてください。
まとめ
VBAのADODB.Streamで文字コードを変換するときは、変換元の文字コードでテキストを読み、変換先の文字コードで書き直します。
Shift_JISからUTF-8なら、Shift_JISのtext StreamでReadTextし、取得した文字列をUTF-8のtext StreamへWriteTextしてSaveToFileします。
Charsetはtext Streamで使用し、text StreamではReadTextとWriteTextを使います。この流れを分けて考えると、文字化けが読み込み側と書き込み側のどちらで起きたかも確認しやすくなります。