• 締切済み
  • 困ってます

Accessでサブフォームの合計をメインフォームに

Access2007で開発しています。 メインフォームにサブフォームを貼り付けており、 サブフォームに入力した「数量」「単価」から「金額」を計算して表示し、 その合計金額をメインフォームのテキストボックス(非連結)に表示しようと しています。 サブフォームは行単位で追加、削除が可能です。 サブフォームの更新結果が正しくメインフォームに表示されずに困っています。 おわかりの方、おられましたらお教え頂きたく、よろしくお願い致します。 【サブフォーム】   ・レコードソース:T_明細   ・[詳細]項目:数量・・・レコードソース=T_明細・数量        単価・・・    〃    =T_明細・単価        金額・・・数量および単価のAfterUpdateで計算して表示。    [フォームフッター]項目:金額計・・・コントロールソース=Sum([金額])   ・Vbaコード:   Private Sub Form_AfterUpdate()   Forms![メインフォーム].合計計算   End Sub   Private Sub Form_Delete(Cancel As Integer)   Forms![メインフォーム].合計計算   End Sub 【メインフォーム】  ・テキストボックス:「合計金額」(非連結) Public Sub 合計計算()    Me.サブフォーム.Requery   方法1: Me!合計金額 =DSum("金額", "T_明細", (キー項目指定 記述省略))   方法2: Me!合計金額 = Me![サブフォーム].[Form].[金額計] End Sub ここで、 方法1の場合:数量、単価の変更入力及び行追加は正しく動作するが、          行削除の後、メインフォームの「合計金額」が再計算されず、変更前のまま。 方法2の場合:数量、単価の変更入力及び行追加すると、「合計金額」が”0”になる。          行削除しても「合計金額」は変わらず、変更前のまま。 どちらも、サブフォオームの「金額計」は正しく表示されています。 以上、よろしくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数7
  • 閲覧数6624
  • ありがとう数6

みんなの回答

  • 回答No.7

#6です > ご提案頂いた方法を試してみますね とのことなので、#5での注意点を。 サブフォームは帳票フォームで、レコードセレクタを使って、 「Delete」キーでレコードを削除する操作が前提になっています。 また、レコードセレクタで行を選択する際、「新規行は含まれない」ことが前提です。 新規行を含んだ選択された場合、記述を変更する必要があります。 それ用のコードも用意してましたが、必要であれば提示できます。 ※ でも、Form_Delete 以降が呼ばれないのは不思議ですね。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

大変お返事が遅くなり申し訳ありません。 お教え頂いた方法、クラスを作るやりかたおよび、「キーイベント取得」を”はい”にする方法とやってみました。 どちらも、サブフォームの行削除は正常にできるのですが、親フォームの合計金額は変わりませんでした。(親フォームの合計計算モジュールは、実行されます。) いろいろご指導いただき、本当にありがとうございました。

