- ベストアンサー
Accessサブフォームのフィルターと計算を一括で行う方法はありますか?
- Access2003でサブフォームにフィルターをかけてレコードを抽出し、計算結果を自動入力したいです。
- 具体的には、サブフォームのカレントレコードの西暦フィールドと同じ値が入っているレコードを抽出し、そのレコードの合計値をフォームフッターで算出します。
- しかし、フィルターと計算を一括で行おうとすると、計算の間に合わないためエラーが出ます。フィルターと計算を別々のプロシージャで順に実行することで正しく算出することができます。一括で処理する良い方法はありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DSumで集計する方法ですが、 > サブフォームのカレントレコードの[西暦]フィールドにある値と同じ値が入っているレコードを抽出。 これですが、どのようにしていますか。 Filterプロパティに抽出条件を設定してるのなら、それを利用できます。 DSum("原価","テーブル名",Me.Filter) で原価合計を求められます。 あるいは、 DSum("原価","テーブル名","西暦=" & Me.西暦) でもいいでしょう。 タイマーを使う場合は、 タイマー間隔 は 0 に設定しておいて、 タイマー時のイベントプロシージャは、 Private Sub Form_Timer() Me.TimerInterval = 0 2.の処理 End Sub で、1.の処理の最後で、タイマー間隔を設定します。 Private コマンド1_Click() 1.の処理 Me.TimerInterval = 500 End If
その他の回答 (2)
- chayamati
- ベストアンサー率41% (260/624)
メインフォームからサブフォームのボックスを参照することは出来ませんが サブフォームからマインフォームのボックスを参照できます。 サブフォームのイベントで Me.Parent!原価合計 = SUM(原価) Me.Parent!受注高合計 =SUM(受注高)
お礼
Me.Parent 初めて知りました。 子から親を参照する時に使うのですね。 今回はDsumで条件を指定して抽出・合計することで解決しました。 考えていただいてありがとうございます。 Me.parent、今後生かせそうです。
- hatena1989
- ベストアンサー率87% (378/433)
> 1.サブフォームにフィルターをかけてレコードを抽出 > (フォームフッターで合計値を計算するフィールドを用意しておく) > 2.その合計値を利用した計算結果をカレントレコードのフィールドに自動入力 これは私もはまったことがあります。 1.の後で Requery や Recalc をかけてみてもうまく行かなかったです。 最終的には、フォームフッターの合計値を参照するのをやめて、DSum関数で合計値を求めました。 フッターにあるのに別に集計するのは無駄のような気がしますが、しょうがないですね。 フッターを参照するなら、1. の実行後、タイマーイベントを使って時間をおいて、2.を実行するという方法もありますが、これもいまいちですね。
お礼
ご回答ありがとうございます! 同じ経験をされた方がいて嬉しいです。 Dsum関数に挑戦中ですが、フォームで抽出したレコードをDSumで合計するやり方がわかりません。 Dsum式の中で、テーブルから参照して抽出条件を設定しなおさないといけませんか? 例を教えていただけないでしょうか。 又はタイマーイベントの方法を教えてください。 sleep を使うと良いですか。 質問ばかりですいません。宜しくお願いします。
補足
sleep で3秒ほど処理を止めてみましたが、「0で除算しました」のエラーが出ました。
お礼
遅くなりました!本日、出勤して内容確認・実行しました。 教えていただいた通り、Dsum関数で条件を付けて抽出・合計することで、 一旦フィルターをかけて抽出するプログラムも、 フォームフッターで合計するテキストボックスも必要なくなり、 大変スッキリとしたプログラムができました。 実際には抽出条件が複数ありAndで繋げる際に、Andも" "で囲む事に気付かず苦戦して御礼が遅くなってしまいました。 = DSum("工事費", "T金額", "営業番号 ='" & Me.営業番号 & "'And 種別 ='" & Me.種別 & "'and 西暦 =" & Me.西暦) 妥協なく、しかもスッキリ気持ちの良い処理ができました。 本当にありがとうございます!感謝しています。