UTF-8のテキストファイルを扱う

中級VBA

UTF-8のテキストファイルを扱うには

 「UTF-8」とは「文字コード」の事で近年標準になりつつあります。
 ただ、Excelでは未だに「Shift-JIS」を使用しています。
 (これは上位互換を守る習慣からだと思います。多分。)

 近年ではCSVファイルなども UTF-8 を使用しているケースが増えてきている事から、古いサンプルコードでは字化けしてしまいます。
 そこで今回は、UTF-8のテキストファイルの扱い方を見ていきましょう。

UTF-8はライブラリを読み込んで使用する

 以前、「ライブラリを読み込む2つの方法」でUTF-8を読み込む方法を簡単に紹介しました。
 具体的には、”ADODB.Stream”というライブラリを読み込むのですが、詳細についてはそちらを参照してください。
 今回は、プログラム上で読み込む方法(実行時バインディング)で紹介します。

UTF-8のテキストを1つの文字列として扱う

 まずは基本を理解するために文字列を改行も含めて1つの文字列として読込・書込みする方法を見ていきましょう。

テキストファイルを1つの文字列として読み込む

 以下のプログラムは、UTF-8のテキストファイルを読み込んで、内容を変数 buf に取り込んで A1 セルに代入しています。
 1つの文字列として取り込んでいる例です。

Sub ReadUTF8_Create_ReadALL()
    Dim filename      '①
    filename = Application.GetOpenFilename(FileFilter:="TEXTファイル(*.txt),*.txt", _
                                                Title:="テキストファイルの選択")
    If filename = False Then Exit Sub
    
    'プログラムでライブラリを読み込む方法
    Dim myADO As Object                '②
    Set myADO = CreateObject("ADODB.Stream")
    
    Dim buf As String
    With myADO     '③
        .Type = 2 'adTypeText
        .Charset = "UTF-8"
        .Open
        .LoadFromFile (filename)
        buf = .ReadText(-1) 'adReadAll
        Range("A1") = buf
        
        .Close
    End With
End Sub

 プログラムを解説します。
 まず①でファイルダイアログを出してファイルを選択します。
 ②で ADODB.Stream を読み込みます。ここでは、CreateObject()を使用しますので、受ける変数はObject型です。
 ③では、ADODB.Stream オブジェクトのプロパティやメソッドを指定します。
 注意して欲しいのは、プログラムから呼び出したオブジェクトなので定数が使えないので数値で直接指定することです。
 (コメントアウトで書かれているのが定数です。)

 With myADOで、それ以降のオブジェクト名を省略可能にしておきます。
 ドットで始まるのがプロパティやメソッドになります。
 
 Typeは、2 ( =adTypeText )でテキストファイルとして読み込む事を指示しています。
 これはデフォルト値なので省略かのうです。
 
 Charset で文字セットを “UTF-8” に指定しています。ダブルクォーテーションで囲って文字列として指定します。
 
 Openで ADODB.Stream を開きます。
 LoadFromFile で先程選択したファイルを開きます。
 
 Readメソッドで引数を -1 ( =adReadAll )としてファイルを1つの文字列として読み込んでいます。

テキストファイルに書き込む

 今度は先程書き込んだA1の文字列をファイルに書き込んでみます。
 文字列は改行も含まれていますが1つの文字列として扱っています。

Sub ReadUTF8_Create_WriteALL()
    Dim filename      '①
    filename = ThisWorkbook.Path & "\UTF8test.txt"
    
    'プログラムでライブラリを読み込む方法
    Dim myADO As Object
    Set myADO = CreateObject("ADODB.Stream")
    
    With myADO
        .Type = 2 'adTypeText
        .Charset = "UTF-8"
        .Open
        .WriteText Range("A1")    '②
        .SaveToFile filename, 2  'adSaveCreateOverWrite   '③
        .Close
    End With
End Sub

 プログラムの解説ですが、先程と同じ部分は省略します。
 ①では保存するファイル名を指定します。ファイル名はフルパスになります。
 ThisWorkbook.Path で現在のExcelファイルと同じパスを指定できます。
 最後に \ が付かないので忘れないようにしましょう。

 ②では、WriteText で書き込む文字列を指定しています。ここではセルの値を代入しています。
 ③でSaveToFile としてファイルに書き込んでいます。先程のファイル名を指定し、ファイルを上書きするオプションの 2 ( =adSaveCreateOverWrite )を指定します。

