【EXCEL VBA】BOM無しUTF-8でCSVファイル出力をしたい

別記事にてUTF-8でCSVファイル出力する方法を紹介しました。

今回は、BOM無しUTF-8でCSVファイル出力する方法を紹介します。別記事にて紹介したADODB.Streamを使いますが、BOM無しにするために、ひと手間加える必要があります。

そもそもBOM(ByteOrderMark)ってなに?という方はWikipediaを参照してみてください。

なんだか難しいことが書いてありますね。これは私の感想ですが、UTF-8といえばBOM無しを指します。そのためBOM無しUTF-8でCSVファイル出力しておいたほうが無難です。

ADODB.Streamで解決する

UTF-8でファイル出力するには、ADODB.Streamオブジェクトを使います。CSVファイルに限らずUTF-8でテキスト出力する際にも使うことができます。

サンプルプログラムを確認する(コピペOK)

Sub sample()
    
    '最終行列
    Dim maxRow As Long: maxRow = Range("A1").SpecialCells(xlLastCell).Row
    Dim maxCol As Long: maxCol = Range("A1").SpecialCells(xlLastCell).Column

    ' ファイルをUTF-8で開く
    Dim st As Object: Set st = New ADODB.Stream
    st.Charset = "UTF-8"
    st.Open

    Dim strLine As String
    Dim i As Long, j As Long
    For i = 1 To maxRow
        strLine = ""
        For j = 1 To maxCol - 1
            strLine = strLine & Cells(i, j) & ","
        Next j
        strLine = strLine & Cells(i, j)
        st.WriteText strLine, adWriteLine
    Next i
    
    'BOMを削除する
    st.Position = 0
    st.Type = adTypeBinary
    st.Position = 3
 
    Dim tmp() As Byte
    tmp = st.Read
    st.Close
 
    st.Open
    st.Write tmp
    
    '上書きモードでセーブ
    st.SaveToFile "d:\test.csv", adSaveCreateOverWrite
    st.Close

End Sub