- ベストアンサー
クロス集計の値の表示
勉強不足のため悩んでいます。 accessにて、下記のようなテーブルとクロス集計を行ったクエリがあるとします。 T_評価 ID 評価 1 優 2 良 3 可 4 不可 Q_クロス集計 氏名 最低科目 科目1 科目2 科目3 AAA 3 2 1 3 BBB 4 3 4 3 CCC 2 1 2 2 このQ_クロス集計クエリをレポートにて出力させたいのですが、 T_評価テーブルを用いて、 氏名 最低科目 科目1 科目2 科目3 AAA 可 良 優 可 BBB 不可 可 不可 可 CCC 良 優 良 良 このようにクロス集計の値(ID)を置き換えたいのですが、 どのようにすればよいのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
1、クロス集計2を作る。(非推奨) 氏名__最低科目__科目1__科目2__科目3__評価.評価__評価_1.評価__評価_2.評価__評価_3.評価 AAA_____________3_________2________1________3_____________可_______________良_______________優_______________可 BBB_____________4_________3________4________2__________不可_______________可____________不可_______________良 CCC____________2_________1_________2_______2______________良_______________優_______________良_______________良 SELECT 集計.*, 評価.評価, 評価_1.評価, 評価_2.評価, 評価_3.評価 FROM ((評価 AS 評価_1 INNER JOIN (評価 INNER JOIN 集計 ON 評価.ID = 集計.最低科目) ON 評価_1.ID = 集計.科目1) INNER JOIN 評価 AS 評価_2 ON 集計.科目2 = 評価_2.ID) INNER JOIN 評価 AS 評価_3 ON 集計.科目3 = 評価_3.ID; この場合、レポートの作成要領は説明するまでもないと思います。 2、レポートの詳細_Format で表示する。(推奨) 表示用の[最低科目_評価]を配置し[最低科目]は隠す。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) Me.最低科目_評価 = DBLookup("評価", "評価", "ID=" & Me.最低科目) Me.科目1_評価 = DBLookup("評価", "評価", "ID=" & Me.科目1) Me.科目2_評価 = DBLookup("評価", "評価", "ID=" & Me.科目2) Me.科目3_評価 = DBLookup("評価", "評価", "ID=" & Me.科目3) End Sub ************************************************************************* 科目3_評価.コントロールソース=DBLookup("評価","評価","ID=" & [科目3]) ************************************************************************* と、レポートのデザインでコントロールソースに仕組んでも構いません。 なお、Access の DLookup関数は使わない方がいいです。 自分で関数を用意した方が、はるかに高速で動作します。 Public Function DBLookup(ByVal strField As String, _ ByVal strTable As String, _ Optional ByVal strWhere As String = "", _ Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup Dim DataValue Dim strQuerySQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset strQuerySQL = "SELECT " & strField & " FROM " & strTable If Len(strWhere) > 0 Then strQuerySQL = strQuerySQL & " WHERE " & strWhere End If With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst DataValue = .Fields(0) End If End With Exit_DBLookup: On Error Resume Next rst.Close Set rst = Nothing DBLookup = Nz(DataValue, ReturnValue) Exit Function Err_DBLookup: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBLookup End Function
その他の回答 (1)
- CHRONOS_0
- ベストアンサー率54% (457/838)
クロス集計は関係なく レポートでの数値の表示をテキストにすればいいのですね >最低科目 科目1 科目2 科目3 のコントロールをコンボボックスに変え 値集合ソースにT_評価を指定し 連結列はID、表示するのは評価とすればOKです レポートでもコンボボックスは使用できます もちろんドロップダウンボタンは使用できませんけどね
お礼
レポートでもコンボボックスが使えるとは気付きませんでした。 とてもいい事を教えていただきました。 >表示するのは評価とすればOKです ここで少しうまくいきませんでしたが、 列数2 列幅を0;2 で1列目のIDを消せて、希望通りに表示できました。 目からウロコでした。ありがとうございました。
お礼
ご回答ありがとうございます。 2.の方法で出来ました。 Dlookup関数について少し調べてみましたが、 処理は遅いようですね。今回はデータ量もたいしたことはないので ひとまずDlookupでいきます。 後々速度的な不満が出てきたら、上記のコードも参考にさせてもらおうと思います。 詳しい説明、ありがとうございました。