関連するQ&A

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

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

  • サブフォームの金額合計をメインフォームに表示させたい

    OS:XP ACCESS2003 フォームに金額の明細があるサブフォームを3つ貼り付けています。各サブフォームの金額の合計は、フッターに=Sum([金額])で表示されます。(金額入力毎に足されます) メインフォームの金額欄に、この3つの合計を金額が追加されたごとに出したいのですが、よくわかりません。 よろしくお願いします。

  • ACCESSでフォーム上のオブジェクトが引数に渡らない

    環境:XP&ACCESS2003 メインフォーム(下記A)に得意先名、全体の金額、消費税等、サブフォームに売上明細(工種番号、工種、数量、単価、金額) を持っています。 明細テーブルは、工種番号1~8、工種1~8、数量1~8、単価1~8、金額1~8までの フィールドを持っています。 マクロで、工種番号が変わった場合、数量が変わった場合、それぞれ金額を計算させていました。 マクロをVBに変換したところ、以下のようになります。(工種番号1_AfterUpdateの場合) With CodeContextObject DoCmd.RepaintObject acForm, "A" .Form.工種1 = DLookup("[工種]", "測量台帳", "Forms![A]![年度]=[年度] And Form.[工種番号1]=[工種番号] AND [Forms]![A]![ブロック]=[ブロック]") .Form.単価1 = DLookup("[単価]", "測量台帳", "Forms![A]![年度]=[年度] And Form.[工種番号1]=[工種番号] AND [Forms]![A]![ブロック]=[ブロック]") .Form.数量1 = 1 .Form.金額1 = Int(Form.単価5 * Val(Form.数量1)) [Forms]![A]![測量委託費] = [計] [Forms]![A]![消費税相当額] = IntA([計] * Val([Forms]![A]![消費税率] / 100)) End With Private Functionを作り、サブフォーム上のオブジェクトを数量1~8までが変更された時に、引数で渡してやり シンプルな作りにしようと以下の様に作成しましたが金額(=引数のkingaku)がうまく変わりません。 ご存知の方、よろしくお願いします。 -------------------------------同一フォーム上のPrivate Function Private Function suuryoukeisan(kousyubangou As String, suuryou As String, tanka As String, kingaku As String, _ F_suuryou, F_tanka, F_kingaku) With CodeContextObject DoCmd.RepaintObject acForm, "A" F_kingaku = IntA(Val(F_tanka) * Val(F_suuryou)) kingaku = F_kingaku [Forms]![A]![測量委託費] = 計 [Forms]![A]![消費税相当額] = Int(計 * Val([Forms]![A]![消費税率] / 100)) End With End Function ----------------------------数量1が変わった場合の処理 Private Sub 数量1_AfterUpdate() Call suuryoukeisan("工種番号1", "数量1", "単価1", "金額1", 数量1, 単価1, 金額1) End Sub ---------------------------

  • 回答No.6

#5です 記述の訂正を (時間が取れない場合は、放置してください) > ちなみに、 > Me.サブフォーム.Requery > を > Me.サブフォーム.From.Requery ★ ★部分 From ではなく Form でした Me.サブフォーム.Form.Requery

共感・感謝の気持ちを伝えよう!

質問者からのお礼

わざわざロジックを考えて下さいまして、ありがとうございます! 気づくのが遅くなりました。申し訳ありません。 ご提案頂いた方法を試してみますね。ただ、今は納期が迫っており、時間がとれませんので、もう少々お待ち下さい。 重ねて、ありがとうございました。

  • 回答No.5

