5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Office 2016 for MacのVBAでUnicode(UTF-16)テキストファイルを出力する

Last updated at Posted at 2018-04-23

まえがき

ActiveX Data Objects(ADODB)がないOffice for Macで、VBAでUTF-16(リトルエンディアン)なテキストファイルを出力する方法です。

追記: UTF-8で出力するサブルーチンも作りました。

やりかた

StringをByte配列に代入し、Open 〜 For Binaryでファイルをオープンし、PutでByte配列を出力します。

utf16.xlsm
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はファイルサイズをリセットしない」を失念していたことで、「ゴミデータ」の正体は既存ファイルの上書きされなかった部分でした。

原因が判明したことによりこの記事の存在意義も薄れましたが、有益なご指摘をいただいたこともあり、経緯の記録としてこの記事を残すこととしました。

  1. この記事の初版で紹介した方法が非常にまわりくどくなったのは、まさにこれを忘れてしまったためでした‥‥‥

5
5
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?