エクセルのマクロで、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対応
- 作者: 田中亨
- 出版社/メーカー: 翔泳社
- 発売日: 2010/11/16
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 47回
- この商品を含むブログ (10件) を見る