• ベストアンサー

クロス集計の値の表示

勉強不足のため悩んでいます。 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)を置き換えたいのですが、 どのようにすればよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.1

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

greenntea
質問者

お礼

ご回答ありがとうございます。 2.の方法で出来ました。 Dlookup関数について少し調べてみましたが、 処理は遅いようですね。今回はデータ量もたいしたことはないので ひとまずDlookupでいきます。 後々速度的な不満が出てきたら、上記のコードも参考にさせてもらおうと思います。 詳しい説明、ありがとうございました。

その他の回答 (1)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

クロス集計は関係なく レポートでの数値の表示をテキストにすればいいのですね >最低科目 科目1 科目2 科目3 のコントロールをコンボボックスに変え 値集合ソースにT_評価を指定し 連結列はID、表示するのは評価とすればOKです レポートでもコンボボックスは使用できます もちろんドロップダウンボタンは使用できませんけどね

greenntea
質問者

お礼

レポートでもコンボボックスが使えるとは気付きませんでした。 とてもいい事を教えていただきました。 >表示するのは評価とすればOKです ここで少しうまくいきませんでしたが、 列数2 列幅を0;2 で1列目のIDを消せて、希望通りに表示できました。 目からウロコでした。ありがとうございました。