RecordSource
Access フォームまたはレポートの は、テーブルまたはクエリにすることができます。テーブルはローカルまたはリンクすることができ (計算フィールドを含む場合もあります)、クエリは他のクエリや他のテーブルを参照できます。さらに、クエリでは、「*」選択、ユーザー定義関数 (UDF)、さらにはリモート接続されたソースを使用できます。クロス集計クエリは、フィールド内の値によって決定されるフィールド名を持つことができます。そのため、クロス集計フィールド名は、データの変更に応じて変化する可能性があります。
次の考慮事項を考慮して、特定の RecordSource のフィールド名を決定する最も効率的な「軽いタッチ」の方法を見つけようとしています。
ユーザー定義関数を含むクエリは、フィールド名の決定中に関数を呼び出さないため、レコードセット アプローチは適していません。
基礎となるオブジェクトにロックを設定しないでください
データベースは理想的には排他モードにしない
リンクされたテーブルへの接続は、理想的には開かないでください。また、リモート テーブルのトリガーもトリガーしないでください。可能であれば、リモート データ ソースにアクセスせずにフィールドを決定する必要があります。
フィールド名は必須です。フィールド タイプと属性があれば便利です。フィールドの説明はおまけです。
クロス集計クエリが基礎となるテーブルを開いたり、UDF を実行したりする可能性があるのではないかと心配しているため (私のテストではそうでした)、クロス集計クエリのフィールドの列挙をスキップする準備ができています。クロス集計クエリであるソース...
DAO の TableDef と QueryDef を使用するのが適切かどうか、ADO スキーマとカタログ、または他のアプローチを検討する必要があるかどうかはわかりません。
これは非常に基本的な DAO のアプローチですが、それが必ずしも最速であるとは確信していません。
Sub EnumQueryDefFieldNames()
Dim qdf As QueryDef
Set qdf = CurrentDb.QueryDefs("Query7_Crosstab")
For Each fld In qdf.Fields
Debug.Print fld.Name
Next fld
End Sub