LoginSignup
8
9

More than 5 years have passed since last update.

VBAでCSV取込

Last updated at Posted at 2017-06-05

外部データの取り込み機能

一行ずつカンマの数を数えるなんてめんどくさいのでエクセルの機能を使う。(超速い)
おせっかい(自動変換)を防ぐために全ての列を文字列として取り込む。
1行目にタブが含まれていればタブ区切り、タブが無ければカンマ区切りで取り込む。
※カンマ区切り、タブ区切りの判定はそれぞれの環境に合わせてください
データ取込後にデータ接続を解除する。

import_csv
'FileName  Variant 取り込みファイル名
'SheetName String  貼り付け先シート名
Sub import_csv(FileName as Variant, SheetName As String)
On Error GoTo ErrorHandler
    Application.ScreenUpdating = False

    Dim csvsheet As Worksheet   '貼り付け先のシート
    Dim sample As String        'サンプル行

    '取込ファイルの1行目をsampleに格納
    Open FileName For Input As #1
    Line Input #1, sample
    Close #1

    'すべての列を文字列で取り込むために長さ255の配列を用意する(Excelの最大列数が255)
    Dim v(255) As Long
    Dim i As Long
    For i = 0 To 255
        v(i) = 2  'xlTextFormat
    Next

    'シートを空にする
    Set csvsheet = ThisWorkbook.Sheets(SheetName)
    csvsheet.Cells.Clear

    'データ取込
    With csvsheet.QueryTables.Add(Connection:="text;" & FileName, Destination:=csvsheet.Range("A1"))
        'サンプル行にタブが含まれている場合はタブ区切り、それ以外はカンマ区切りで取り込む
        If InStr(sample, vbTab) > 0 Then
            .TextFileTabDelimiter = True
        Else
            .TextFileCommaDelimiter = True
        End If
        '全ての列を文字列で取り込む
        .TextFileColumnDataTypes = Array(v)
        '文字コードを指定(Shift-JIS)
        .TextFilePlatform = 932
        '取込を実行
        .Refresh
        'データ接続の情報削除
        .Parent.Names(.Name).Delete
        .Delete
    End With

    MsgBox "CSV取り込みが完了しました。" , vbOKOnly
GoTo Finally:
ErrorHandler:
   MsgBox "エラーが発生しました" & vbCrLf & Err.Description & "(" & Err.Number & ")", vbExclamation
Finally:
    Application.ScreenUpdating = True
End Sub
8
9
1

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
8
9