CSVを取り込む その2

Dim FileN
Dim shTHIS As Worksheet
Dim tmp
Dim strBuf
Dim clm

'取り込むファイルをダイアログで選択、キャンセルで中断
FileN = Application.GetOpenFilename("CSVファイル,*.csv")
If FileN = False Then Exit Sub

'取り込み先のシートを指定
Set shTHIS = ThisWorkbook.Worksheets("シート名")
shTHIS.Cells.Clear

'対象ファイルのフィールド数を特定する
Open FileN For Input As #1
Line Input #1, strBuf
tmp = Split(strBuf, ",")

ReDim clm(UBound(tmp))
For i = 0 To UBound(tmp)
clm(i) = 2
Next i
Close #1

'外部データ取込機能で取り込む、貼り付け位置はDestinationで指定
With shTHIS.QueryTables.Add(Connection:="TEXT;" & FileN, Destination:=shTHIS.Range("$A$1"))
.TextFilePlatform = 932
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileColumnDataTypes = clm
.AdjustColumnWidth = False
.RefreshStyle = xlOverwriteCells
.Refresh
.Delete
End With

Open For Inputだと引用符(")の扱いで難しいのでQuertTablesで取り込むコード。
Excelの外部データ取り込み機能が基。

数値の自動変換対策に全て文字列とする。取り込む列全てに配列で指定しなければいけないので、汎用性を考えOpen For Inputで一行目だけ抜き取り列数を取得している。

↓以下説明とか

VBA CSV ファイルの読み込み (QueryTables.Add 関数を使う)

 .RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileSpaceDelimiter = False

.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
  .Name = "" 'クエリとしてのテーブル名
.CommandType = 0
.FieldNames = True