make is.dev make it simple. development.
2024年9月20日

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
VBA

ADODB.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
VBA

BOMなしの場合、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
VB

BOMなしのファイルを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