UTF-8形式のテキストファイルの書き込み

UTF-8形式のテキストファイルを書き込む

VBAをUTF-8形式で作成されたテキストを書き込むには、ADOのStreamオブジェクト(ADODB.Stream)を利用することで書き込むことができます。

UTF-8のテキストデータにはBOM付きとBOMなしの2種類があります。
BOMとはテキストデータを読み込む時に、このデータを元にUnicodeで符号化されていること、および符号化の種類の判別に使用するためのデータのことです。

Streamオブジェクトで作成すると先頭3バイトにBOMが付与されたテキストが作成されます。

下記のサンプルコードではBOM付きとBOMなしでUTF-8のテキストファイルを作成しています。
BOMなしで作成するには一度Streamオブジェクトで作成したデータの先頭3バイトのBOMにあたる部分を除去する処理を追加することで BOMなしのUTF-8が作成できます。

動作確認
Windows10/Excel2016:○
Windows11/Excel2024:○

 ●BOM付きで書き込み

'******************************************************************
' テキストファイルの書き込み
'******************************************************************
Sub WriteTextFileWithBOM()
    
    Dim sFilePath As String
    sFilePath = "C:\VBA\UTF8\テキスト_UTF8_BOM付き.txt"
    
    Call WriteTextFile_UTF8(sFilePath)

End Sub

'******************************************************************
' UTF-8形式でテキストデータを書き込む(BOM付き、改行コード:LF)
'------------------------------------------------------------------
'  第1引数:テキストファイルのパス
'******************************************************************
Sub WriteTextFile_UTF8(getFilePath As String)
    
    'ADODB.Streamオブジェクトの作成
    Dim oADO As Object
    Set oADO = CreateObject("ADODB.Stream")
    
    oADO.Charset = "UTF-8"
    oADO.Mode = 3    '1:読み取り専用 3:読み取り/書き込み両方
    oADO.Type = 2   '1:バイナリデータ 2:テキストデータ 0:不明(規定値)
    oADO.LineSeparator = 10   '改行コード  10:LF 13:CR -1:CRLF(規定値)
        
    oADO.Open
    
    '書き込み WriteTextの第2引数が"1"なら末尾に改行あり、0または無しなら改行なし
    oADO.WriteText "時代区分表"
    oADO.WriteText "(飛鳥~江戸)"
    oADO.WriteText "", 1
    oADO.WriteText "飛鳥時代      592年~", 1
    oADO.WriteText "奈良時代      710年~", 1
    oADO.WriteText "平安時代      794年~", 1
    oADO.WriteText "鎌倉時代     1185年~", 1
    oADO.WriteText "室町時代     1336年~", 1
    oADO.WriteText "安土桃山時代 1573年~", 1
    oADO.WriteText "江戸時代     1603年~", 1
    oADO.SaveToFile getFilePath, 2  '1:新規作成、上書き不可(規定値) 2:上書き
    oADO.Close

End Sub

 ■実行結果

テキストファイルの中身(UTF8 BOM付き)

 ●BOM無しで書き込み

'******************************************************************
' テキストファイルの読み込み
'******************************************************************
Sub WriteTextFileNoBOM()
    
    Dim sFilePath As String
    sFilePath = "C:\VBA\UTF8\テキスト_UTF8_BOMなし.txt"
    
    Call WriteTextFile_UTF8NoBOM(sFilePath)

End Sub

'******************************************************************
' UTF-8形式でテキストデータを書き込む(BOMなし、改行コード:LF)
'------------------------------------------------------------------
'  第1引数:テキストファイルのパス
'******************************************************************
Sub WriteTextFile_UTF8NoBOM(getFilePath As String)
    
    'ADODB.Streamオブジェクトの作成
    Dim oADO As Object
    Set oADO = CreateObject("ADODB.Stream")
    
    oADO.Charset = "UTF-8"
    oADO.Mode = 3    '1:読み取り専用 3:読み取り/書き込み両方
    oADO.Type = 2   '1:バイナリデータ 2:テキストデータ 0:不明(規定値)
    oADO.LineSeparator = 10   '改行コード  10:LF 13:CR -1:CRLF(規定値)
        
    oADO.Open
    
    '書き込み WriteTextの第2引数が"1"なら末尾に改行あり、0または無しなら改行なし
    oADO.WriteText "時代区分表"
    oADO.WriteText "(飛鳥~江戸)"
    oADO.WriteText "", 1
    oADO.WriteText "飛鳥時代      592年~", 1
    oADO.WriteText "奈良時代      710年~", 1
    oADO.WriteText "平安時代      794年~", 1
    oADO.WriteText "鎌倉時代     1185年~", 1
    oADO.WriteText "室町時代     1336年~", 1
    oADO.WriteText "安土桃山時代 1573年~", 1
    oADO.WriteText "江戸時代     1603年~", 1
    
    
    'BOMなしにする処理
    oADO.Position = 0   'ストリームの位置を0にする
    oADO.Type = 1       'バイナリデータに変更
    oADO.Position = 3   'ストリームの位置を3にする
    Dim bTemp() As Byte 'データ一時格納用
    bTemp = oADO.Read   'ストリームの内容を一時保存
    oADO.Close          'ストリームを閉じる
    oADO.Open           'ストリームを再度開く
    oADO.Write bTemp    '一時格納したデータを書き込む
    
    oADO.SaveToFile getFilePath, 2  '1:新規作成、上書き不可(規定値) 2:上書き
    oADO.Close

End Sub

 ■実行結果

テキストファイルの中身(UTF8 BOMなし)