【エクセルVBA】テキストファイルを出力する(文字コード、改行コードを指定)(ADODB – Stream)

エクセルの内容を文字コード「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

出力結果(UTF-8、LF)

Shift-JIS、LF

出力結果(Shift-JIS、LF)

EUC、CRLF

出力結果(EUC、CRLF)

JIS、CRLF

出力結果(JIS、CRLF)

テストコードでは「UTF-8」と「Shift-JIS」は「追記あり」にしているので、再実行すると以下のように追記されます。(UTF-8の画像だけ貼り付けておきます)

出力結果(追記した場合)

説明

ソースコードの説明はコメントの通りです。

追記についてですが、「ADODB.Stream」には追記モードがないので、ソースコード上でグレーにしてある部分のような実装をしています。

追記不要な場合は、この部分を削除してください。

また、ファイルが既に存在したら上書きしたくない場合は、26行目の引数を「1」にすればエラーになるので、エラーハンドリングを適宜実装することで回避できます。

まとめ

ということで、文字コードと改行コードを指定して、エクセルの内容をテキストファイルを出力する方法の紹介でした。

他の出力方法のありますが、(テキストファイル読み込みの記事でも書きましたが)文字コード、改行コードを指定できるので、この方法一択でよいのではないかと思います。

以上、ご覧いただきありがとうございました。