はじめに
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(バイト数)
で、ファイルの先頭から指定したバイト数を読み込める。
このテクニックは、テキストファイルの文字コードを判別するだけでなく、画像ファイルの形式をシグネチャで判定したり、独自のバイナリファイルを解析したりと、より高度なファイル操作に応用することが可能です。