Access

今回はAccess等で使われるVBAで、Shift-JIS(SJIS)・UTF-8等、各種文字コードのファイルを読み込む方法を紹介します。
内容としては、OpenステートメントやADODB.Streamを使った手法です。
自作関数のサンプルもつけてますので、是非ご活用ください!
また、同時にダイアログを開いて対象のファイル名を取得する方法も紹介してますので、良かったらそちらもどうぞ。

紹介する手法

まず、本記事の簡単なまとめから♪

・Openステートメント
 Shift-JISのみ
・ADODB.Stream ← ☆汎用性があるため個人的にはおすすめ
 Shift-JIS・UTF-8他

共通で使っているテストデータやサブ関数

説明の際に使用するテストデータや、自作関数の中で呼び出しているサブ関数です。
本記事とは内容が離れますので、飛ばしてもらっても大丈夫です。

テストデータ

今回テストとして読み込むcsvファイルは以下を使用します。
(同じ内容で文字コードがShift-JIS・UTF-8のデータを用意)

No	郵便番号	住所	名前
1	859-5326	東京都春日井市向谷町1-65	ヤマモトコーポレーション株式会社
2	987-2523	千葉県向田市山本町658-44	華井 譲
3	789-0001	千葉県向田市山本町 ジンダ-ビル2F 201号	蓮田不動産株式会社
4	653-6567	大阪府大東市浅田8-999	株式会社ハッターフ
5	198-3463	鹿児島県薩摩川内市浜本123-77	山本 茂

(サブ関数)ダイアログを開いて対象のファイル名を取得する

ダイアログを開いて対象のファイル名を取得するサブ関数を用意しました。
直接ファイルパスを次項から紹介する関数のコード上に書いてしまっても良かったのですが、それではコピペして使いにくいので。。

内容としては、GetFileName_csvを呼び出すと、ダイアログを開いてcsvファイルのファイル名を取得し、戻り値として返す関数になります。

' GetFileName_csv
' csvファイル名を取得
Function GetFileName_csv()

    'ダイアログを開いてcsvファイルのファイル名を取得
    'Application.FileDialogを使うには、
    '参照設定でMicrosoft Office 1X.0 Object Libraryの追加が必要
    With Application.FileDialog(msoFileDialogOpen)
        .Filters.Clear
        .Filters.Add "csvファイル", "*.csv"
        .AllowMultiSelect = False
        If .Show = True Then
            GetFileName_csv = .SelectedItems(1)
        End If
    End With

End Function

Openステートメントでcsvファイル読み込み(Shift-JISのみ可)

Openステートメントで、csvファイルを読み込む方法です。
Openステートメントでは、文字コードに合わせて対応していくことができないので、Accessのデフォルトの文字コードであるShift-JISでしか正しく読み取りできません。

以下、Openステートメントを使用したcsvファイル読込関数関数です。

' ReadCSVFile_Open
' csvファイル読込関数(Openステートメントを使用)
Sub ReadCSVFile_Open()
    
    'ファイル名取得
    Dim sOpenFileName As String
    sOpenFileName = GetFileName_csv
    If sOpenFileName = "" Then Exit Sub

    'ファイルを読み込んでイミディエイトウィンドウに内容を表示する
    Dim sBuf  As String
    Open sOpenFileName For Input As #1 'ファイルを開いて[#1]という番号で管理
    Do Until EOF(1)
       Line Input #1, sBuf '1行づつバッファへ格納
       Debug.Print sBuf
    Loop
    Close #1
    
End Sub

こちらの関数を使用して、Shift-JISのファイルを読み込んだ結果はこちらです。

No  郵便番号    住所    名前
1   859-5326    東京都春日井市向谷町1-65    ヤマモトコーポレーション株式会社
2   987-2523    千葉県向田市山本町658-44  華井 譲
3   789-0001    千葉県向田市山本町 ジンダ-ビル2F 201号   蓮田不動産株式会社
4   653-6567    大阪府大東市浅田8-999  株式会社ハッターフ
5   198-3463    鹿児島県薩摩川内市浜本123-77  山本 茂

正確に読み取れてますね。

試しにこの関数を使って、UTF-8も読み取ってみました。

