S-JIS[2011-05-24] 変更履歴

Excelマクロでファイル出力

Excelマクロ(VBA)でファイルを出力する方法。


Shift_JISでファイル出力

ごく普通の(昔ながらの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の知識がそのまんま使える^^;


UTF-8でファイル出力

OPEN〜PRINT#ではエンコード(文字コード・キャラクターセット)を指定できないので、UTF-8で出力できない。
ADODB.Streamというオブジェクトを使えばエンコードを指定できる。


ADODB.Streamを使う為の事前準備として、参照設定で「Microsoft ActiveX Data Objects」を有効にしておく

  1. Visual Basicのエディターのメニューバーの「ツール(T)」→「参照設定(R)」で参照設定ダイアログを開く。
  2. 「Microsoft ActiveX Data Objects N.M Library」というのがいくつかあるので、どれかにチェックを付けてOKボタンを押す。
    自分は「Microsoft ActiveX Data Objects 2.8 Library」を使った。

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

Excelへ戻る / 技術メモへ戻る
メールの送信先:ひしだま