データベース内のコレクション全体を走査し、TableDefs
VBA を使用してクエリを作成できます。
警告:コレクションTableDefs
には Access データベース システム テーブルが含まれているため、これをスキップする必要があります。特定のテーブル名のプレフィックスを確認することをお勧めします (以下のコードに記載されています)。
public sub createMyBigUnionQuery()
dim db as DAO.database(), tbl as DAO.tableDef
dim strSQL as string, i as integer
set db = currentdb()
i = 1
for each tbl in db.TableDefs
if left(tbl.name, 1) = "5" then ' Check for a table name prefix
if i = 1 then
' The final spaces are important
strSQL = "select '" & tbl.Name & "' as table, count(qcpass) as column " & _
"from [" & tbl.Name & "] " & _
"group by qcpass "
else
' The final spaces are important
strSQL = strSQL & " union all " & _
"select '" & tbl.Name & "' as table, count(qcpass) as column " & _
"from [" & tbl.Name & "] " & _
"group by qcpass "
end if
i = i + 1
end if
next tbl
db.createQueryDef "qryYourFinalQuery", strSQL
db.close
exit sub
任意の有効なクエリを定義できることに注意してください。これをヒントにして、特定のニーズに合わせて微調整してください。
これがお役に立てば幸いです
@HansUp コメントへの対処。データを日付でフィルタリングする必要がある場合は、次の 2 つのオプションがあります。
- プロシージャによって作成された
where
すべての条件を含めますselect
- クエリに日付フィールドを含めてグループ化し、2 つ目のクエリを作成して、作成したクエリから必要なデータをフィルター処理します。
個人的にはオプション 1 を使用します。サンプル コードは次のとおりです。
public sub createMyBigUnionQueryWithDates(d0 as date, d1 as date)
dim db as DAO.database(), tbl as DAO.tableDef
dim strSQL as string, i as integer
set db = currentdb()
i = 1
for each tbl in db.TableDefs
if left(tbl.name, 1) = "5" then ' Check for a table name prefix
if i = 1 then
' The final spaces are important
strSQL = "select '" & tbl.Name & "' as table, count(qcpass) as column " & _
"from [" & tbl.Name & "] " & _
"where rowDate between " & cDbl(d0) & " and " &cDbl(d1) & " " & _
"group by qcpass "
else
' The final spaces are important
strSQL = strSQL & " union all " & _
"select '" & tbl.Name & "' as table, count(qcpass) as column " & _
"from [" & tbl.Name & "] " & _
"where rowDate between " & cDbl(d0) & " and " &cDbl(d1) & " " & _
"group by qcpass "
end if
i = i + 1
end if
next tbl
db.createQueryDef "qryYourOtherFinalQuery", strSQL
db.close
exit sub
私が使用する理由cDbl(d0)
は、アクセス日付は地域設定に敏感であり、それを扱うのに多くの頭痛の種を抱えていたからです. Access (および他の多くの Microsoft 製品) は、日付を浮動小数点数として格納します (整数部分が日付で、小数部分が時刻です)。
警告のもう 1 つの単語:日付に時間が含まれていない場合、between
条件は機能します。ただし、時間が含まれている場合は、where 条件を次のように変更することをお勧めします。
"where rowDate >= " & cDbl(d0) & " and rowDate < " & cDbl(d1 + 1)"