2014年1月10日金曜日

ExcelVBA UTF-8でファイルを保存する

ExcelVBAはExcelなので、普通にファイルを保存するとShift-JISで保存する。
文字コードをUTF-8で保存したい。のでやる。

BOM付きでファイルを保存する


参考サイト
[Excel]Excel VBAでUTF-8のテキストファイルを扱う(ADODB.Stream)

ADODB.Streamとやらを使えばよござんす、ということで。

/*---------------------------------------------------------------------------*/
    Sub saveFile(filename, data)
' ADODB.Streamのモード
        Dim adTypeBinary : adTypeBinary = 1
        Dim adTypeText : adTypeText = 2
        Dim adSaveCreateOverWrite : adSaveCreateOverWrite = 2

        ' ADODB.Streamを作成
        Dim adodb : Set adodb = CreateObject("ADODB.Stream")
       
        ' データを書き込む
        With adodb
            .Type = adTypeText
            .Charset = "UTF-8"
            .Open
            .WriteText data
            .SaveToFile filename, adSaveCreateOverWrite
            .Close
        End With
    End Sub
/*---------------------------------------------------------------------------*/

渡されたデータをUTF-8で保存するためのプロシージャを作成。
ADODB.Streamにデータを書き込み保存している。

BOMなしでファイルを保存する


環境によってはBOMがあるとエラーを起こすので、BOMなしでの保存もやってみる。

参考サイト

/*---------------------------------------------------------------------------*/
    ' BOMデータのバイトサイズ
    Dim bomSize As Integer: bomSize = 3

    ' データを書き込む
    With temp
        .Type = adTypeText
        .Charset = "UTF-8"
        .Open
        .WriteText data
    End With

    ' BOMを飛ばす
    With temp
        .Position = 0
        .Type = adTypeBinary
        .Position = bomSize
    End With
    
    ' 出力用のストリームを使って出力
    With output
        .Type = adTypeBinary
        .Open
        .Write temp.Read()
        .SaveToFile filename, adSaveCreateOverWrite
        .Close
    End With
    
    ' ストリームを閉じる
    temp.Close
/*---------------------------------------------------------------------------*/

すでにストリームが作成されている前提のサンプル。
データを書き込んだストリームのデータ位置をBOMを飛ばした位置に設定。
出力用のストリームに書き込み保存している。
出力用のストリームのCharsetプロパティを弄ると
「このコンテキストで操作は許可されていません」
というエラーが出たのでしないように。ここで割りと悩んだ。



0 件のコメント:

コメントを投稿