- ベストアンサー
Accessの自動計算のマクロについて
Access初心者のものです。 Accessで商品管理のデータベースを作成しています。 主なテーブルの内容は、 商品番号、商品名、仕入数、仕入単価、販売数、販売単価、などです。 そしてクエリで、 仕入数×仕入単価=仕入金額、販売数×販売単価=販売金額を作成し、 入力フォームのフィールドで仕入数、仕入単価を入れれば仕入金額が計算されるようにしています。 そこでですが、仕入金額の表示が仕入数、仕入単価を入れて仕入金額のフィールドにフォーカス移動したときに計算結果が表示されずレコードの移動して元に戻ると計算結果が表示されます。 結果的には計算結果は表示されるのですが、レコード移動ではなくフォーカス移動後に計算結果を表示させるには、どのようなマクロの設定をすればよろしいのでしょうか? マクロについてはあまり詳しくはない為、その点ご考慮くださいますよう宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
フォーカスが移動されてくるオブジェクトのイベントのフォーカス取得時にマクロを作ります。 仕入数、仕入単価が入力されているテキストの計算をマクロに書いてそれで終わりです。 マクロの値の代入を選択 アイテムに仕入れ金額の場所をセット 式に仕入数の場所かける仕入単価をセット これでいけるはずです
その他の回答 (3)
- O_cyan
- ベストアンサー率59% (745/1260)
通常はデータベースには演算された結果は保存しませんが。 仕入金額や販売金額などは入力フォーム上やレポート上で計算すれば良いので・・。 >仕入金額のフィールドにフォーカス移動したときに計算結果が表示されず・・ クエリを使ってテーブルに保存している場合はそうなります。 入力フォームの仕入金額のプロパティでコントロールソースに =[仕入数]*[仕入単価] とすればすぐ計算してくれます。しかしコントロールソースが演算式なのでテーブルには保存されません。 フォーム上で計算した値をテーブルに保存する方法は色々ありますが簡単なのはフォームの仕入単価のプロパティのイベントにある更新後処理にコードビルダで Private Sub 仕入単価_AfterUpdate() Me!仕入金額 = [仕入数]*[仕入単価] End Sub のようにすれば仕入単価を入力し他のコントロールに移動する際に仕入金額に計算した値を代入してくれます。(必ず仕入単価を入力しなくてはいけませんが) テーブルにも保存されます。 マクロ使う必要はありませんしクエリでテーブルに保存時に演算し保存する必要もなくこれが簡単。
お礼
O_cyanさん。ご回答ありがとうございます。 お礼の回答遅くなりまして失礼しました。 またの機会がありましたらよろしくお願いいたします。
ウーン! クエリを使わなければ宜しいかと・・・ [仕入金額].コントロールソース=[仕入数]*[仕入単価] [販売金額].コントロールソース=[販売数]*[販売単価] ・レコード移動後でないと[仕入金額]、[販売金額]が更新されないのは当然のことです。 ・レコード移動時にテーブルが更新されるからです。 ・[Shift]+[Enter]で強制的にレコードを更新して[F9]で再呼び込みすれば更新されるでしょう。 ・この手続きをコードで書けば宜しい訳ですが、そんな手間隙を掛けずに<コントロールソース>を設定した方が簡単です。
お礼
s_huskyさん。ご回答ありがとうございます。 お礼の回答遅くなりまして失礼しました。 またの機会がありましたらよろしくお願いいたします。
- nicotinism
- ベストアンサー率70% (1019/1452)
通常であればフォーカスが移動した直後に計算されるはず? Access2003では少し問題があるような事を見た覚えがありますが 何処でかは思い出せません。 フォームの基となっているクエリでは計算されますか? 対症療法的ですが フォームの仕入金額と販売金額のコントロールソースをそれぞれ = 仕入数 * 仕入単価 = 販売数 * 販売単価 に変更してみる。 あるいは、VBAになりますがコントロールソースは変更せずに 仕入数、仕入単価、販売数、販売単価の更新後処理に Me.Recalc としてみる。 例 Private 仕入数_AfterUpdate() Me.Recalc End Sub とかでしょうかね。
お礼
nicotinismさん。ご回答ありがとうございます。 お礼の回答遅くなりまして失礼しました。 またの機会がありましたらよろしくお願いいたします。
お礼
matui2000さん。ご回答ありがとうございます。 お礼の回答遅くなりまして失礼しました。 回答があった通りやってみましたらできました。 大変助かりました。答えてネットがとまりっぱなしだったので大変困ってました。 また機会がありましたらよろしくお願い致します。