【ExcelVBA】UTF-8形式のCSVファイルがBOM付きか特定する方法とは

この記事では、UTF-8形式のCSVファイルがBOM付きか特定する方法についてご説明します。

【動画】UTF-8形式のCSVファイルがBOM付きか特定する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


CSVファイルの1バイト目が「EF」、2バイト目が「BB」、3バイト目が「BF」か確認することでUTF-8形式のCSVファイルがBOM付きかを特定しています。

マクロ作成の流れ

STEP.1
ファイルをバイナリモードで開く
ファイルをバイナリモードで開きます。
STEP.2
CSVファイルのデータの先頭から3バイトを取得する
CSVファイルのデータの先頭から3バイトを取得します。
STEP.3
STEP.2で取得した3バイトを判定する
STEP.2で取得した3バイトを判定します。
1バイト目が「EF」、2バイト目が「BB」、3バイト目が「BF」である場合、BOM付きであることが分かります。

コードの例

Option Explicit

Sub test()

    Dim chkFile     As String       'BOMの有無を確認するファイル
    Dim fileNum     As Integer      'ファイル番号用変数
    Dim dataAry()   As Byte         'ファイルからデータを格納するための配列
    
    'BOMの有無を確認するファイル名を取得する
    chkFile = Worksheets("top").Range("chkFile").Value
    
    'ファイル番号を取得する
    fileNum = FreeFile()
    
    'ファイルをバイナリモードで開く
    Open chkFile For Binary Access Read As #fileNum
    
    '3バイト分で配列を再定義する(BOMの有無を特定するのに、1バイト目から3バイト目までのデータを確認するため)
    ReDim dataAry(1 To 3)
    
    '指定されたファイルハンドルで開かれたファイルから、先頭からバイト配列byteAryにデータを読み込ませる
    Get #fileNum, , dataAry
    
    If dataAry(1) = &HEF And _
       dataAry(2) = &HBB And _
       dataAry(3) = &HBF Then
       
       '①1バイト目がEFの場合
       '②2バイト目がBBの場合
       '③3バイト目がBFの場合
       '以上の3つの条件を全て合致する場合
        
        'BOM付きであることを知らせる旨のメッセージを出力する
        Worksheets("top").Range("BOMCheck").Value = "BOM付き"
        
    Else
    
        '3つの条件に合致していない場合
        
        'BOM無しであることを知らせる旨のメッセージを出力する
        Worksheets("top").Range("BOMCheck").Value = "BOM無し"
        
    End If
    
    ' ファイルを閉じる
    Close #fileNum
    
End Sub

注目すべきコード①

最初に見て頂きたいのは16行目です。

    'ファイルをバイナリモードで開く
    Open chkFile For Binary Access Read As #fileNum

コードの説明

BOM付きか確認したいファイルをバイナリモードで開く処理のコードです。

BOM付きかどうかを確認するのにバイナリモードで開く必要があるため、Openメソッドを使ってファイルを開く際バイナリモードを指定します。

注目すべきコード②

次に見て頂きたいのは19行目から22行目です。

    '3バイト分で配列を再定義する(BOMの有無を特定するのに、1バイト目から3バイト目までのデータを確認するため)
    ReDim dataAry(1 To 3)
    
    '指定されたファイルハンドルで開かれたファイルから、先頭からバイト配列byteAryにデータを読み込ませる
    Get #fileNum, , dataAry

コードの説明

以上のコードは、CSVデータの先頭から3バイトを取得して配列dataAryに格納する処理のコードです。

コードの詳細

19行目では、CSVデータの先頭から3バイトを取得して格納するための配列dataAryの要素を再定義しています。

22行目では、CSVデータの先頭から3バイトを取得して配列dataAryに格納しています。

注目すべきコード③

次に見て頂きたいのは24行目から43行目です。

    If dataAry(1) = &HEF And _
       dataAry(2) = &HBB And _
       dataAry(3) = &HBF Then
       
       '①1バイト目がEFの場合
       '②2バイト目がBBの場合
       '③3バイト目がBFの場合
       '以上の3つの条件を全て合致する場合
        
        'BOM付きであることを知らせる旨のメッセージを出力する
        Worksheets("top").Range("BOMCheck").Value = "BOM付き"
        
    Else
    
        '3つの条件に合致していない場合
        
        'BOM無しであることを知らせる旨のメッセージを出力する
        Worksheets("top").Range("BOMCheck").Value = "BOM無し"
        
    End If

コードの説明

以上のコードは、CSVファイルのデータから取得した3バイトを確認してBOMかどうかを特定する処理のコードです。

コードの詳細

24行目から26行目のコードは、1バイト目が「EF」、2バイト目が「BB」、3バイト目が「BF」かどうかを判定しているIF文です。

この1バイト目から3バイト目の判定条件に合致していればBOM付きなので34行目でBOM付きであることを知らせる旨のメッセージを出力しています。

もし1バイト目から3バイト目の判定条件に合致していなければBOM付きではないので、41行目でBOM無しであることを知らせる旨のメッセージを出力しています。

動作確認

今回は次のExcelファイルを用意しました。

A2の黄色のセルにはBOM付きか特定したいUTF-8形式のCSVファイル名をフルパスで入力します。

A5の黄色のセルには、BOM付きか特定した結果を出力します。

BOM付きなら「BOM付き」、BOMなしなら「BOMなし」と出力されます。

また、BOM付きか特定したいUTF-8形式のCSVファイルを以下の5つ用意しました。

  1. file1.csv:BOM付き
  2. file2.csv:BOMなし
  3. file3.csv:BOM付き
  4. file4.csv:BOM付き
  5. file5.csv:BOMなし
file1.csv:BOM付き

file2.csv:BOMなし

file3.csv:BOM付き

file4.csv:BOM付き

file5.csv:BOMなし

マクロ実行後

file1.csv:BOM付き

「BOM付き」と出力されました。

file2.csv:BOMなし

「BOMなし」と出力されました。

file3.csv:BOM付き

「BOM付き」と出力されました。

file4.csv:BOM付き

「BOM付き」と出力されました。

file5.csv:BOMなし

最後に

この記事では、UTF-8形式のCSVファイルがBOM付きか特定する方法についてご説明しました。

UTF-8形式のCSVファイルがBOM付きなのか確認したい時は本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら