【ExcelVBA】CSVファイルの読み込み

ExcelVBA, ファイルの操作

1行ごとに読み込み

下記の例ではカンマを区切り文字としているため「\1,000」の様なカンマが含まれた文字列が存在する場合は、
列を正しく分割できません。
この問題点を回避したい場合は「2.シートにインポート」を使用してください。

CR+LF改行コードの場合

カンマ区切りのCSVファイルを1行目から1行ずつ読み込み
Sub Sample()

  Dim Buf As String
  Dim tmp As Variant

  Open "E:\dummy.csv" For Input As #1
  
  Do Until EOF(1)
		Line Input #1, Buf
    tmp = Split(Buf, ",")
    
    Debug.Print tmp(0), tmp(1)
  
  Loop
	Close #1
End Sub
※10行目では Split で文字列を分割しtmp配列に格納。tmp(0) は1列目、tmp(1)は2列目の内容

カンマ区切りのCSVファイルを2行目から1行ずつ読み込み(1行目にあるヘッダー行が不要なときにどうぞ)
Sub Sample()

  Dim Buf As String
  Dim tmp As Variant

  Open "E:\dummy.csv" For Input As #1
	
  Line Input #1, Buf '1行目を無駄に読み込む
  Do Until EOF(1)
		Line Input #1, Buf
    tmp = Split(Buf, ",")
    
    Debug.Print tmp(0), tmp(1)
  
  Loop
	Close #1
End Sub

LF改行コードの場合

Sub Sample2()
    Dim buf As String
    Dim tmp As Variant, tmp2 As Variant
    Dim i As Long
    
    Open "E:\dummy.csv" For Input As #1
        Line Input #1, buf
    Close #1
        
    tmp = Split(buf, vbLf)

    For i = 0 To UBound(tmp) - 1
        tmp2 = Split(tmp(i), ",")
        Debug.Print tmp2(0), tmp2(1)
		Next i
End Sub
※10行目のtmpは配列です。tmp(0),tmp(1),tmp(2),...の各要素には、行末まので1行分がそれぞれ納まります。
※13行目で1行分をカンマ区切りで分割します。

シートにインポート

QueryTables.Addメソッドを使う

Sub Sample()

  Dim FullPath As String
  
  FullPath = "E:\dummy.csv"

  With ActiveSheet.QueryTables.Add(Connection:="TEXT;" + FullPath, Destination:=Range("$A$1"))
      .Name = "TestTable" '外部データ範囲の名前
      .FieldNames = True
      .RowNumbers = False
      .FillAdjacentFormulas = False
      .PreserveFormatting = True
      .RefreshOnFileOpen = False
      .RefreshStyle = xlInsertDeleteCells
      .SavePassword = False
      .SaveData = True
      .AdjustColumnWidth = False
      .RefreshPeriod = 0
      .TextFilePromptOnRefresh = False 'クエリが更新されるたびにインポートするテキストファイル名を指定する
      .TextFilePlatform = 932          ’932(SJIS),UTF-8(65001)
      .TextFileStartRow = 1            '読み込みの開始行
      .TextFileParseType = xlDelimited '区切り文字(xlDelimited),固定長(xlFixedWidth)
      .TextFileTextQualifier = xlTextQualifierDoubleQuote '二重引用符(xlTextQualifierDoubleQuote),引用符なし(xlTextQualifierNone),一重引用符(xlTextQualifierSingleQuote) 
      .TextFileConsecutiveDelimiter = False '連続する区切り文字を1つの区切り文字として扱う
      .TextFileTabDelimiter = False         'Tabが区切り文字
      .TextFileSemicolonDelimiter = False   'セミコロンが区切り文字
      .TextFileCommaDelimiter = True        'カンマが区切り文字
      .TextFileSpaceDelimiter = False       '空白が区切り文字
      .TextFileColumnDataTypes = Array(1, 1, 1, 1) 'フィールドのデータ型(左記のサンプルは4列全部既定値)
      .TextFileTrailingMinusNumbers = True  'マイナス記号で始まれば、負符号として扱う(True):テキストとして扱う(False)
      .Refresh BackgroundQuery:=False       'クエリをバックグラウンド (非同期) で実行
      .Refresh
  End With

End Sub
※QueryTables.Addは、既存ブックのシートに書き込みされます。

OpenTextメソッドを使う

Sub Sample()

  Dim FullPath As String
   
  FullPath = "E:\dummy.csv"

   Workbooks.OpenText _
   Filename:=FullPath _
   , Origin:=932 _
   , StartRow:=1 _
   , DataType:=xlDelimited _
   , TextQualifier:=xlDoubleQuote _
   , ConsecutiveDelimiter:=False _
   , Tab:=False _
   , Semicolon:=False _
   , Comma:=True _
   , Space:=False _
   , Other:=False _
   , TrailingMinusNumbers:=True
End Sub
※OpenTextは、必ず新規ブックのシートに書き込みされます。