LoginSignup
5
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-08

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

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

csv-excel.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ファイルはそのまま開ける場合とそうでない
場合があるのでこのようなものが必要です。

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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4