アクセスは、クエリの種類を示す値を格納するフィールド (Flags) を含む MSysObjects と呼ばれる非表示のシステム テーブルを保持します。リストの各クエリ名で次の関数を試し、戻り値を使用して Database.Execute() または Database.OpenRecordset() のどちらを使用するかを決定できます。
関数には、MSysObjects の読み取り権限が必要です。一部の Access 2007 ユーザーが MSysObject の読み取り権限を拒否されているという報告を聞きました。ただし、Access 2007 ではその問題は発生していません。
Flags 値を決定するために、いくつかのクエリ タイプをテストしました。クエリの 1 つが私がテストしていない型である場合、関数はフラグ値を認識できないものとして返します。関数を変更して、そのフラグ型を含めることができます。
テストした唯一の DDL クエリは DROP TABLE (Flags = 96) でした。
また、すべての "SELECT ... FROM ..." クエリが目的 (レコードセットを返す) の選択クエリであるとは限らないことに注意してください。「SELECT fields INTO newtable FROM oldtable;」などのクエリ はレコードを返さず、Access UI はそれをテーブル作成クエリとして分類します。
Public Function QueryType(ByVal pQueryName As String) As String
Dim lngFlags As Long
Dim strType As String
Dim strCriteria As String
strCriteria = "[Name] = """ & pQueryName & """ And [Type] = 5"
lngFlags = DLookup("Flags", "MSysObjects", strCriteria)
Select Case lngFlags
Case 0
strType = "Select"
Case 16
strType = "Crosstab"
Case 32
strType = "Delete"
Case 48
strType = "Update"
Case 64
strType = "Append"
Case 80
strType = "Make Table"
Case 96
strType = "Drop Table"
Case 128
strType = "Union"
Case Else
strType = "Flags " & CStr(lngFlags) & " unrecognized"
End Select
QueryType = strType
End Function