CSVファイル(UTF-8、Shift-JIS)をExcelにインポートするシンプルなVBAマクロ


CSVファイルをExcelにインポートする
シンプルなVBAマクロの例です。
UTF-8、Shift-JIS用両方を用意しました。
ダブルクオーテーションがあっても読めます。
※2020.10.11追記 書式をすべて文字列にするverを追加

良く文字化けする、手動でインポートするの
がめんどうといった時に活用しましょう。

プログラムの概要:
・CSVファイルを指定してファイルパスを取得(エクスプローラーで選択)
・結果出力シートはいったんクリアにする
・ファイルを読み込んで出力シートに書き込み(VBAコードに初期設定)
UTF-8用、Shift-JIS用は別にしている

■サンプル:マクロ組み込み済みExcelファイル
http://allcountry.sakura.ne.jp/biz/code/vba/csvexcel/CSV_Inport.xlsm
※商用利用でも個人用でもご自由にご利用ください。

全列の書式が文字列ver
http://allcountry.sakura.ne.jp/biz/code/vba/csvexcel/CSV_Inport_textonly.xlsm

▼東京都のオープンデータでテスト

■UTF-8のCSV
 東京都目黒区区有施設(所在地、名称、連絡先)
http://www.city.meguro.tokyo.jp/opendata/131105_public_facility.csv

■SHITF-JISのCSV
 東京の公立図書館情報
http://www.opendata.metro.tokyo.jp/kyouiku/all_tokyo_library_guide.csv

VBAコード

主要そうな部分を解説します。
今回はQueryTablesというメソッドを使っています。
外部データの取り込みに利用するものです。
スピードも速めであり、シンプルです。

・ファイルパスを取得(代入):
SettingFileName =Application.GetOpenFilename~

・CSVを接続する:
QueryTables.Add(Connection:="text;" & SettingFileName,

・文字コードを指定(65001→UTF-8 、 932→Shift-Jis)
.TextFilePlatform = 65001


Public Const targetsheet = "result"
'結果を出力するシート名を指定


Sub CSV取り込みUTF8()

    Dim SettingFileName As Variant

    Sheets(targetsheet).Cells.Clear
    'ファイルクリア

    SettingFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                        Title:="CSVファイルの選択")
    If SettingFileName = False Then
        Exit Sub
    End If

    With Sheets(targetsheet).QueryTables.Add(Connection:="text;" & SettingFileName, Destination:=Sheets(targetsheet).Range("A1"))
        .TextFilePlatform = 65001 'UTF-8
        .AdjustColumnWidth = False '列の幅を自動計算しない
        .TextFileCommaDelimiter = True 'コンマ区切り
        .Refresh BackgroundQuery:=False 'シートに出力

        .Delete
    End With

Sheets(targetsheet).Activate

End Sub



Sub CSV取り込みSHIFTJIS()
    Dim SettingFileName As Variant

    Sheets(targetsheet).Cells.Clear

    SettingFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                        Title:="CSVファイルの選択")
    If SettingFileName = False Then
        Exit Sub
    End If

    With Sheets(targetsheet).QueryTables.Add(Connection:="text;" & SettingFileName, Destination:=Sheets(targetsheet).Range("A1"))

        .TextFilePlatform = 932 'SHIFTJIS
        .AdjustColumnWidth = False '列の幅を自動計算しない
        .TextFileCommaDelimiter = True 'コンマ区切り
        .Refresh BackgroundQuery:=False 'シートに出力

        .Delete
    End With

Sheets(targetsheet).Activate

End Sub

すべての列の書式を文字列にするver

0から始まる数字だけのデータ(ハイフン無し電話番号など)
がある場合、大きな桁数のデータに対応するよう、
下記では書式を文字列として取り込むようにしています。

TextFileColumnDataTypes
で設定します。


Public Const targetsheet = "result"
'結果を出力するシート名を指定


Sub CSV取り込みUTF8()

    Dim SettingFileName As Variant

     Dim Tcount(120) As Long
 For i = 0 To 120
        Tcount(i) = 2  '文字列の意
    Next
'文字列の書式用に配列を作成

    Sheets(targetsheet).Cells.Clear
    'ファイルクリア

    SettingFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                        Title:="CSVファイルの選択")
    If SettingFileName = False Then
        Exit Sub
    End If

    With Sheets(targetsheet).QueryTables.Add(Connection:="text;" & SettingFileName, Destination:=Sheets(targetsheet).Range("A1"))
        .TextFilePlatform = 65001 'UTF-8
        .AdjustColumnWidth = False '列の幅を自動計算しない
        .TextFileCommaDelimiter = True 'コンマ区切り
        .TextFileColumnDataTypes = Array(Tcount) '文字列にする
        .Refresh BackgroundQuery:=False 'シートに出力


        .Delete
    End With

Sheets(targetsheet).Activate

End Sub



Sub CSV取り込みSHIFTJIS()
    Dim SettingFileName As Variant

         Dim Tcount(120) As Long
 For i = 0 To 120
        Tcount(i) = 2  '文字列の意
    Next
'文字列の書式用に配列を作成

    Sheets(targetsheet).Cells.Clear

    SettingFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                        Title:="CSVファイルの選択")
    If SettingFileName = False Then
        Exit Sub
    End If

    With Sheets(targetsheet).QueryTables.Add(Connection:="text;" & SettingFileName, Destination:=Sheets(targetsheet).Range("A1"))

        .TextFilePlatform = 932 'SHIFTJIS
        .AdjustColumnWidth = False '列の幅を自動計算しない
        .TextFileCommaDelimiter = True 'コンマ区切り
        .TextFileColumnDataTypes = Array(Tcount) '文字列にする
        .Refresh BackgroundQuery:=False 'シートに出力

        .Delete
    End With

Sheets(targetsheet).Activate

End Sub

最後に

Excelの仕様上、文字コードや、ダブルクオーテーションの有無で、
CSVファイルはそのまま開ける場合とそうでない
場合があるのでこのようなものが必要です。

将来的には仕様が変わるかもですね。