VBAでファイルの文字コードを判別!ADODB.StreamでBOMを読み取る方法

目次

はじめに

VBAで外部のテキストファイルを読み込む際、意図せず文字化けしてしまった経験はありませんか?その原因の一つに、ファイルの**BOM(バイトオーダーマーク)**が関係していることがあります。BOMは、UTF-8などの文字コードで保存されたファイルの先頭に付加される、目に見えない識別情報です。

VBAの ADODB.Stream オブジェクトを使えば、ファイルをバイナリデータとして直接読み込み、このBOMが存在するかどうかをプログラムで判定できます。これにより、文字化け対策など、より高度なファイル操作が可能になります。

この記事では、ADODB.Stream を使ってファイルの先頭バイトを読み込み、それが UTF-8 のBOMであるかを確認する方法を解説します。

【事前準備】 このコードを使用するには、VBEのメニュー「ツール」→「参照設定」から、「Microsoft ActiveX Data Objects x.x Library」(バージョンは6.1などが一般的)にチェックを入れる必要があります。


ファイルのBOMを判定するVBAサンプルコード

このマクロは、ユーザーにファイルを選択させ、そのファイルの先頭3バイトを読み込みます。そして、読み取ったバイトデータがUTF-8のBOM(16進数で EF BB BF)と一致するかどうかを判定し、結果をメッセージボックスに表示します。

完成コード

' ファイルを選択させ、そのヘッダがUTF-8 BOMか判定する
Sub CheckForUtf8Bom()
    Dim fileStream As ADODB.Stream
    Dim targetFilePath As String
    Dim byteData() As Byte
    Dim hexCode As String
    
    '--- 1. ファイル選択ダイアログを表示 ---
    targetFilePath = Application.GetOpenFilename("すべてのファイル,*.*")
    If targetFilePath = "False" Then Exit Sub ' キャンセル時は終了
    
    '--- 2. ADODB.Streamでファイルをバイナリとして開く ---
    Set fileStream = New ADODB.Stream
    With fileStream
        .Type = adTypeBinary ' バイナリモード(Type=1)
        .Open
        .LoadFromFile targetFilePath
        
        '--- 3. 先頭から3バイトを読み込む ---
        byteData = .Read(3)
        
        .Close
    End With
    Set fileStream = Nothing
    
    '--- 4. バイトデータを16進数文字列に変換 ---
    hexCode = Hex(byteData(0)) & " " & Hex(byteData(1)) & " " & Hex(byteData(2))
                   
    '--- 5. UTF-8 BOM ("EF BB BF")と一致するか判定 ---
    If hexCode = "EF BB BF" Then
        MsgBox "このファイルにはUTF-8 BOMが付加されています。", vbInformation, "BOM判定結果"
    Else
        MsgBox "このファイルにUTF-8 BOMは見つかりませんでした。" & vbCrLf & _
               "先頭3バイト: " & hexCode, vbExclamation, "BOM判定結果"
    End If
End Sub

コードの解説

ADODB.Stream オブジェクト

ADODB.Stream は、ファイルやメモリ上のデータをストリーム(連続したデータの流れ)として扱うための高機能なオブジェクトです。

  • .Type = adTypeBinary: ストリームの種類をバイナリ形式(1)に設定します。これにより、ファイルを1バイトずつ正確に読み込むことができます。
  • .LoadFromFile targetFilePath: 指定したパスのファイルの内容をストリームに読み込みます。
  • .Read(3): ストリームの現在位置から、指定したバイト数(この場合は 3)を読み込み、バイト型の配列として返します。

BOMの判定

  • hexCode = Hex(...) & " " & ...: .Read で取得したバイト配列の各要素を、Hex関数で16進数の文字列に変換し、スペースで連結しています。
  • If hexCode = "EF BB BF" Then: UTF-8 のBOMは、16進数で EF BB BF という3バイトの並びで定義されています。変換した文字列がこれと一致するかどうかを比較し、処理を分岐させています。

まとめ

今回は、ADODB.Stream を使ってファイルのヘッダ情報をバイト単位で読み込み、UTF-8 のBOMを判定する方法を解説しました。

  • ADODB.Stream を使うと、ファイルをバイナリデータとして扱える。
  • .Type = adTypeBinary でバイナリモードに設定する。
  • .Read(バイト数) で、ファイルの先頭から指定したバイト数を読み込める。

このテクニックは、テキストファイルの文字コードを判別するだけでなく、画像ファイルの形式をシグネチャで判定したり、独自のバイナリファイルを解析したりと、より高度なファイル操作に応用することが可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次