#3です 解決された様でなによりです。 土日もがいていて、それなりに推測した結果のものになります。 お手数ですが、推測があっているかどうかだけでも教えていただけないでしょうか。 サブフォームは、帳票であることが前提となっています。 > (なお、今回の質問では単純化していますが、実際は、複雑な処理も行うため、またユーザインファーフェースのことも考慮して、VBAで作成しています。) と言う事なので、キー操作等統一する為に「クラス」を作って、そこで共通の処理を記述していないでしょうか。 また、親の関数先頭で行っている Me.サブフォーム.Requery は、行を移動しないで Requery したかったのでしょうか。 ちなみに、 Me.サブフォーム.Requery を Me.サブフォーム.From.Requery に変更すると、「3246の この操作は、トランザクションには実行できません」 のエラーになったと思います。(削除の処理中なので) クラスを作って、Form_Delete 時に自力削除(以降のイベントは起きない)例を以下 クラス「clsFrm」を新規挿入し、以下を記述します。 Option Compare Database Option Explicit Private Const EVENT_PROCEDURE As String = "[EVENT PROCEDURE]" Private WithEvents frm As Form Private iCount As Long Private bDel As Boolean Private Sub Class_Initialize()   Set frm = CodeContextObject   frm.OnDelete = EVENT_PROCEDURE   iCount = -1   bDel = False End Sub Private Sub Class_Terminate()   Set frm = Nothing End Sub Private Sub frm_Delete(Cancel As Integer)   Dim i As Long   DoCmd.CancelEvent   If (frm.SelHeight < 1) Then Exit Sub   If (iCount < 1) Then iCount = frm.SelHeight   If (iCount = frm.SelHeight) Then     bDel = MsgBox(frm.SelHeight & "件 削除しますか?" _         , vbQuestion + vbYesNo, "確認") = vbYes   End If   iCount = iCount - 1   If (iCount = 0) Then     If (bDel) Then       With frm.Recordset         For i = 1 To frm.SelHeight           .Delete           .MoveNext         Next       End With       frm.SelHeight = 0     End If     bDel = False   End If End Sub サブフォームに以下を記述します。 Dim frm As clsFrm ' ★ Private Sub Form_AfterDelConfirm(Status As Integer)   MsgBox "Form_AfterDelConfirm" End Sub Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)   MsgBox "Form_BeforeDelConfirm" End Sub Private Sub Form_Delete(Cancel As Integer)   MsgBox "Form_Delete"   Call Me.Parent.Req End Sub Private Sub Form_Load()   Set frm = New clsFrm ' ★ End Sub Private Sub Form_Close()   Set frm = Nothing ' ★ End Sub ★部分がクラスを使う宣言みたいなもの メインフォームに以下を記述します。 Public Sub Req()   Me.FSUB.Requery '  方法1 End Sub ※ FSUB はサブフォームコントロール名 この記述で Form_Delete しか呼ばれないものは作れました。 (細かいタイミングまではみてません。動いたっぽいレベル) (サブフォーム Form_Delete の Cancel は意味を持たなくなります) このようになっていると、Form_Delete のタイミングは使えないので、 クラスに制御を渡さないで、 サブフォームで「キーイベント取得」を「はい」として、例えば、 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   Dim i As Long   Select Case KeyCode     Case vbKeyDelete       If (Me.SelHeight < 1) Then Exit Sub       KeyCode = 0       If (MsgBox(Me.SelHeight & "件 削除しますか?" _           , vbQuestion + vbYesNo, "確認") = vbYes) Then         With Me.Recordset           For i = 1 To Me.SelHeight             .Delete             .MoveNext           Next         End With         Me.SelHeight = 0         Call 親の関数       End If   End Select End Sub とすればやりたいことはできそうです。 (この場合 Form_Delete は呼ばれません) 親の関数では、方法1の方が良さそうです。 ただ、処理を統一したいクラスを使わなくなるので、良いのか悪いのか。 クラス内では、キーイベント取得はやってないような気が(私の知識不足かも) なぜなら、Form_Delete は Private で呼ばれているので、 クラスから Private を呼び出せなかったような・・・ 以上、よろしくお願いいたします。

共感・感謝の気持ちを伝えよう!

  • 回答No.4

間違ってメインフォームに記述しているとか。。。。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 なるほど、ありそうですね。でもそれはありません。

質問者からの補足

解決しました。 Form_Deleteイベントは、 「レコードが実際に削除される前に発生するもので、この時点ではまだ削除はされていません。」 ということなので、Form_Deleteで、(サブフォームの合計金額-削除しようとしている行の金額)を計算して、メインフォームに表示する方法で解決しました。 いろいろ考えて下さってありがとうございました。

  • 回答No.3

#1です タイミング的には #2 さんの通りだと思います。 提示した参照先の画像にあるフォームに MsgBox を組み込んでみたところ、 言われているような結果にはならず、順に呼ばれました。 私はお手上げです。 簡単なメイン/サブ構成のフォームを作成し、各イベントで MsgBox のみを記述され、 確認されてはいかがでしょうか。 失礼しました。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

再度の回答、ありがとうございます。 そうですね、一度やってみます。

質問者からの補足

解決しました。 教えて頂いたことがヒントになりました。 おっしゃる通りForm_Deleteイベントは、 「レコードが実際に削除される前に発生するもので、この時点ではまだ削除はされていません。」 ということなので、Form_Deleteで、(サブフォームの合計金額-削除しようとしている行の金額)を計算して、メインフォームに表示する方法で解決しました。 いろいろ考えて下さってありがとうございました。

  • 回答No.2

