Accessサブフォームのフィルターと計算を一括で行う方法はありますか?

このQ&Aのポイント
  • Access2003でサブフォームにフィルターをかけてレコードを抽出し、計算結果を自動入力したいです。
  • 具体的には、サブフォームのカレントレコードの西暦フィールドと同じ値が入っているレコードを抽出し、そのレコードの合計値をフォームフッターで算出します。
  • しかし、フィルターと計算を一括で行おうとすると、計算の間に合わないためエラーが出ます。フィルターと計算を別々のプロシージャで順に実行することで正しく算出することができます。一括で処理する良い方法はありますか?
回答を見る
  • ベストアンサー

Access サブフォームにフィルター後、計算

Access2003です。 1.サブフォームにフィルターをかけてレコードを抽出  (フォームフッターで合計値を計算するフィールドを用意しておく) 2.その合計値を利用した計算結果をカレントレコードのフィールドに自動入力 これを1つのプロシージャで行いたいのですが、うまくいきません。 1と2を分けるとうまくいきます。何か方法はありますでしょうか。 具体的に… サブフォームのカレントレコードの[西暦]フィールドにある値と同じ値が入っているレコードを抽出。 抽出されたレコードの合計をフォームフッターで算出。([原価合計][受注高合計]) [カレントレコードの売上高]=[(カレントレコードの)原価]/[原価合計]*[受注高合計] ※全体の原価に占めるカレントレコード原価の割合で、売上高を算出します。 これを一括処理しようとすると、フィルター後の[原価合計][受注合計]の算出が間に合わないのか、「0で除算しました」とエラーが出ます。 フィルターをかけるのと、売上高を求めるのを別々のプロシージャに分けて順に実行するとちゃんと算出できます。 一括でやりたいのですが、良い方法はありますか? 宜しくお願いします。 ※前回もAccessの質問をさせていただきましたが、お礼を入力する前にベストアンサーを決定してしまったため、お礼ができませんでした。回答者の皆さんその節はありがとうございました!

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

  • ベストアンサー
回答No.2

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

tomoneel
質問者

お礼

遅くなりました!本日、出勤して内容確認・実行しました。 教えていただいた通り、Dsum関数で条件を付けて抽出・合計することで、 一旦フィルターをかけて抽出するプログラムも、 フォームフッターで合計するテキストボックスも必要なくなり、 大変スッキリとしたプログラムができました。 実際には抽出条件が複数ありAndで繋げる際に、Andも" "で囲む事に気付かず苦戦して御礼が遅くなってしまいました。 = DSum("工事費", "T金額", "営業番号 ='" & Me.営業番号 & "'And 種別 ='" & Me.種別 & "'and 西暦 =" & Me.西暦) 妥協なく、しかもスッキリ気持ちの良い処理ができました。 本当にありがとうございます!感謝しています。

その他の回答 (2)

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.3

メインフォームからサブフォームのボックスを参照することは出来ませんが サブフォームからマインフォームのボックスを参照できます。 サブフォームのイベントで Me.Parent!原価合計 = SUM(原価) Me.Parent!受注高合計 =SUM(受注高)

tomoneel
質問者

お礼

Me.Parent 初めて知りました。 子から親を参照する時に使うのですね。 今回はDsumで条件を指定して抽出・合計することで解決しました。 考えていただいてありがとうございます。 Me.parent、今後生かせそうです。

回答No.1

> 1.サブフォームにフィルターをかけてレコードを抽出 >  (フォームフッターで合計値を計算するフィールドを用意しておく) > 2.その合計値を利用した計算結果をカレントレコードのフィールドに自動入力 これは私もはまったことがあります。 1.の後で Requery や Recalc をかけてみてもうまく行かなかったです。 最終的には、フォームフッターの合計値を参照するのをやめて、DSum関数で合計値を求めました。 フッターにあるのに別に集計するのは無駄のような気がしますが、しょうがないですね。 フッターを参照するなら、1. の実行後、タイマーイベントを使って時間をおいて、2.を実行するという方法もありますが、これもいまいちですね。

tomoneel
質問者

