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ファイルはそのまま開ける場合とそうでない
場合があるのでこのようなものが必要です。
将来的には仕様が変わるかもですね。