• ベストアンサー

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 ---------------------------

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

他の方が言われる通り、課題は多々あると思いますが、一つ一つクリアしていけばいいと思います。今回の質問の内容に的を絞って回答します。 金額1 はテキストボックスですよね?そう仮定して話を進めます。 >Private Function suuryoukeisan(kousyubangou As String, suuryou As String, tanka As String, kingaku As String, _ >F_suuryou, F_tanka, F_kingaku) F_suuryou, F_tanka, F_kingaku As TextBox) 関数の宣言部分で、F_kingaku の型宣言を省略しない。 又は、 >F_kingaku = IntA(Val(F_tanka) * Val(F_suuryou)) F_kingaku.Value = Int(Val(F_tanka) * Val(F_suuryou)) 代入のところで、代入するプロパティを省略しない。 これで、テキストボックス 金額1 に合計が入ると思います。 解説: F_kingaku = IntA(Val(F_tanka) * Val(F_suuryou)) この代入でやりたい事は、F_kingakuが参照しているテキストボックスの既定プロパティValueへ代入です。型宣言とプロパティを両方省略した場合、うまく行かないようです。 型宣言とプロパティを両方省略した場合、Variant型の変数 F_kingaku に合計が入ります。

その他の回答 (3)

noname#140971
noname#140971
回答No.3

<売上伝票> ID___得意策_ID 1____101 <売上明細> ID____売上伝票_ID___行番号___単価___数量 1______1__________________1___________\511___2 2______1__________________2___________\511___1 3______1__________________3___________\511___2 このようなデーブル構造とデータ登録になるのでしょう。 [イミディエイト] ? DBSum("単価 * 数量", "売上明細", "売上伝票_ID=1") 2555 ? Rounds(DBSum("単価 * 数量", "売上明細", "売上伝票_ID=1") * 0.05, 切り捨て) 127 [税抜売上合計]、[消費税額]列は、このように簡単に求められるので通常は必要ありません。 <メインフォームへの[税抜売上合計]、[消費税額]の更新は不可> さて、サブフォームが更新される都度にメインフォームを更新することは一般的に不可能です。 ですから、これらはサブフォームで自動計算させたらいいです。 これですと、サブフォーム=>メインフォームというフォーカスの移動が発生しません。 手法は、単にフッターにテキストボックスを配置して式を仕組むだけです。 複雑なマクロを組む必要はありません。 これは、現行の Excel 風のテーブル構造でも有効な手法です。 <No2さんのアドバイスと課題> 1、[売上明細]を8行で追加禁止にする方法の確立。 2、[売上明細]で3行入力して2行目が削除された場合の[行番号]のリナンバーするルーチンの確立。 多分、質問者は、1、2の手法が判らないので Excel風のテーブル設計にしたのでしょう。 ここが課題ですね。

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

コードの中身は見ていませんが >工種番号1_AfterUpdate >数量1_AfterUpdate() こんなのが1から8まであるのですか? これは質問以前の問題として、テーブルがデータベースのものになっていません メインとサブを関連付けるフィールドも見当たらないですね テーブルの見直しをされるほうが先でしょうね うまくいかない原因もその辺にあるように思われます 売上とその明細なら [売上メイン](売上ID、売上日、得意先名) 「売上明細](売上ID、工種番号、数量、単価) のようにするところじゃないですか

  • pouyo
  • ベストアンサー率28% (48/166)
回答No.1

全部検証する気力と時間がないのでざざっと書きます (別の方の回答をお待ちください) ファンクションsuuryoukeisanがおかしい気がしますが この関数自体は上手く機能していますか? 引数に kingaku と F_kingaku があって >F_kingaku = IntA(Val(F_tanka) * Val(F_suuryou)) >kingaku = F_kingaku と言うのはおかしいような気がするのですが・・・ 引数が変わる、というのはどういうことでしょうか?

関連するQ&A