1

複数のテーブル (約 50) を持つ Access データベースから数えたいと思います。

「QCPASS」である各テーブルの 1 列からカウントする必要があります。これはチェック ボックスです。製品が合格した場合、ボックスがチェックされ、合格しなかった場合はチェックされ、合格しなかった場合はチェックされません。各テーブルの両方をカウントする必要があり、ユーザーはすべてのテーブルに存在する日付列から日付範囲を指定することもできます。

クエリでこれを試しましたが、クエリが日付範囲を選択、カウント、および実行できないと言われました。どんな VBA ヘルプも素晴らしいでしょう。

Excel へのエクスポートは素晴らしいことですが、どんな結果でも問題ありません。これは、各テーブルの成功と失敗の列をカウントする、私が作成したクエリです。クエリも反復できないため、VBA が適しているようです。

SELECT "Table1" , Count('qcpass') AS column 
FROM 5000028 
GROUP BY [5000028].qcpass
union 
SELECT "Table2",count('qcpass')
FROM 5000029 
Group By [5000029].qcpass;
4

1 に答える 1

2

データベース内のコレクション全体を走査し、TableDefsVBA を使用してクエリを作成できます。

警告:コレクション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 つのオプションがあります。

  1. プロシージャによって作成されたwhereすべての条件を含めますselect
  2. クエリに日付フィールドを含めてグループ化し、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)" 
于 2013-07-12T21:54:59.567 に答える