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■実行結果

●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■実行結果



