外部データの取り込み機能
一行ずつカンマの数を数えるなんてめんどくさいのでエクセルの機能を使う。(超速い)
おせっかい(自動変換)を防ぐために全ての列を文字列として取り込む。
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