見出し行のないテキストファイルを読み込む

見出し行のないテキストファイルを読み込む

1行目がフィールド見出しではなく、いきなりデータが記述してあるテキストファイルを読み込む場合、schema.iniファイルを利用する時は「ColNameHeader=False」を設定するが、Connectionオブジェクトを開く際に次のような接続文字列を使っても良い。
Connectionオブジェクトの「Extended Properties」に「HDR=NO」を設定する。
ただし、schema.iniファイルに「ColNameHeader=True」が指定されている場合は、schema.iniの設定が優先される。

With myCon
  .Provider = "Microsoft.Jet.OLEDB.4.0"
  .Properties("Extended Properties") = "TEXT;HDR=NO"
  .Open myFolder
End With
以下の組み合わせで結果がどうなるかを確認した。
HDR設定 テキストファイルの見出し shema.ini の ColNameHeader
なし あり True
False
shema.ini ファイルなし
HDR=NO なし True
False
shema.ini ファイルなし

結果としては、schema.iniファイルにフィールド定義情報がある場合は、そちらが優先される。
HDR=NO の設定がある場合、先頭行もデータとして取り込まれる。
ただし、「Excelブックの操作 1行目もデータとして取り込む」にも解説があるように、以下の現象が発生する。
フィールドデータが文字列型以外の場合には、空欄として転記される。
(そのフィールドのデータ型として整合性がとれないため。)
「HDR=NO」の設定は、あくまでも「1行目もデータとして扱いたい場合」だけの設定である。

Sub テキストファイルを読み込む_HDR設定による変化()
Dim myCon As New ADODB.Connection, myRS As New ADODB.Recordset
Dim myFolder As String, myTxt(1 To 6) As String
Dim i As Integer, IdxRow As Integer

'テキストファイルの格納されている接続先のフォルダ
myFolder = ThisWorkbook.Path & "\txt"
'読み込みたいテキストファイル
myTxt(1) = "Test1-見出しあり_True.csv"
myTxt(2) = "Test2-見出しあり_False.csv"
myTxt(3) = "Test3-見出しあり_Non.csv"
myTxt(4) = "Test4-見出しなし_True.csv"
myTxt(5) = "Test5-見出しなし_False.csv"
myTxt(6) = "Test6-見出しなし_Non.csv"

'接続
With myCon
  .Provider = "Microsoft.Jet.OLEDB.4.0"
  .Properties("Extended Properties") = "TEXT"
  .Open myFolder
End With

'見出しを設定
Range("A1") = "HDR設定なし"
Range("A1:B1").Interior.ColorIndex = 49
Range("A1").Font.ColorIndex = 2

'各ファイルの出力位置
IdxRow = 2

For i = 1 To 6
  '見出しを設定
  Range("A" & IdxRow) = myTxt(i)
  Range("A" & IdxRow & ":C" & IdxRow).Interior.ColorIndex = 35
  'Recordsetオブジェクトに各テキストファイルの内容を格納
  myRS.Open myTxt(i), myCon, Options:=adCmdTableDirect
  'セルに転記
  Range("A" & IdxRow + 1).CopyFromRecordset myRS
  'レコードセットを一度閉じる
  myRS.Close
  '出力位置を変更
  IdxRow = IdxRow + 10
Next

'一度コネクションオブジェクトを閉じる
myCon.Close

'HDR=NO で再接続
With myCon
  .Provider = "Microsoft.Jet.OLEDB.4.0"
  .Properties("Extended Properties") = "TEXT;HDR=NO"
  .Open myFolder
End With

'見出しを設定
Range("G1") = "HDR=NO"
Range("G1:H1").Interior.ColorIndex = 49
Range("G1").Font.ColorIndex = 2

'各ファイルの出力位置を初期化
IdxRow = 2

For i = 1 To 6
  '見出しを設定
  Range("G" & IdxRow) = myTxt(i)
  Range("G" & IdxRow & ":I" & IdxRow).Interior.ColorIndex = 35
  'Recordsetオブジェクトに各テキストファイルの内容を格納
  myRS.Open myTxt(i), myCon, Options:=adCmdTableDirect
  'セルに転記
  Range("G" & IdxRow + 1).CopyFromRecordset myRS
  'レコードセットを一度閉じる
  myRS.Close
  '出力位置を変更
  IdxRow = IdxRow + 10
Next

Set myRS = Nothing
myCon.Close: Set myCon = Nothing

End Sub

実行結果 (テキストファイルに見出しあり)

実行結果 (テキストファイルに見出しなし)