このイベントで確認したらどうでしょう。 --- Private Sub Form_AfterDelConfirm(Status As Integer) If (Status = acDeleteOK) Then Forms![メインフォーム].合計計算 End If End Sub

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速回答いただき、ありがとうございます。 実は、いろいろ試行錯誤をしていまして、下記のロジックの場合、 Private Sub Form_AfterUpdate() MsgBox "Form_AfterUpdate" Forms![メインフォーム].合計計算 End Sub Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer) MsgBox "Form_BeforeDelConfirm" End Sub Private Sub Form_Delete(Cancel As Integer) MsgBox "Form_Delete" End Sub Private Sub Form_AfterDelConfirm(Status As Integer) MsgBox "Form_AfterDelConfirm" If (Status = acDeleteOK) Then Forms![メインフォーム].合計計算 End If End Sub 表示されるMsgboxは、"Form_Delete"のみでした。 他のイベントが発生しない理由がわからず、困っています。 他の案があれば、どうかご提案下さい。

  • 回答No.1

VBA は必要無いような気がします。 過去 QA で、解決されていませんが近い構成だと思います。 access2010のフォーム上で計算したいです http://okwave.jp/qa/q7079470.html VBA でやる場合、イベントの発生タイミングを確認されたらと思います。 削除の操作を行うと、 Form_Delete / (Form_Current) / Form_BeforeDelConfirm / Form_AfterDelConfirm のイベントが順に発生したと思います。 何もしないと、「削除しますか?」のAccessからのメッセージは、 Form_BeforeDelConfirm 後に表示されたと思います。 なので、Form_Delete 時に合計金額を求めても元のままだと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速回答いただき、ありがとうございます。 Form_BeforeDelConfirm、Form_Delete、Form_AfterDelConfirm のそれぞれに Msgbox をつけて実行したところ、 行削除をしたタイミングで発生するイベントは Form_Delete のみでした。 ここで合計金額を求められないとすれば、タイミングがないですよね。 行削除を、別の方法で行うしかないのでしょうか。 他の提案があれば、ご教示いただきたく、よろしくお願いします。 (なお、今回の質問では単純化していますが、実際は、複雑な処理も行うため、またユーザインファーフェースのことも考慮して、VBAで作成しています。)

