PR

VBA ADODB.Streamで文字コードを変換する方法

VBA ADODB.Streamの文字コード変換 データサイエンティスト検定
スポンサーリンク

はじめに

VBAでテキストファイルを受け渡すとき、元ファイルがShift_JIS、出力先がUTF-8というように文字コードが異なることがあります。この場合は、元の文字コードでテキストを読み取り、変換先の文字コードで書き直す必要があります。

ADODB.StreamではCharsetを指定してテキストを読み書きできます。この記事では、Shift_JISからUTF-8への変換を例に、ReadTextWriteTextを使った基本手順を解説します。

この記事で分かること

  • ADODB.Streamで文字コードを変換する仕組み
  • text Streamとbinary Streamの違い
  • Shift_JISをUTF-8へ変換するVBAコード
  • 文字化けを防ぐための確認ポイント

ADODB.Streamで文字コードを変換する仕組み

文字コード変換は、変換元の文字コードでテキストを読み、変換先の文字コードで書く処理です。Shift_JISからUTF-8なら、次の流れになります。

  1. Shift_JISを指定したtext Streamで元ファイルを読み込む
  2. ReadTextでVBA文字列として取得する
  3. UTF-8を指定した別のtext StreamへWriteTextする
  4. SaveToFileで保存する

text Streamとbinary Streamの違い

Streamの種類Type読み取り書き込みCharset
text StreamadTypeText(2)ReadTextWriteText使用する
binary StreamadTypeBinary(1)ReadWrite使用しない

ReadWriteはバイト列を扱うメソッドです。文字コードを指定してテキストを変換するときは、text StreamでReadTextWriteTextを使います。

Charsetはtext Streamで使用する

Charsetは、text Streamへ入るデータや、text Streamから出るデータをどの文字コードとして扱うか指定するプロパティです。

元ファイルにはShift_JIS、書き出し側にはUTF-8を指定します。Charsetはbinary Streamでは使用されないため、バイト列のコピーと文字コード変換は分けて考えます。

Shift_JISをUTF-8へ変換する手順

Shift_JISとして読み込む

変換元用のStreamをadTypeTextで作り、CharsetShift_JISを指定してLoadFromFileで読み込みます。LoadFromFile後のPositionは0になります。

ReadTextで文字列として取得する

読み込んだ内容をReadTextでVBA文字列へ取り出します。ここで元ファイルをShift_JISとして解釈した結果を、文字列として受け取ります。

UTF-8としてWriteTextして保存する

変換先用の別StreamをadTypeTextで作り、CharsetUTF-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のバイナリ処理だけでは文字コード変換にならない

ReadWriteはbinary Streamでバイト列を読み書きします。バイト列をそのまま扱う処理には適していますが、文字コード変換では「どの文字コードとして読むか」「どの文字コードとして書くか」を明示する必要があります。

そのため、本記事ではReadTextWriteTextを使う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ではReadTextWriteTextを使います。この流れを分けて考えると、文字化けが読み込み側と書き込み側のどちらで起きたかも確認しやすくなります。

関連記事


タイトルとURLをコピーしました