No  驛オ萓ソ逡ェ蜿キ    菴乗園  蜷榊燕
1   859-5326    譚ア莠ャ驛ス譏・譌・莠募クょ髄隹キ逕コ・托シ搾シ厄シ・繝、繝槭Δ繝医さ繝シ繝昴Ξ繝シ繧キ繝ァ繝ウ譬ェ蠑丈シ夂、セ
2   987-2523    蜊・痩逵悟髄逕ー蟶ょアア譛ャ逕コ・厄シ包シ假シ搾シ費シ・闖ッ莠輔€€隴イ
3   789-0001    蜊・痩逵悟髄逕ー蟶ょアア譛ャ逕コ縲€繧ク繝ウ繝€・阪ン繝ォ・巽縲€・抵シ撰シ大捷 闢ョ逕ー荳榊虚逕」譬ェ蠑丈シ夂、セ
4   653-6567    螟ァ髦ェ蠎懷、ァ譚ア蟶よオ・伐・假シ搾シ呻シ呻シ・譬ェ蠑丈シ夂、セ繝上ャ繧ソ繝シ繝・
5   198-3463    鮖ソ蜈仙ウカ逵瑚湊鞫ゥ蟾晏・蟶よオ懈悽・托シ抵シ難シ搾シ暦シ・螻ア譛ャ縲€闌・

全角が化けてしまっていますね。
前述のとおり、UTF-8を含む他の文字コードには対応していませんので、読み取る必要があれば次項をお使いください。

ADODB.Streamでcsvファイルを読み込む(UTF-8、Shift-JIS他)

ADODB.Streamで、csvファイルを読み込む方法です。
ADODB.Streamでは、UTF-8、Shift-JISを含む各種文字コードに対応しています。

以下、Openステートメントを使用したcsvファイル読込関数関数です。

' ReadCSVFile_ADODB
' csvファイル読込関数(ADODB.Streamを使用)
Sub ReadCSVFile_ADODB()
    
    'ファイル名取得
    Dim sOpenFileName As String
    sOpenFileName = GetFileName_csv
    If sOpenFileName = "" Then Exit Sub

    'ファイルを読み込んでイミディエイトウィンドウに内容を表示する
    Dim sBuf  As String
    With CreateObject("ADODB.Stream")
       .Charset = "UTF-8" 'SJISの場合、"shift_jis"
       .Open
       .LoadFromFile sOpenFileName
        Do Until .EOS
           sBuf = .ReadText(-2) '1行づつバッファへ格納
           Debug.Print sBuf
        Loop
       .Close
    End With
    
End Sub

なお、上記関数をそのままコピペすると、UTF-8に対応した関数になります。
shift_jisに対応させる場合、

.Charset = "UTF-8"

の部分を、

.Charset = "shift_jis"

に書き換えてください。

その他、UTF-8、Shift-JIS以外の文字コードで読み取る場合は、
「レジストリエディタ」の「HKEY_CLASSES_ROOT\MIME\Database\Charset」から確認してください。
レジストリエディタは、
「Windowsマーク」キーと「R」キーを同時押し→ファイル名を指定して実行の画面が出たら、「regedit」と入力してエンターを押すと開くことができます。

レジストリエディタ

それでは、まずshift_jisのファイルを読み込んでみました。

No  郵便番号    住所    名前
1   859-5326    東京都春日井市向谷町1-65    ヤマモトコーポレーション株式会社
2   987-2523    千葉県向田市山本町658-44  華井 譲
3   789-0001    千葉県向田市山本町 ジンダ-ビル2F 201号   蓮田不動産株式会社
4   653-6567    大阪府大東市浅田8-999  株式会社ハッターフ
5   198-3463    鹿児島県薩摩川内市浜本123-77  山本 茂

正確に読み取れてますね。

次にUTF-8。

No  郵便番号    住所    名前
1   859-5326    東京都春日井市向谷町1-65    ヤマモトコーポレーション株式会社
2   987-2523    千葉県向田市山本町658-44  華井 譲
3   789-0001    千葉県向田市山本町 ジンダ-ビル2F 201号   蓮田不動産株式会社
4   653-6567    大阪府大東市浅田8-999  株式会社ハッターフ
5   198-3463    鹿児島県薩摩川内市浜本123-77  山本 茂

こちらも、正しく読み取ることができました♪

最後に

今回はShift-JIS・UTF-8等、各種文字コードのファイル読み込みの方法を紹介しました。
汎用性の高さから、Shift-JISの場合でも「ADODB.Stream」を使った手法がおすすめですが、使いやすさや読込速度など、実際に使ってみないとわからないこともあると思うので、色々試してみてくださいね♪

今回の記事が何かの参考になれば幸いです。来訪ありがとうございました♪