EXCEL VBAでテキストファイル(UTF-8)作成
EXCEL VBAでUTF-8のテキストファイルを作成する。
ADODB.Streamを使ってファイルに出力。
使用環境
・ Windows 11
・ Microsoft EXCEL 2019
BOMありの場合
Sub sample()
' Stream OPEN
Dim stream As Object
Set stream = CreateObject("ADODB.Stream")
stream.Charset = "UTF-8" ' ストリームの文字コードをUTF8に設定する
stream.Type = 2 ' ファイルのタイプ(1:バイナリ 2:テキスト)
stream.Open
' ファイル内容記載
stream.WriteText "サンプルデータ" & vbLf
' ファイルに出力する
' 第二引数 : 1.新規作成、2.上書き保存
stream.SaveToFile Environ("USERPROFILE") & "\Desktop\" & "sample.txt", 1
' Stream Close
stream.Close
End Sub
VBAADODB.Streamを使ってテキストデータを出力する。
Streamを開いて出力内容を格納し、それをファイルに出力する、というシンプルな流れ。
シンプルに終わるがこれで作成出来るのはUTF-8(BOMあり)のファイルのみ。
BOMなしの場合
UTF-8(BOMあり)を作成する場合、ひと手間加える必要がある。
Sub sample()
' Stream1 OPEN
Dim stream1 As Object
Set stream1 = CreateObject("ADODB.Stream")
stream1.Charset = "UTF-8" ' ストリームの文字コードをUTF8に設定する
stream1.Type = 2 ' ファイルのタイプ(1:バイナリ 2:テキスト)
stream1.Open
' Stream1 ファイル内容記載
stream1.WriteText "サンプルデータ" & vbLf
' Stream1 カーソルをリセットしてバイナリデータに切り替える
stream1.Position = 0
stream1.Type = 1
' Stream1 BOM分だけカーソルを進める
stream1.Position = 3
' Stream2 OPEN
Dim stream2 As Object
Set stream2 = CreateObject("ADODB.Stream")
stream2.Type = 1 ' ファイルのタイプ(1:バイナリ 2:テキスト)
stream2.Open
' Stream1 から Stream2 にデータを流し込む
' この時点でBOMがない状態で写される
stream2.Write stream1.Read
' Stream2 ファイルに出力する
' 第二引数 : 1.新規作成、2.上書き保存
stream2.SaveToFile Environ("USERPROFILE") & "\Desktop\" & "sample.txt", 1
' Stream Close
stream1.Close
stream2.Close
End Sub
VBABOMなしの場合、ADODB.Streamを2つ使う。
1つ目のStreamにデータを格納した後、BOMを除いた分だけ2つ目のStreamに流し込んで保存する。
BOMはテキストデータとして操作出来ないため、2つ目に流し込む際はバイナリデータの状態で流し込んで保存する。
BOMありのファイルをBOMなしに変換
既に存在するBOMありのファイルからBOMなしのファイルを作る場合、上記BOMありの応用で対応出来る。
Stream1をバイナリ形式で開き、BOM分だけカーソルを動かせばその後は同様。
Sub sample()
' Stream1 OPEN
Dim stream1 As Object
Set stream1 = CreateObject("ADODB.Stream")
stream1.Type = 1 ' ファイルのタイプ(1:バイナリ 2:テキスト)
stream1.Open
' Stream1 BOMありのテキストファイルを開く
stream1.LoadFromFile Environ("USERPROFILE") & "\Desktop\" & "sample1.txt"
' Stream1 BOM分だけカーソルを進める
stream1.Position = 3
' Stream2 OPEN
Dim stream2 As Object
Set stream2 = CreateObject("ADODB.Stream")
stream2.Type = 1 ' ファイルのタイプ(1:バイナリ 2:テキスト)
stream2.Open
' Stream1 から Stream2 にデータを流し込む
' この時点でBOMがない状態で写される
stream2.Write stream1.Read
' Stream2 ファイルに出力する
' 第二引数 : 1.新規作成、2.上書き保存
stream2.SaveToFile Environ("USERPROFILE") & "\Desktop\" & "sample2.txt", 1
' Stream Close
stream1.Close
stream2.Close
End Sub
VBBOMなしのファイルをBOMありに変換
上記とは逆にBOMなしのファイルからBOMありのファイルを作る場合、頭にBOMをつけてやれば良い。
Sub sample()
' Stream1 OPEN
Dim stream1 As Object
Set stream1 = CreateObject("ADODB.Stream")
stream1.Type = 1 ' ファイルのタイプ(1:バイナリ 2:テキスト)
stream1.Open
' Stream1 BOMなしのテキストファイルを開く
stream1.LoadFromFile Environ("USERPROFILE") & "\Desktop\" & "sample1.txt"
' Stream2 OPEN
Dim stream2 As Object
Set stream2 = CreateObject("ADODB.Stream")
stream2.Type = 1 ' ファイルのタイプ(1:バイナリ 2:テキスト)
stream2.Open
' Stream2 BOMを書き込む
Dim bom(2) As Byte
bom(0) = &HEF ' 0xEF
bom(1) = &HBB ' 0xBB
bom(2) = &HBF ' 0xBF
stream2.Write bom
' Stream1 から Stream2 にデータを流し込む(BOMの後に流し込まれる)
stream2.Write stream1.Read
' Stream2 ファイルに出力する
' 第二引数 : 1.新規作成、2.上書き保存
stream2.SaveToFile Environ("USERPROFILE") & "\Desktop\" & "sample2.txt", 1
' Stream Close
stream1.Close
stream2.Close
End Sub
VB