まえがき
ActiveX Data Objects(ADODB)がないOffice for Macで、VBAでUTF-16(リトルエンディアン)なテキストファイルを出力する方法です。
やりかた
StringをByte配列に代入し、Open 〜 For Binaryでファイルをオープンし、PutでByte配列を出力します。
Sub Sample()
Const fname As String = "ファイル名"
Dim str As String
Dim u16str() As Byte
str = "出力したい文字列"
' ファイルがすでに存在する場合は削除
' これを忘れると既存ファイルの一部が出力ファイル末尾に残ったりする
If Dir(fname) <> "" Then
Kill fname
End If
Open fname For Binary Access Write As #1
' BOMを書き込む(バイトオーダーを逆にしておく)
Put #1, 1, &HFEFF
Put #1, , u16str
Close #1
End Sub
注記
- VBAの
Open 〜 For Binary Access Write
はファイルサイズをリセットしないので、既存ファイルを上書きする場合はオープン前にファイルを削除する必要があります。1 - 上記コードで
Put
しているBOMは&HFEFFになっていますが、内部でバイトが前後するため実際にはファイルに&HFF, &HFEの順で書き込まれます。
参考
VBAでサロゲートペア対応Len
[VBAで絵文字💖]
(https://qiita.com/masaoki/items/3488320842a9c3f9fc4e)
言い訳
当初の版では非常にまわりくどい方法を紹介していました。
これは当初「出力ファイルにゴミデータがつく」事象を、StringをByte配列に直接代入したのが原因と判断した故に採った方法でした。
しかし、実際の原因は前述の「VBAのOpen 〜 For Binary Access Write
はファイルサイズをリセットしない」を失念していたことで、「ゴミデータ」の正体は既存ファイルの上書きされなかった部分でした。
原因が判明したことによりこの記事の存在意義も薄れましたが、有益なご指摘をいただいたこともあり、経緯の記録としてこの記事を残すこととしました。
-
この記事の初版で紹介した方法が非常にまわりくどくなったのは、まさにこれを忘れてしまったためでした‥‥‥ ↩