Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Microsoft 365)
フィルターの結果をレポートのグラフに反映させたい
投稿日時: 23/08/18 11:24:13
投稿者: デイビーダック

いつもお世話になっております。
 
フォーム上でフィルターをかけた結果をレポート上のグラフに反映させる方法があれば教えてください。
グラフではないレポートでは下記の記述でうまくいくのですが、グラフのレポートでは抽出結果が反映されません。
 
rivate Sub 抽出結果_cmd_Click()
 
If Me.FilterOn = False Then
MsgBox "フィルターを実行してください"
Else
DoCmd.OpenReport "R_抽出結果", acPreview, , Me.Filter
End If
 
End Sub
 
何か良い方法はありませんでしょうか。
ご教授よろしくお願いします。

回答
投稿日時: 23/08/18 14:24:41
投稿者: sk

そのレポートのレコードソースと、レポートの詳細セクション上のグラフの値集合ソースが
どのフィールド同士でリンクするのか次第でしょう。

投稿日時: 23/09/06 17:22:39
投稿者: デイビーダック

説明が不足しておりました。
フォーム上としか記載していませんでしたが、今回のフォームは分割フォームでした。
  
分割フォーム上でフィルターをかけ、その結果をグラフに反映させるつもりでした。
得意先別の発注数をグラフです。
  
得意先でリンクましたが、1つのグラフに1社しか表示されないグラフになってしまいます。
  
分割フォームであることが関係しているのでしょうか?

回答
投稿日時: 23/09/07 11:20:46
投稿者: sk

引用:
DoCmd.OpenReport "R_抽出結果", acPreview, , Me.Filter

OpenReport メソッドの引数 WhereCondition の適用対象となるのは、
開こうとしているレポートのレコードソースです。
レポート上のグラフの値集合ソースに対しては直接的な影響を与えません。
 
レポートのレコードソースとグラフの値集合ソースが
特定のフィールド同士でリンクしている場合は、
レポートのレコード/詳細セクションごとに
グラフの値集合ソースのレコードが絞り込まれて
個々のグラフがプロットされます。
 
引用:
得意先でリンクましたが、1つのグラフに1社しか表示されないグラフになってしまいます。

この場合、レポートのあるレコードの[得意先]の値が "A" であるならば、
その詳細セクション上においてはグラフにプロットされるデータ範囲も
[得意先]の値が "A" であるレコードに絞り込まれます。
 
グラフにプロットされるデータの範囲をレコード/一定のグループごとに
切り替えたいのではなく、レポートの全てのレコードにおいて
同一のデータ範囲をプロットしたグラフを出力したい
(レポートのレコードソースとグラフの値集合ソースをリンクさせない)、
その上でグラフのデータ範囲の抽出条件をフォームフィルターと同一にしたい、
ということなのであれば、例えばグラフの値集合ソースである選択クエリの
SQL を書き換えてからレポートを開く、という操作に実行することが
解決策の 1 つとして挙げられます。

投稿日時: 23/09/07 17:07:19
投稿者: デイビーダック

お世話になっております。
詳細な説明ありがとうございます。
SQL等を利用しないと難しいんですね。
 
考え方を変えて、フィルターの結果を他のテーブルに保存することはできないでしょうか。
 
フィルターをかける⇒コマンドボタンを押す⇒T_グラフ用」テーブルの中身を削除して初期化する。⇒フィルターの抽出結果を「T_グラフ用」テーブルに追加する。⇒そのテーブルを基にしたグラフのレポートをプレビューする。
 
上記のような動きで再現することはできないでしょうか。

回答
投稿日時: 23/09/07 18:01:45
投稿者: sk

引用:
フィルターの結果を他のテーブルに保存する

引用:
T_グラフ用」テーブルの中身を削除して初期化する。
⇒フィルターの抽出結果を「T_グラフ用」テーブルに追加する。

そのフォームのレコードソースであるテーブル/クエリと
同一の構造を持つ(各フィールドの名前/データ型が
全て一致している)テーブルをあらかじめ定義しておく、
ということなのであれば一応可能です。
 
(フォームモジュール)
-----------------------------------------------------
Private Sub 抽出結果_cmd_Click()
 
    If Me.FilterOn = False Then
        MsgBox "フィルターを実行してください。", vbExclamation, "エラー"
        Exit Sub
    End If
     
    If Me.Dirty Then
        DoCmd.RunCommand acCmdSaveRecord
    End If
 
    Dim db As DAO.Database
    Dim strSQL As String
     
    Set db = CurrentDb
     
    strSQL = "DELETE * FROM [T_グラフ用]"
    db.Execute strSQL, dbFailOnError
     
    Dim rsSource As DAO.Recordset
    Dim rsDestination As DAO.Recordset
     
    Set rsSource = Me.RecordsetClone
    Set rsDestination = db.OpenRecordset("T_グラフ用", dbOpenDynaset)
     
    Dim fldSource As DAO.Field
    Dim fldDestination As DAO.Field
     
    Do Until rsSource.EOF
        rsDestination.AddNew
        For Each fldSource In rsSource.Fields
            Set fldDestination = rsDestination.Fields(fldSource.Name)
            fldDestination.Value = fldSource.Value
            Set fldDestination = Nothing
        Next
        rsDestination.Update
        rsSource.MoveNext
    Loop
     
    Set rsSource = Nothing
    Set rsDestination = Nothing
    Set db = Nothing
     
    DoCmd.OpenReport "R_抽出結果", acViewPreview, , Me.Filter
 
End Sub
-----------------------------------------------------
 

投稿日時: 23/09/08 15:33:40
投稿者: デイビーダック

SK様
 
お世話になっております。
完全に理想通りの動きで完成することができました。
本当にありがとうございました。