UTF-8のテキストを行単位で扱う

 今度は一行づつ読込・書込みする方法を見ていきます。
 こうする事で必要な行を抽出するなど細かい処理を行えるようになります。

テキストファイルを1行づつ読み込む

 以下のプログラムは、UTF-8のテキストファイルを1行づつ読み込んで、内容を変数 bufLine に取り込んで A列 セルに代入していきます。

Sub ReadUTF8_Create_ReadLine()
    Dim filename
    filename = Application.GetOpenFilename(FileFilter:="TEXTファイル(*.txt),*.txt", _
                                                Title:="テキストファイルの選択")
    If filename = False Then Exit Sub
    
    Dim myADO As Object
    Set myADO = CreateObject("ADODB.Stream")
    
    Dim i As Long
    Dim bufLine As String
    i = 1
    With myADO
        .Type = 2 'adTypeText
        .Charset = "UTF-8"
        .Open
        .LoadFromFile (filename)
        Do Until .EOS   ’①
            bufLine = .ReadText(-2)  'adReadLine   '②
            Cells(i, "A") = bufLine
            i = i + 1
        Loop
        .Close
    End With
End Sub

 プログラムの解説です。
 一行づつ読み込むので、繰返し処理が必要になります。
 今回は、①のように Do Until .EOS としてファイルの終端まで繰り返すようにしています。
 EOS でファイルの終端を返してくれます。

 ループの中の②で、一行づつ文字列を取り出しています。
 ReadText(-2) とする事で1行分の文字列を取り出し、次に呼ばれた時は次の行が取り出せます。
 -2 (=adReadLine) は一行づつ取り出すためのオプションです。

テキストファイルに書き込む

 先程1行づつセルに書き込んだ内容を、テキストファイルに書き込む例です。

Sub ReadUTF8_Create_WriteLines()
    Dim filename
    filename = ThisWorkbook.Path & "\UTF8test.txt"
    
    Dim myADO As Object
    Set myADO = CreateObject("ADODB.Stream")
    
    Dim i As Long
    Dim bufLine As String
    
    With myADO
        .Type = 2 'adTypeText
        .Charset = "UTF-8"
        .Open

        i = 1      '①
        For i = 1 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
            bufLine = Cells(i, "A")     '②
            .WriteText bufLine, 1   'adWriteLine(文字列と改行文字を書込む)
        Next i
        
        .SaveToFile filename, 2  'adSaveCreateOverWrite    '③
        .Close
    End With
End Sub

 プログラムの解説です。
 一行づつ取り込むので今回は、For文で繰返し処理を行います。
 ①でA列の一行目から最終行までループさせます。
 ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
 は、最終行を得るための定石です。途中の 1 が一列目(A列)を指定しています。

 ②でセルの内容を文字列変数に代入し、その後、WriteTextメソッドで書き込んでいます。
 引数の 1 (=adWriteLine)は、文字列の後に改行文字を付加するオプションになります。
 (前に書いた、ReadUTF8_Create_WriteALL()の中では、オプションは不要なので指定しませんでした。)
 
 ループでオブジェクトにテキストが追加されていき、最後に③でファイルを保存します。
 ファイル上書きオプションの 2 ( =adSaveCreateOverWrite )を指定しています。

まとめ

 今回は、UTF8のテキストファイルを扱う方法を紹介しました。
 ADODB.Streamオブジェクトには他にもプロパティやメソッドがありますが、基本的な所を押さえてから先に進んだ方が混乱しないでしょう。
 知識としては、
 ・ライブラリの取り込み方
 ・ADODB.Streamオブジェクトの使用方法

 という二段階の手順を踏みますので、整理して取り組むようにしましょう。

 UTF-8が使われるようになり、ADODB.Streamオブジェクトは必須科目となると思います。
 他の文字コードを扱うこともできますので、使えるようになっておきましょう。

タイトルとURLをコピーしました