エクセルの内容を文字コード「UTF-8」でテキストファイルに出力したいのだけど、「Open ~ Print」や「FileSystemObject.CreateTextFile」だとできないみたいだな。
前の記事で「ADODB.Stream」を使って、文字コードと改行コードを指定したテキストファイルの読み込みしたよね?
読み込みはやりましたが。。。あ、ちょっと待ってください。
「ADODB.Stream」についてマイクロソフトのサイトを見ると、「WriteTextメソッド」というものがありますね。
これって、文字コードと改行コードを指定してテキストファイルの出力もできるということですか?
そう、そういうこと。
そうなんですね、ちょっとやってみます。
それじゃ、テキストファイルの新規作成と、ついでに追記もできるようにしてみるのもよいかもね。
はじめに
テキストファイル出力の際に、文字コードや改行コードを指定したい場合があるかと思いますが、「ADODB.Stream」を使えば可能です。
よく使われる「UTF-8」はもちろん、「EUC」や「JIS」なども指定できます。
この記事では、エクセルの記載内容を文字コードと改行コードを指定して、テキストファイルに出力する方法を紹介します。
また、「追記したい」というシーンも結構ありそうなので、それもできるようにしてみます。
ちなみに、「ADODB.Stream」について、マイクロソフトのサイトはこちらを参照ください。
また、「テキストファイルの読み込み」についても興味がありましたら、こちらの記事を参考になさってください。
ソースコード
文字コードと改行コードを指定して、エクセルの記載内容をテキストファイルに出力します。
'-----------------------------------------------------------------------
'テキストファイルを出力する
'-----------------------------------------------------------------------
Sub WriteTextFile(ByVal dataRng As Range, _
ByVal filePath As String, _
ByVal fileCharSet As String, _
ByVal fileLineSeparator As Long, _
ByVal isAddMode As Boolean)
With CreateObject("ADODB.Stream") 'Streamを生成
.Charset = fileCharSet '文字コードを設定("UTF-8"、"EUC-JP"、"Shift-JIS"、"ISO-2022-JP"(JIS)など)
.LineSeparator = fileLineSeparator '改行コードを設定(-1:CRLF、10:LF)
.Open 'Streamをオープン
'追記する場合
'追記するファイルの追記位置を取得する必要があるため、ファイルの存在チェックも実施する
If isAddMode And CreateObject("Scripting.FileSystemObject").FileExists(filePath) Then
.LoadFromFile filePath '追記するファイルを読み込む
.Position = .Size '追記位置をファイルサイズ(ファイルの末尾)に移動させる
End If
Dim cell As Variant
For Each cell In dataRng
.WriteText cell.Value, 1 'Streamに1行書き込む(0 or 指定なし:末尾に改行コードを付けない、1:末尾に改行コードを付ける)
Next cell
.SaveToFile filePath, 2 'Streamの内容をファイルに保存する(1:新規作成、2:上書き(ファイルが無ければ新規作成))
.Close 'Streamをクローズ
End With
End Sub
テストコード
文字コードと改行コードをいろいろ指定して、テキストファイルを出力してみます。
Sub Test()
Dim targetRng As Range
Set targetRng = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
'UTF-8、LF、追記あり
Call WriteTextFile(targetRng, "C:\00_myenv\10_macro\05_tmp\utf8.txt", "UTF-8", 10, True)
'Shift-JIS、LF、追記あり
Call WriteTextFile(targetRng, "C:\00_myenv\10_macro\05_tmp\sjis.txt", "Shift-JIS", 10, True)
'EUC、CRLF、追記なし
Call WriteTextFile(targetRng, "C:\00_myenv\10_macro\05_tmp\euc.txt", "EUC-JP", -1, False)
'JIS、CRLF、追記なし
Call WriteTextFile(targetRng, "C:\00_myenv\10_macro\05_tmp\jis.txt", "ISO-2022-JP", -1, False)
End Sub
実行結果
エクセルの記載内容
A1~A5セルに文字を設定しておきます。
出力結果
UTF-8、LF
Shift-JIS、LF
EUC、CRLF
JIS、CRLF
テストコードでは「UTF-8」と「Shift-JIS」は「追記あり」にしているので、再実行すると以下のように追記されます。(UTF-8の画像だけ貼り付けておきます)
説明
ソースコードの説明はコメントの通りです。
追記についてですが、「ADODB.Stream」には追記モードがないので、ソースコード上でグレーにしてある部分のような実装をしています。
追記不要な場合は、この部分を削除してください。
また、ファイルが既に存在したら上書きしたくない場合は、26行目の引数を「1」にすればエラーになるので、エラーハンドリングを適宜実装することで回避できます。
まとめ
ということで、文字コードと改行コードを指定して、エクセルの内容をテキストファイルを出力する方法の紹介でした。
他の出力方法のありますが、(テキストファイル読み込みの記事でも書きましたが)文字コード、改行コードを指定できるので、この方法一択でよいのではないかと思います。
以上、ご覧いただきありがとうございました。