日本語以外の文字列をテキスト ファイルに保存する方法


Outlook のマクロで本文などをテキストファイルに保存する場合、このブログでは通常 Scripting.FileSytemObject を使用しています。
しかし、このオブジェクトの既定では保存できる文字コードが Shift-JIS (日本語環境の場合) に限られており、本文などに Shift-JIS 以外の文字が含まれているとエラーになってしまいます。
この問題についての回避策はいくつかあり、それぞれメリット・デメリットがありますのでまとめてみました。

方法 1: FileSystemObject で Unicode (UTF-16) により保存する

FileSystemObject の CreateTextFile や OpenTextFile では、オプションで Unicode (UTF-16) による書き込みを指定することができます。
例えば、ファイルを開く際に、

Set stmFile = objFSO.CreateTextFile("c:\temp\testfile.txt", True)

としているのであれば、以下のように変更することで Unicode での書き込みとなります。

Set stmFile = objFSO.CreateTextFile("c:\temp\testfile.txt", True, True)

また、OpenTextFile や OpenAsTextStream の場合、format パラメータで -1 (TristateTrue) を指定すると Unicode による書き込みとなります。

メリット:
  すでに FileSystemObject で処理するコードを作成している場合、コードの変更が1か所だけで済む
  Windows で扱えるすべての文字を保存することができる

デメリット:
  アプリケーションによっては Unicode で作成されたテキスト ファイルを適切に処理できない場合がある
  (例: Unicode でカンマ区切りの CSV を作成すると、Excel で開いた際にカンマが区切りとして認識されない)

方法 2: Open、Print、Close ステートメントを使用する

VBA にはファイル書き込みを行うための Open、Print、Close などのステートメントが存在します。
例えば、strText に格納された文字列を c:\temp\testfile.txt に出力する場合は、以下のようなコードになります。

Open "c:\temp\testfile.txt" For Output As #1
Print #1, strText
Close #1

このステートメントを使用すると、Shift-JIS に含まれない文字があってもエラーとはならず、書き込みが行えます。
ただし、Shift-JIS に含まれない文字は ? となります。

メリット:
  Shift-JIS しか扱えないアプリケーションでも適切に処理できるファイルが生成できる

デメリット:
  Shift-JIS 以外の文字列が ? となる
  VBScript では使えない
  マクロの処理が中断し、Close ステートメントが実行されなかった場合に、イミディエイト ウィンドウで Close を行うか、Outlook を再起動しない限り、開いていたファイルが使用できなくなる。

方法 3: ADODB.Stream で任意の文字コードにより保存する

ADODB.Stream オブジェクトを使用すると、任意の文字コードでテキスト ファイルに保存することが可能です。
例えば、UTF-8 の本文の文字コードをそのまま保存したい場合には、以下のようなコードで UTF-8 で保存することが可能です。

Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Dim adoStream 'As ADODB.Stream
'
Set adoStream = CreateObject("ADODB.Stream")
adoStream.Type = adTypeText
adoStream.Charset = "UTF-8"
adoStream.Open
adoStream.WriteText strBody
adoStream.SaveToFile "c:\temp\testfile.txt", adSaveCreateOverWrite
adoStream.Close

メリット:
  任意の文字コードでファイルが生成できる

デメリット:
  ファイルへの追記ができないため、書き込みデータの量が多い場合にメモリを大量に消費する場合がある

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中