気ままに

プログラム関連で困ったことを調べて気ままに投稿

エクセルのマクロで、UTF-8のファイルを出力する

すでに色々な人がファイルを出力した時の文字コードUTF-8にするエクセルのマクロを書いていると思うが、
元からあったマクロで、エクセルの内容からPHPのプログラムに書き出した時、文字コードSJISだったので、
UTF-8に対応してみた。


文字コードを指定して、出力すればいいだけの単純なマクロだと思ったが、UTF-8のBOMをとるのにバイナリーモードでOpenしてBOM部分を切り取るなと、ちょっとした小技が必要。
ADODBのLineSeparator を使うとなぜかエラーが出てしまう。
今回は、エラーの原因を調べる時間がないので、覚えていたら原因についても調べてみる。



以下、ファイルに書き出す時のマクロ。エクセルファイルの拡張子をtxtにして出力します。

Sub output_file_utf8()

    Dim fs
    Set fs = CreateObject("Scripting.FileSystemObject")
    
    'シート名でファイルを作成
    Filename = fs.GetParentFolderName(ActiveWorkbook.FullName) & "\" & fs.GetBaseName(ActiveWorkbook.FullName) & ".txt"
    
    ' ADODB.Streamのモード
    Dim adTypeBinary: adTypeBinary = 1
    Dim adTypeText: adTypeText = 2
    Dim adSaveCreateOverWrite: adSaveCreateOverWrite = 2
    
    ' ADODB.Streamを作成
    Dim pre: Set pre = CreateObject("ADODB.Stream")
    ' 最初はテキストモードでUTF-8で書き込む
    pre.Type = adTypeText
    pre.Charset = "UTF-8"
    ' 3001エラーがでるので、コメントアウト
    'pre.LineSeparator = adCRLF
    pre.Open
    
    ' ファイルに書き込み
    pre.writetext ("----UTF-8として作成----"), 1
    
    
    ' バイナリモードにするためにPositionを一度0に戻す
    ' Readするためにはバイナリタイプでないといけない
    pre.Position = 0
    pre.Type = adTypeBinary
    ' Positionを3にしてから読み込むことで最初の3バイトをスキップする
    ' UTF-8(BOMあり)のBOMをスキップします
    pre.Position = 3
    Dim bin: bin = pre.Read()
    pre.Close
      
    ' 読み込んだバイナリデータをバイナリデータとしてファイルに出力する
    Dim stm: Set stm = CreateObject("ADODB.Stream")
    stm.Type = adTypeBinary
    stm.Open
    stm.Write (bin)
    stm.SaveToFile Filename, adSaveCreateOverWrite ' force overwrite
    stm.Close
    MsgBox ("Complete")
    
End Sub


頻繁に使うことはないけど、毎回調べているのは大変なので、メモメモ

Excel VBA 逆引き辞典パーフェクト 2010/2007/2003対応

Excel VBA 逆引き辞典パーフェクト 2010/2007/2003対応