UTF-8テキストデータの読み込み

UTF-8コードは今後のWindows上のテキストファイルの「標準」になるようです。
例えば「メモ帳」です。   Windows以前からMicrosoftのテキストデータの「標準」は「Ascii(シフトJIS漢字)コード」でした。
Windows10になってからも例えば「メモ帳」で新規に作成するテキストファイルのデフォルトは「Ascii(シフトJIS漢字)コード」でした。
ですが、Windows10の「ビルド1903」になってこれが変更され、「UTF-8コード」がデフォルトに変更されました。
さらにステータスバーの右方には改行コード、文字コードが表示されるようになり、名前を付けて保存のダイアログでは、



このように文字コードの指定ができるようになりました。
ここで「ANSI」を指定すれば従来の「Ascii(シフトJIS漢字)コード」になりますが、デフォルトは「UTF-8」です。



しかし、VBAでは標準的なテキストファイル、CSVファイルの読み書きの方法では「UTF-8コード」は扱えないので、 本ページの方法が必要になります。 「BOM(ByteOrderMark)」については「UTF-8テキストデータの書き出し」をご覧下さい。
起動画面です。


(この画像をクリックすると、このページのサンプルがダウンロードができます。)
画面右の「UTF-8テキストファイル読み込み」ボタンをクリックすると「ファイルを開く」ダイアログが表示されるので、 「UTF-8コード」の対象テキストファイルを指定して「開く」をクリックして下さい。 ファイルの種類が「テキストファイル(*.txt)」でない場合は、ファイル名の右のプルダウンを「全てのファイル(*.*)」に変更すれば選択できるようになります。



処理では特に「文字コード」についてチェックをしているわけではなく、「UTF-8コード」として処理されます。
読み込まれた内容は、2行目から下に向かって展開されて表示されます。
処理は「行読み」であり改行単位に行に展開されます。ここでの「改行」は「CRLF改行」を前提としており、 例えばWeb系で見られる「LF改行」ではA2セルに全ての読み込み内容が収容されてしまうという動作になります。

ソースコードです。

'***************************************************************************************************
'   UTF-8テキストファイル読み込みサンプル                           Module1(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'   [参照設定]
'   ・Microsoft ActiveX Data Objects x.x Library
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'20/04/26(1.00)新規作成
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private Const g_cnsTitle As String = "UTF-8テキストファイル読み込み"
Private Const g_cnsFilter As String = "テキストファイル (*.txt),*.txt,全てのファイル (*.*),*.*"
Private Const g_cnsCharset As String = "UTF-8"

'***************************************************************************************************
'   ■■■ ワークシート側からの呼び出し処理 ■■■
'***************************************************************************************************
'* 処理名 :READ_TextFile1
'* 機能  :テキストファイル読み込みサンプル(UTF-8)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2020年04月26日
'* 作成者 :井上 治
'* 更新日 :2020年04月26日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:サンプルなのでエラー処理は行なっていません
'***************************************************************************************************
Sub READ_TextFile1()
    '-----------------------------------------------------------------------------------------------
    Dim objAdost As ADODB.Stream                                    ' 入力ファイル
    Dim lngRow As Long                                              ' 収容するセルの行
    Dim lngRec As Long                                              ' レコード件数カウンタ
    Dim strFileName As String                                       ' OPENするファイル名(フルパス)
    Dim vntFileName As Variant                                      ' ファイル名受取用
    '-----------------------------------------------------------------
    ' ①「ファイルを開く」のダイアログでファイル名の指定を受ける
    Application.StatusBar = "読み込むファイル名を指定して下さい。"
    vntFileName = Application.GetOpenFilename(FileFilter:=g_cnsFilter, Title:=g_cnsTitle)
    ' キャンセルされた場合はFalseが返るので以降の処理は行なわない
    If VarType(vntFileName) = vbBoolean Then Exit Sub
    strFileName = vntFileName
    '-----------------------------------------------------------------
    ' ②指定ファイルをOPEN
    Set objAdost = New ADODB.Stream
    ' ADODB.Stream処理
    With objAdost
        .Charset = g_cnsCharset
        .Open
        .LoadFromFile strFileName
        '-------------------------------------------------------------
        ' ③ファイルのEOF(End of File)まで繰り返す
        Do Until .EOS
            ' レコード件数カウンタの加算
            lngRec = lngRec + 1
            Application.StatusBar = "読み込み中です....(" & lngRec & "レコード目)"
            ' 行を加算しA列にレコード内容を表示(先頭は2行目)
            lngRow = lngRow + 1
            Cells(lngRow, 1).Value = .ReadText(adReadLine)
        Loop
        '-------------------------------------------------------------
        ' ④指定ファイルをCLOSE
        .Close
    End With
    Set objAdost = Nothing
    Application.StatusBar = False
    ' 終了の表示
    MsgBox "ファイル読み込みが完了しました。" & vbCr & _
        "レコード件数=" & lngRec & "件", vbInformation, g_cnsTitle
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
このページより前に紹介していた「FileSystemObject」ではなく、このように「ADODB.Stream」での処理になります。
BOM(ByteOrderMark)」の有無に関係なく、読み込み処理ができています。
先に説明した通り処理が「行読み」です。「③」のDoループ内が1行単位の処理になります。



「行読み」の指定は「.ReadText(adReadLine)」のカッコ内の「adReadLine」で、 これを「adReadAll」に変更するとEOFまでの全てのテキストが1回で読み込まれます。
先に説明した通り、ここでの「行読み」は「CRLF改行」を前提としています。 「LF改行」などではどちらにしても全量が読み込まれるので、読み込み後に「LFコード」で行分割させるような変更が必要になります。