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

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

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

![csv-excel.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570700/53c57022-dc6f-9471-a4e8-9a8390e78d7b.gif)

___プログラムの概要：___
・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ファイルはそのまま開ける場合とそうでない
場合があるのでこのようなものが必要です。

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