見出し画像

VBAでUTF-8のCSVを読み込む方法

はじめに

こんにちは。分析部のCです。

先日VBAで開発をしていた際、CSVの文字コード違いによる文字化け事象に遭遇しました。
VBAでCSVを読み込む際、Line Inputを使用していたのですが、どうもLine Inputでは文字コードがShift-Jisのファイルしか扱えず、UTF-8は文字化けしてしまうようで…。
という訳で、自分の備忘録も兼ねて、今回はUTF-8を読み込めるVBAのコードをご紹介します。




使用するデータ

Excelで作成した架空の購買データです。


上記のデータを、文字コードをShift-JisとUTF-8に変更したうえで、それぞれをcsvファイルとして保存しています。


コード

結論から言うと、QueryTables.Addメソッドを使ってcsvファイルを読み込むことで、文字コードの指定が可能です。

QueryTables.AddのTextFilePlatformプロパティを932にすればShift-Jis、65001にすればUTF-8として読み込むことができます。

実際のコードは以下の通りです。
実行すると、ファイル選択ダイアログが開いた後、選択したファイルと同名のシートを作成してCSVを全件読み込みます。

Sub LoadCSVToSheet()

Dim FilePath As String
Dim FileName As String
Dim tmpSheet As Worksheet
Dim TargetSheet As Worksheet
Dim QueryTable As QueryTable

With Application.FileDialog(msoFileDialogFilePicker)
    If .Show = True Then
        FilePath = .SelectedItems(1)
        FileName = Dir(FilePath) 'ファイル名取得
        
        '選択ファイルと同名のシートが存在する場合削除
        Application.DisplayAlerts = False
        For Each tmpSheet In ThisWorkbook.Worksheets
            If tmpSheet.Name = FileName Then tmpSheet.Delete
        Next tmpSheet
        Application.DisplayAlerts = True
        
        '選択ファイルと同名のシートを作成
        Set TargetSheet = ThisWorkbook.Worksheets.Add(After:=Sheets(ThisWorkbook.Worksheets.Count))
        TargetSheet.Name = FileName
        
        'CSVをQueryTableに読込
        Set QueryTable = TargetSheet.QueryTables.Add(Connection:="TEXT;" & FilePath, _
        Destination:=TargetSheet.Range("A1"))
        QueryTable.Name = TargetSheet.Name

  QueryTableをシートに読込
        With QueryTable
            .TextFileCommaDelimiter = True
            .TextFileParseType = xlDelimited
            .TextFileStartRow = 1
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFilePlatform = 65001 'UTF-8
‘            .TextFilePlatform = 932 'Shift-Jis
            .BackgroundQuery = False
            .Refresh
            .Delete
        End With
        
        MsgBox "CSVの読込が完了しました"
    Else
        MsgBox "CSV読込処理が中断されました"
    End If
End With

End Sub

With句の中のTextFilePlatformを切り替えることで、どちらの文字コードにも対応可能です。
実際にCSVファイルを読み込んでみましょう。
TextFilePlatformを65001(UTF-8)に設定した状態で、UTF-8のCSVを読み込んでみます。

文字化けせず正常に読み込まれました。

ちなみに、このままShift-Jisのファイルを読み込むと文字化けします。

では、TextFilePlatformパラメータを932に変更して、再度Shift-Jisのファイルを読み込んでみましょう。
コードのコメントアウトしていた部分を変更し、TextFilePlatformパラメータを932に変更しました。

この状態でShift-Jisのファイルを読み込みます。

Shift-Jisのファイルも無事読み込むことができました。


まとめ

今回はShift-Jis・UTF-8のどちらでも読み込むことのできるコードをご紹介しました。
それにしても、クエリは何となく遅いという先入観があったのですが、QueryTables.addメソッドって結構処理速いですね。今回のCSVは900行程度あるのですが、ほぼ一瞬で読み込めました。
今回の対応で初めて使ったのですが、コードも結構簡単で使いやすかったです。
今度からはこちらのメソッドも活用していこうと思います。
では、ここまで読んでいただきありがとうございました。
この記事が皆さんの参考になれば幸いです。




ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!

【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。

【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。

【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。

【SES】
SESサービスも行っております。