ray88’s diary

お仕事で困ったとき用の自分用の覚書

CSVファイルデータを読み込む

① Openメソッドで読み込む方法
② ADODBでレコードセットに格納して読み込む方法
'-------------------------------------------------------------------

①まずはOPENメソッドでデータを読込む方法

Sub testReadText1()

Dim buf As String
Dim dataArray As Variant
Dim targetPath As String
Dim intFileNumber
Dim intIndex As Long

'読込対象テキストファイルパス
targetPath = "C:\デスクトップ\ダミー.CSV"

'ファイル番号を取得
intFileNumber = FreeFile

'読込モードでファイルを開く
Open targetPath For Input As #intFileNumber

  '行インデックス番号を初期化
  intIndex = 0

  'ファイルの最後まで繰り返し
  Do Until EOF(intFileNumber)
       '1行分のデータを読み取り
       Line Input #intFileNumber, buf
       '1行分のデータをカンマ区切りで配列に格納
       dataArray = Split(buf, ",")
        '先頭行(項目名)以外の場合、値確認のログ出力
       If intIndex <> 0 Then
           Debug.Print intIndex & "行目:" & dataArray(0) & " :" & dataArray(1) & " :" & dataArray(2)
       End If
    '行インデックスに1足す
      intIndex = intIndex + 1
Loop

  'ファイルを閉じる
  Close #intFileNumber

End Sub

②ADODBで読み込んでレコードセットに格納する方法
※ADODBを事前バインディングする際は参照設定の
Microsoft ActiveX Data Objects 6.1 Library」にチェックを入れる

Sub testReadText2()

Dim targetPath As String
Dim strFileName As String
Dim targetFolderPath As String
Dim strSQL As String
Dim intIndex As Long

'書き込み先ファイルパス
targetPath = "C:\デスクトップ\ダミー.CSV"

'フルパスからファイル名を取得
strFileName = Dir(targetPath)
'フルパスからフォルダ名を取得
targetFolderPath = Replace(targetPath, strFileName, "")

 '---------------------------------------------------------------
 'ADODBを遅延バインディングするときの書き方

 Dim CN As Object
 Dim RS As Object

 Set CN = CreateObject("ADODB.Connection")
 '---------------------------------------------------------------
 '参照設定済のときの書き方

 'Dim CN As ADODB.Connection
 'Dim RS As ADODB.Recordset
 
 'Set CN = New ADODB.Connection
  'Set RS = New ADODB.Recordset
 '-----------------------------------------------------------------------
 'OSが64bitの場合はJET.OLEDB.4.0;は使用できなくなったのでACE.OLEDB.12.0;

 '接続先を指定(CSVのフォルダパスを指定)
 CN.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source=" & targetFolderPath & ";" & _
 "Extended Properties='Text;HDR=YES'"
 '-----------------------------------------------------------------------

 'SQL分作成(FROM以降はCSVのファイル名)
 strSQL = "SELECT * FROM " & strFileName

 'SQL文を実行してCSVデータをレコードセットに格納
 Set RS = CN.Execute(strSQL)

 intIndex = 0

 Do Until RS.EOF
  '先頭行(項目名)以外ならメッセージボックスに値を表示
  If intIndex <> 0 Then
   '1レコード分のフィールドの値を「:」で区切ってメッセージボックスで表示
   MsgBox intIndex & "行目:" & RS.Fields(0) & ":" & RS.Fields(1) & ":" & RS.Fields(2)
  End If
  intIndex = intIndex + 1
  RS.MoveNext
 Loop

 RS.Close
 CN.Close
 Set RS = Nothing
 Set CN = Nothing

End Sub

※参考URL
【VBA】ADOを使用してテキストファイル(CSV)をDB操作する方法のまとめ #VBA - Qiita