特定の対象のスキーマ情報のみを取得する

特定の対象のスキーマ情報のみを取得する

Sub 特定のスキーマ情報取得()
Dim myCon As New ADODB.Connection
Dim myRS As New ADODB.Recordset
Dim myRS2 As New ADODB.Recordset
Dim mySrc As String, i As Integer

'接続先のExcelファイル
mySrc = ThisWorkbook.Path & "\xls\DataBook.xls"

'接続
With myCon
  .Provider = "Microsoft.Jet.OLEDB.4.0;"
  .Properties("Extended Properties") = "Excel 8.0;"
  .Open mySrc
End With

'フィールド情報(COLUMNS 行セット)を全て取得
Set myRS = myCon.OpenSchema(adSchemaColumns)

'フィールド情報(COLUMNS 行セット)の一部を取得
Set myRS2 = myCon.OpenSchema(adSchemaColumns, Array(Empty, Empty, "社員", Empty))

'myRSのフィールド名を書き出し
For i = 1 To myRS.Fields.Count
  Cells(1, i) = myRS.Fields(i - 1).Name
Next
'取得した情報を転記
Range("A2").CopyFromRecordset myRS

'myRS2のフィールド名を書き出し
For i = 1 To myRS.Fields.Count
  Cells(41, i) = myRS.Fields(i - 1).Name
Next
'取得した情報を転記
Range("A42").CopyFromRecordset myRS2

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

End Sub

SchemaEnum列挙型の定数によっては「制約列」を使って抽出を行った結果のみを得ることが可能。
「adSchemaColumns」では「TABLE_CATALOG」「TABLE_SCHEMA」「TABLE_NAME」「COLUMN_NAME」の4つの列をフィルタして結果を得ることができる。
制約列を使用して「社員」テーブルのフィールド情報のみ取得するには、以下のように記述する。
(制約列「TABLE_NAME」の値が、『社員』のレコードのみ抽出する。)

OpenSchema(adSchemaColumns, Array Empty, Empty, "社員",Empty))

制約列に何も抽出条件を指定しない場合には、Emptyキーワードを使用する。

実行結果 myRS

実行結果 myRS2