Excelマクロ(VBA)でファイルを出力する方法。
ごく普通の(昔ながらのBASICでの)ファイル出力方法。
MSX-BASIC時代から存在するOPEN〜PRINT#を使う。
WindowsのExcel2003の文字コードはシフトJIS(たぶんMS932)なので、出力したファイルはSJISとなる。
Dim fno As Integer fno = FreeFile Open "c:\temp\excel_vba_sjis.txt" For Output As #fno 'データ出力 Print #fno, "データ1"; ","; "データ2" Print #fno, "データ2"; ","; "データ3" Close #fno
ちなみにPRINT#では、データをカンマ区切り「,
」で並べると空白入り(本来は位置調整用)で出力され、セミコロン区切り「;
」で並べると隙間無く出力される。MSX-BASICの知識がそのまんま使える^^;
OPEN〜PRINT#ではエンコード(文字コード・キャラクターセット)を指定できないので、UTF-8で出力できない。
ADODB.Streamというオブジェクトを使えばエンコードを指定できる。
ADODB.Streamを使う為の事前準備として、参照設定で「Microsoft ActiveX Data Objects」を有効にしておく。
ADODB.Streamを使ってUTF-8の出力は出来たが、BOMが付いてしまった。これは(マイクロソフトが大好きな)UTF-8のファイルの先頭に付けられる値だが、邪魔なので削りたい。
BOMは3バイトらしいので、その分だけスキップしてファイルに出力してやればよい。
Dim writer As New ADODB.Stream With writer .Type = adTypeText .Charset = "UTF-8" ' .LineSeparator = adLF '今回は関係ないが、改行コードをLFにしたい場合はこうやって指定できる .Open End With 'データ出力 writer.WriteText "データ1" & "," & "データ2", adWriteLine writer.WriteText "データ3" & "," & "データ4", adWriteLine 'BOMを削ってファイル出力 With writer .Position = 0 'ファイルの先頭に戻り .Type = adTypeBinary 'バイナリに変更して .Position = 3 'BOMの分をスキップ Dim w As New ADODB.Stream w.Type = adTypeBinary w.Open .CopyTo w .Close w.SaveToFile "c:\temp\excel_vba_utf8.txt", adSaveCreateOverWrite w.Close End With
ちなみに、参考にしたページではADODB.Streamのオブジェクトを
Dim writer As Object Set writer = CreateObject("ADODB.Stream")
という様にして作っているが、参照設定をしていれば、Dimの型に直接ADODB.Streamを指定できる(補完も効くようになる)し、CreateObject関数を使わずNewでオブジェクトを生成できる。
Dim writer As ADODB.Stream Set writer = New ADODB.Stream
で、さらにDimで直接Newできる。
Dim writer As New ADODB.Stream