お礼

ご回答ありがとうございます! 同じ経験をされた方がいて嬉しいです。 Dsum関数に挑戦中ですが、フォームで抽出したレコードをDSumで合計するやり方がわかりません。 Dsum式の中で、テーブルから参照して抽出条件を設定しなおさないといけませんか? 例を教えていただけないでしょうか。 又はタイマーイベントの方法を教えてください。 sleep を使うと良いですか。 質問ばかりですいません。宜しくお願いします。

tomoneel
質問者

補足

sleep で3秒ほど処理を止めてみましたが、「0で除算しました」のエラーが出ました。

関連するQ&A

  • サブフォームにフィルタをかけたい

    サブフォームにフィルタをかけたいのですが エラーになってしまいます。 下記がエラー内容です。 ---------------------------------------------------------- 実行時エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ---------------------------------------------------------- 細かい概要は テーブル1にフィールドがあり、 レコードには「あああ」と入力されています。 テーブル1がレコードソースとされている「フォーム(2)」をサブフォームとして 親フォーム(フォーム名:フォーム(1))に乗せました。 フォーム(1)を開いた時にフォーム(2)にフィルタをかけたいのですが うまくいきません。 オブジェクト名にカッコを付けているため、 Form_フォーム・・・・ というコードは書けないので ---------------------------------------------------------- Private Sub Form_Open(Cancel As Integer) Forms("フォーム(1)").Controls("フォーム(2)").Form.Filter = "フィールド = '" & "*あ*" & "'" Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True End Sub ---------------------------------------------------------- としています。 Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True でエラーになりますが、 この行をなくしたら、フィルタがかかりません。 どうすればサブフォームにフィルタをかける事が出来るのでしょうか? ご教示よろしくお願い致します。

  • Accessのサブフォームの累計について

    とても初歩的な質問で申し訳ありませんが、誰か教えて下さい。 売上メインフォームの中に 「Aの商品のサブフォーム」 「Bの商品のサブフォーム」 「Cの商品のサブフォーム」 「Dの商品のサブフォーム」 と作ってあります。 各小計はメインフォーム内に出しております。 メインフォームの累計をフォームフッターに出すのですが、A~Dの商品の売上が無い場合(小計が出ない場合) フォームフッターの累計に合計が反映しません。 どのような式を入れれば、良いのでしょうか? どなたか教えて下さい。

  • ★Access★2つのサブフォームの計算

    受注管理として、注文書の作成入力をしています。 『メインフォーム』で、顧客先などを入力し、『サブフォームA』で受注明細を入力しています。そして受注種類が2つあるので、フィールドの違う受注明細の『サブフォームB』もあるんです。各サブフォームには数量・単価・金額が入っています。 『サブフォームA』『サブフォームB』の両方に注文がある場合は、各サブフォームの合計(=[Form]!サブフォームA!金額合計)を出し、その合計同士を足して総合計金額(A+B)が『メインフォーム』にちゃんと表示されます。しかし、『サブフォームA』にだけ注文がある場合、『A』合計は表示されますが、『B』合計が空欄になってしまって、A+Bの合計が計算されないのです。さらにレポート印刷もできないのです。 どうすればいいのでしょうか?合計プロパティの既定値を0にしてもだめなんです。誰か教えて下さい。

  • Accessのサブフォームからフォームフィルタを使ってメインフォームも含めたレコードの抽出が出来ないのは何故でしょうか?

    フォームフィルタを利用してサブフォームに入力されている値でレコードの抽出を行いたいのですが、うまくできません。 メインフォームが持っているレコード全てを持ってきます。 メインフォームに含まれているデータが100件なら、それ全てを表示してしまうということです。 私が抽出したいレコードは2件だけです。 メインフォームからフォームフィルタを利用して抽出すると正しい結果が得られます。 これはどうしてでしょうか? サブフォームへの設定が何か足りないのでしょうか? 親・子のフォームのテーブルは同一のものです。 カテゴリーで親と子にフォームを分けました。 親にはクエリはなくて、リレーションシップしたテーブル数種から直接フォームにひっぱってあります。 子は一つのテーブルからクエリを作って、そのクエリからフォームに引っ張っています。 Access2003です。 どなたかご教示いただきますようお願いいたします。

  • ACCESS サブフォームのフィールドにカーソルをあてる

    ACCESS2003で、VBAで簡単なプログラムを作っています。 <やっていること> ・フォームAからフォームBを開きます。 ・そのときにフォームAの番号と一致するデータをフォームBに表示します。 ・フォームBにはサブフォームCが埋め込んでいます。 このサブフォームCの中のフィールドDにカーソルが入っているようにしたいのですが、 Forms!サブフォームC!フィールドD.setfocus としたら、「カレントレコードには、フィールドDという名前のフィールドはありません」というエラーがでます。 フィールドDというフィールドは存在しています。 このような場合、どのように記述するのがよろしいのでしょうか。 よろしくお願いします。

  • Accessのサブフォームについて

    メインフォームとサブフォームのあるフォームを作成しました。メインフォームを入力してから、サブフォームを入力し、次のレコードへ移動するのにメインフォームの移動ボタンを押すと、次のレコードのカーソルがサブフォームのフィールドへ移動します。メインフォームに移動する方法はありませんか?

  • アクセスのレコードが計算されない・・・・

    windows2000/Access2000 レンタカーというテーブルがあって、そこから売上年が2003年、売上月が2月のデーターをフォームフィルタで検索かけてレコードを抽出し、エクセルにOfficelinksを使って出力しました。 SUMを使って請求書計の合計を計算させようとしましたが、計算されず0になってしまいます。 フォームフィルターなど検索かけずに全てレコードを出力した場合は計算されるのですが・・・? フィルターを使って検索抽出したデーターはエクセルに出力して計算させる事って出来ないのでしょうか?

  • ACCESSのサブフォーム教えてください☆

    お世話になっております。 メインフォームではなくサブフォームの抽出方法で、コンボボックスでサブフォームのフィールド(例えば、商品名)を選択後、テキストボックスで文字列(例えば、ソフトクリーム)を指定して検索する方法です。メインフォームでのやり方は調べて(VBA)分かったのですがサブフォームは試行錯誤してやってみたのですがうまくいきません。 すみませんが、宜しくお願いします。

  • サブフォームの条件について(アクセス2003)

    アクセス2003で入力フォームを作成しています。入力フォーム上には、売上日「2009/07/30」とその詳細を入力します。このフォーム上にサブフォームの過去6回分の売り上げデータも表示します。ここで、このサブフォーム上に同じ売り上げ日「2009/07/30」が表示されるのですが、この日の分は2重表示になるので省きたいと考えています。クエリの条件のところで、売上日:<Date()としてとりあえず、今日入力して今日のうちに印刷すれば、サブフォーム上は「7/30」分は表示されないのですが、これが明日「7/31」になると入力フォームの売上日は「7/30」でサブフォーム上の売上日も「7/31」より前の「7/30」なので両方表示されてしまいます。当日中に印刷までしてしまえばよいといわれればそれまでなのですが、それでは不便です。フィルタの非選択フィルタを使おうとも思ったのですが、いろいろな人が入力操作するので、なるべく簡単にできたらと思います。 どなたかよい方法を教えてくださいませんか?よろしくお願いいたします。

  • サブフォームに同一の納品日を自動的に入力したい

    XP&ACCESS2003: メインフォーム/サブフォーム形式のフォームで、受注番号で連結しています。 メインフォームが受注、サブフォームが受注明細です。(1対多) メインフォームには「次のレコード」に進むボタンをつけ、クリックにより次のレコードが表示されます。(従って、サブフォームも次の受注の明細に移動します) 複数のレコードを持つサブフォームの納品日(受注明細の納品日フィールドに連結)の最初の一件に日付を入力し、メインフォームの「次のレコード」に進むボタンをクリックした時、1件前の受注明細の納品日を入力していない他の(2件目以降)のレコードにも同一の納品日を自動的に入力できる方法がわかりません。よろしくお願いします。

専門家に質問してみよう