関連するQ&A

  • access2010のフォーム上で計算したいです

    access2010 初心者です。 メインフォーム上に総合計を計算したいのですがどうしたらいいのか困ってます。 ***サブフォーム(テーブル1から表示しました)*** ・商品名(テーブル1から表示) ・金額(dlookupを使って「商品一覧表」から金額を表示しました) ・数量(テーブル1から表示) ・合計金額(コントロールリボンでテキストボックスを作り「金額」*「数量」で表示してあります) *********************** メインフォームに、サブフォームの「合計金額」の様にテキストボックスで、サブフォームの「合計金額」の『総合計』を表示したいです。 総合計がある一定の金額になるように、サブフォームの「数量」を決めて行きたいのです。だから、一定金額から『総合計』を引いて残金も表示したいのですが、『総合計』の求め方がわからなくて困っています。 総合計や合計金額はデータとしてテーブルには残らなくてもOKです。 初心者なので、できればわかりやすく簡単な方法がうれしいです うまく伝えれなくて不明な点があるかと思いますが、なにとぞお願いします

  • ACCESSのサブフォームからメインフォームへの移動

    お世話になります。 仕訳伝票の入力画面を作成しています。 仕訳登録フォームに サブフォームを2つあります。 うまく説明できないのでコーディングを記入しておきます。 これで仕訳登録フォームから仕訳登録サブ借方フォーム 仕訳登録サブ借方フォームから仕訳登録サブ貸方フォームへはカーソルが移動しますが 仕訳登録サブ貸方フォームから仕訳登録フォームへは移動してくれません マウスを使わずイベントで移動する方法はありますか メインフォーム 仕訳登録 Private Sub 目的_LostFocus() DoCmd.GoToControl "仕訳登録サブ借方" End Sub サブフォーム1 仕訳登録サブ借方 Private Sub 借方合計_Click() Forms!仕訳登録!借 = 合計 DoCmd.GoToControl "仕訳登録サブ貸方" End Sub サブフォーム2 仕訳登録サブ貸方 Private Sub 貸方合計_Click() Forms!仕訳登録!貸 = 合計 DoCmd.GoToControl "仕訳登録" End Sub 「カレントレコードに'仕訳登録'というフィールドはありません」とメッセージにになりますので Private Sub 貸方合計_Click() Forms!仕訳登録!貸 = 合計 DoCmd.GoToControl "Forms!仕訳登録!貸" End Sub 「カレントレコードに'Forms!仕訳登録!貸'というフィールドはありません」 とエラーメッセージになります。

  • Access2003 合計値の求め方について

    Acdess超初心者です。ご存知の方がいらっしゃいましたらお教え下さい。 Access2003で請求書を作成しております。 メインテーブル 宛名、敬称、発行日、請求番号、件名、課税区分、小計、消費税、合計 サブテーブル  請求番号、項番、工事名、数量、単価 サブテーブルを基に作成したクエリ 請求番号、項番、工事名、数量、単価、金額 メインテーブルの請求番号とサブテーブルの請求番号は1対多のリレーションを組んでいます。 メインテーブルとクエリを基にフォームを作成して、メインフォーム(レコードソースはメインテーブル) 上にサブフォーム(レコードソースはクエリ)を配置しています。 サブテーブルの金額の合計をメインフォーム上の「小計」で求めたいのですが、方法が分かりません。 どのように作成するとメインフォーム上の「小計」でサブフォームの金額合計を求めることができるか お教え下さい。 初歩的な質問で申し訳ありませんが何卒よろしくお願い致します。

  • サブフォームからメインフォームの絞込をしたい

    サブフォームの項目からメインフォームの絞込をおこないたいのですが、うまくいきません やりたいこととデータベースの状況は以下のとおりです メインフォームに「会社名」があり、サブフォームにその会社の「ブランド名」(一社に対し複数存在する)とその「業種」(1つのブランドにつき1つ)がある。 メインフォーム----会社名(テキスト) サブフォーム--ブランド名(テキスト)----業種(コンボボックス) 【やりたい事】 サブフォームにある業種をメインフォーム上のフィルタ用コンボボックスで選択し、選択した 業種を持つ会社名のみ表示したい(たとえばケーキを扱うA社とD社、Z社のみメインフォームで表示するようにする) 【コード】 現在以下のようなコードを作成しています。 テキスト欄に「業種」を打ち込み、コマンドボタンを押して絞り込む ※本当はコンボボックスで選択したいのですが・・・ Private Sub コマンドボタン名_Click() Me![サブフォームのパーツ名].Form.Filter = "[コンボボタン-業種] Like '*" & Me.テキスト欄 & "*'" Me![サブフォームのパーツ名].Form.FilterOn = True Exit_コマンドボタン名_Click: Exit Sub End Sub 作成しましたが、レコードを移動するたびにパラメータ入力のポップアップがでてきます フィルターもかからず、絞込が全くできていません どなたか詳しい方ご教授よろしくお願いいたします

  • ACCESSで条件によってサブフォームを非表示に

    Accessの初心者です。よろしくお願いします。 Accessで住所録を作っています。 メインフォームは主に本人のデータを表示し、サブフォームで家族の データを表示するようにしました。 その時、家族がいない人についてはサブフォーム自体を表示しないようにしたいと思います。 そこで下記のようにしましたがうまくいきませんでした。 (1)サブフォーム内で家族の人数をカウントする。 (2)このカウント結果をメインフォームに表示する。(メインフォーム にテキストボックスを配置し、コントロールソースをサブフォームの 人数カウントにする。)     ここまではうまくいきました。 (3)ここでメインフォームのイベントの「開くとき」に以下のように記 述しました。(メインフォームのテキストボックスにカウントという  名前をつけました。) Private Sub Form_Open(Cancel As Integer) If Me!カウント = 0 Then サブフォーム.Visible = False Else サブフォーム.Visible = True End If End Sub この記述の仕方がまずいと思うのですが、どのようにすればよいか 分りません。よろしくお願いします。

  • サブフォームのデータをメインフォームへ

    お世話になります。 ひとつお聞きしたいのですが、サブフォームのデータをメインフォームに表示させる方法ってないのでしょうか? データシートのサブフォームで計算させた合計の値を、メインフォームにもテキストボックスを表示させたいと思っています。 できるかどうかわかりませんが、何かいい方法がございましたら、よろしくお願いいたします。

  • accessフォームでサブフォームの合計値が出てこない

    注文書を作っています。 サブフォーム中で各項目の金額を表示させます。 これらの金額を名前"金額計"で=Sum([金額])で計算しました。 この値は,サブフォーム単独で開いた時には間違い無く表示されます。 しかし,このサブフォームを使ったフォームで,この"金額計"が#Name?となり,なんとも表示できませんでした。 金額計表示の為のコントロールソースは,=[Forms]![サブフォーム]![金額計]としたり,=[サブフォーム].[Forms]![金額計]としたりしているのですが。 何かケアレスミスでもしているのでしょうか。 データの型等は双方で合せて間違いは無いと思うのですが。 些細な事でも結構なのでよろしくお願いします。

  • Accessでサブフォームの合計をメインフォームに表示・保存したい。

    あまりに初心者なので、用語などをわかっておらず、理解しづらい部分がありましたら、申し訳ございません。 アクセス2002を使用しています。 Aという顧客情報をメインフォームで作り、サブフォームに購入した商品情報を入れています。 この商品の金額の合計を出し、メインフォームに表示・保存させたいのです。 どうのように作成すればよいのでしょうか。

  • access サブフォーム間の連動について

    Access2013について メイン親単票フォーム上に連動する二つのサブフォームを配置させました。 内一つは帳票、もう一つは単票にし、帳票からレコードを選択するとデータ詳細が単票側が連動するまで至りましたが、ここでサブフォーム帳票を並べ替えや抽出を実行すると、サブフォーム間の連動が出来なくなり、解決に困っております。 解決方法をご存知の方、お力添え願います。 親フォームに VBA Private Sub Form_Open(Cancel As Integer) Set Me.SubForm2.Form.Recordset = Me.SubForm1.Form.Recordset End Sub 抽出方法としては帳票サブフォーム上からとメインフォーム上からの実行までを試しておりますが、いずれも抽出後にサブフォーム間の連動が出来なくなってしまう状況です。 お力添え、宜しくお願いいたします。

  • Accessのフォームでの合計欄を二つにわけたい

    テーブル1;売上明細T フィールド名;売上明細番号、商品コード、数量、摘要 テーブル2;商品T フィールド名;商品コード、商品名、単価 クエリで売上明細と商品Tをつなぎ、下記のように表示します。 商品コード 商品名 摘要  数量  単価 明細計                  (数量*販売単価) 001    物件1  作業代  1  500 500 002    物件2  作業代  2  400 800 051    物件51  作業代  1  500 500 051    物件51  交通費  1  350 350  上記クエリを元にフォームを作成(帳票形式)して、 テキストボックスで課税対象計(作業代計)と、非課税対象計(交通費計) のボックスをもちたいのですが可能でしょうか? 最終的には、売上伝票フォームに売上明細フォームをサブフォームで 取り込み、売上伝票上で合計金額を表示させたいと思っています。 よろしくお願いします。