今回は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のファイルを読み込んだ結果はこちらです。
ファイル名:SJIS.csv
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も読み取ってみました。
ファイル名:UTF-8.csv
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のファイルを読み込んでみました。
ファイル名:SJIS.csv
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.csv
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について知りたい!という方はこちらの記事もご覧ください。