プロが教えるわが家の防犯対策術!

Access97で受注管理のデータベースを設計中です。
フォームのテキストボックス[税込金額]のコントロールソースに
=Int([税抜金額]*[消費税率]*0.01+[税抜金額])
という式を入れました。
はたと気がついたら、基になるテーブルの[税込金額]には当然
(コントロールソースじゃなくなってしまったから)そこで
計算された値は更新されません。
テーブルにその値を更新したいのですが、そのためにはどのように
すればよろしいでしょうか?

基になるテーブルに[税抜金額][消費税率][税込金額]という項目が
あります。で、フォームを使用して入力時に税抜き金額を入力し、
消費税率を入力すると税込金額が小数点切り捨てで自動で入力される
という風に組めればフォームの中で計算できなくてもフォームで値が
表示されればかまいません。

要領を得ない質問でスミマセン。お手数ですが教えてください。

A 回答 (6件)

税込金額はデータベースの項目にしなければいけませんか?


税込み金額みたいに計算で求められる物はデータベースの項目に持たず
クエリーで追加するようにすれば例えば税率などが変わっても
クエリーを使用する時に再計算する為に基準値を変えればOKです

クエリーの使い方を勉強しましょう。
頑張って下さい

参考URL:http://www.people.or.jp/~Niki/, http://www.people.or.jp/~Niki/,

この回答への補足

本当はポイントをK_ebaさんにもにお入れしたいのですが、お二人を
選ばなければとのことですので、今回はyoishoさん、maruru01さんに
入れさせていただきたいと思います。

ご紹介いただいたサイトや本でもっとお勉強します。
本当にありがとうございました。

補足日時:2002/02/07 17:14
    • good
    • 0
この回答へのお礼

早速のお返事ありがとうございました。
実は基になるテーブルを使用して他のフォームでサブフォームを
作ったり、クエリーで計算したりしているのでテーブルに入力される
必要があるんです。また、Excelに書き出して受注表なんかも
作っていますので‥。
スミマセン。
はじめはクエリーで計算させて‥って考えたんですけど、税込金額を
クエリーで計算して作ったものを使用すると月締めの計算をする
クエリーを作ると「複雑すぎるから計算できないよ!」と文句を言ってきたり、
フォームにもコントロールが増えすぎてしまい、仕方なくフォーム内に
計算式を入れたらテーブルに当然反映しない‥はぁぁぁ。
できれば更新後処理とかで何とかならないかなぁと悩んでいます。

お礼日時:2002/02/06 18:01

こんにちは。

maruru01です。

テキストボックスのコントロールソースは元のまま([税込金額])にして、
税抜き金額と消費税率のテキストボックスのChangeイベントなどで、

Me!税込金額.SetFocus
Me!税込金額.Text = Int(Me!税抜金額.Text * Me!消費税率.Text * 0.01 + Me!税抜金額.Text)

とすればいいと思います。
もちろん、[表示]みたいなコマンドボタンを作って、そのクリックイベントに記述してもいいですし。
あ、そうそうご存知かも知れませんが、テキストボックスのTextプロパティはフォーカスをあてないと、参照および設定が出来ませんので、実際はそれぞれのChangeイベントで変数に代入しておくのがいいと思います。
では。
    • good
    • 0
この回答へのお礼

お返事ありがとうございました。
ヘルプをさんざん開いたんですけど「変数に代入する」やり方がわかりません。
コントロールの移動のマクロをヘルプを見ながら組んでみたのですが、
実行時エラーが出てしまいました。
きっと見当違いの事をしているんだと思います。
コードの書き方はまるでわかっていません。式ビルダがなんとなく使える程度
ですので大変申し訳ないのですが、噛んで含めるようにご教授頂ければ
ありがたいです。お手数おかけいたします。

お礼日時:2002/02/06 18:19

私もk_ebaさんのご意見に賛成なんですけど、どうしてもということであれば・・・。



[税込金額]テキストボックスのコントロールソースは[税込金額]としておいて、
単に更新前イベントで、
Me![税込金額] = Int(Me![税抜金額] * Me![消費税率] * 0.01 + Me![税抜金額])
としてやるのが、簡単かと思います。
    • good
    • 0
この回答へのお礼

お返事ありがとうございました。
更新前イベントに入れてみましたが、なぜか上手くいきませんでした。
forms![受注明細]![税込金額]‥でもダメで、式ビルダで税込金額=‥と
入れてもやっぱり上手くできませんでした。
また勘違いしてきっと見当違いな作業やってるんじゃないかと思います。
スミマセン。
もちょっとがんばってみます。
あるいはテーブル設計からも一度やり直すことも検討してみます。
本当にありがとうございました。

お礼日時:2002/02/07 09:30

再びmaruru01です。


ちょっとくどい書き方をしますので、適度に読み飛ばしてください。

まず、テキストボックスの上で右クリックするとプロパティシートが表示されますので、その中のイベントタブをクリックします。
イベントの中の"変更時"の白い四角の部分をクリックすると、右側にボタンが2つ現れます。その右側のボタン(…)をクリックすると、ビルダの選択ダイアログが表示されます。(式ビルダが使えるということなので、ここまではご存知かと思います。)
ここで、コードビルダをクリックすると、画面が切り替わり、VBEのモジュールシートが現れ、

Private Sub 税抜金額_Change()

End Sub

と書かれていると思います。
これは、テキストボックス[税抜金額]の値が変更されると実行されます。中に実行したい動作を記述していきます。
ここに次のように書きます。

Private Sub 税抜金額_Change()

Dim NoTaxAmount As Long
Dim TaxRate As Long

NoTaxAmount = IIf(Me!税抜金額.Text = "", 0, CLng(Me!税抜金額.Text))
Me!消費税率.SetFocus
TaxRate = IIf(Me!消費税率.Text = "", 0, CLng(Me!消費税率.Text))
Me!税込金額.SetFocus
Me!税込金額.Text = Int(NoTaxAmount * TaxRate * 0.01 + NoTaxAmount)

End Sub

テキストボックス[消費税率]も同様に、コードビルダを選択して、

Private Sub 消費税率_Change()

Dim NoTaxAmount As Long
Dim TaxRate As Long

Me!税抜金額.SetFocus
NoTaxAmount = IIf(Me!税抜金額.Text = "", 0, CLng(Me!税抜金額.Text))
Me!消費税率.SetFocus
TaxRate = IIf(Me!消費税率.Text = "", 0, CLng(Me!消費税率.Text))
Me!税込金額.SetFocus
Me!税込金額.Text = Int(NoTaxAmount * TaxRate * 0.01 + NoTaxAmount)

End Sub

NoTaxAmountとTaxRateが変数で、好きな名前をつけられます。Dimの分で使用出来るようにします。
また、この場合は、Private Sub ~End Sub(このかたまりをプロシージャと言います。)のなかでのみ使用出来るので、2つのプロシージャの変数は名前が同じでもまったく別と思って下さい。
その他のいろいろなキーワード(Long,SetFocus,IIfなど)は、ヘルプを参照して下さい。
今回の例では、税抜金額、消費税率のどちらかに数値を入力すると、両方に数値が入っている場合は計算結果が表示され、どちらかに何も入力されていなければ、0になります。

Accessでは、クエリやマクロだけではやることに限界がありますので、VBAを習うことをお奨めします。
教材は、本屋にいっぱいありますので、とりあえず、「はじめての~」とか、「~初級編」とか「よくわかる~」などと題したものを使うとよいでしょう。
がんばって下さい。
では。
    • good
    • 0
この回答へのお礼

度々お世話になっております。
ありがとうございました!
ご説明いただいたとおり、コードを記入しチェックしてみました。
きちんとテーブルにデータが入ってます!!!

はじめエラーが出ましたが、テーブルの税抜金額の通貨型を長整数型に
修正したら正しく計算できました。(As CurrencyにしてCCurに修正
したんですけどデバッグウィンドウから抜けられなくなってしまいました)

でもなぜか、フォームを閉じてもう一度開いて入力したら税抜金額に1桁しか
数字が入らなくて、(1文字入れると税込金額にカーソルが移動します。)
どこか違うテキストボックスを使って数字を入力してから税抜金額の欄に
コピーペーストしないと入力ができないようになってしまいました。
それって何がいけないんでしょう。もっとちゃんと‥せめてご説明頂いたこと
くらい理解できるよう、ご紹介いただいたように、早速今日は早めに上がって
VBAの本探しに行きます。確かにクエリ、マクロでできることにも限界あるかも
しれませんね。もっとお勉強します!

他に入力して税抜金額にコピーペーストするならフォームフッターに式を
入れてその値をコピーしたものを税込金額にペーストしてもらった方がいいかも?

もちょっと勉強してからまたご質問させてください
本当にありがとうございました。

お礼日時:2002/02/07 12:15

イベントの意味について多少混乱されているようなので、補足説明をさせていただきます。



まず、更新前(BeforeUpdate)イベントですが、これはテキストボックスに対してと、フォームに対してで、意味が多少異なります。
フォームに対しての場合は、そのフォーム上でレコードが保存される直前に発生するイベントです。それではどんなときにレコードが保存されるのか?一つはカーソルが別のレコードに移動したとき、もう一つはレコードの編集中にフォームを閉じたときです。
(テキストボックスに対しては、HELPか参考書で勉強してみてください。)

ということで、私がお示しした方法ですが、イベントプロシージャは、テキストボックスではなく、フォームのイベントとして記述してください。この方法では、レコードが保存される直前に[税込金額]の値を書き換えて、その計算結果をテーブルに保存することになります。ですから、同じレコード内でカーソルを各テキストボックスの[税抜金額]、[消費税率]、[税込金額]のいずれかに移動しただけでは値は更新されず、別のレコード(新規レコードでもよい)に移動した時点で[税込金額]の値が計算され、テーブルの値も更新されることになります。

次に、変更時(Change)イベントですが、これは、そのテキストボックスに文字が入力された(削られたときも)時に発生します。

ということで、私の方法では別のレコードに移動しなければ[税込金額]の値が更新されないのに対して、maruru01さんが回答されている方法では、数字を入力した瞬間に更新されますので、即時性の点で、より使いやすいプログラムだと思います。
ただ、変更中のテキストボックスの値は、文字列としか認識できないため(数値として得ることができない)Clng()関数を使って数値データに変換するような工夫が必要になります。

[税抜金額]に一桁しか入力できないのは、一文字入力した時点で、Me!消費税率.SetFocus で強制的にカーソルの移動が行われているためです。その他多少の修正も必要のようですので、この方法に挑戦されるのでしたら、HELPのTextプロパティをよく読んでみてください。

これからVBAにチャレンジされるということでしたら、参考書の他に、k_ebaさんが紹介されているようなHPもとても勉強になります。
VBAは始めるとそれなりに奥が深いものもありますが、その分、自由度が高く、自分のアイディアが活用できるようになるとけっこうはまってしまったりします。ぜひがんばってください。(わからないことがあったら、また質問してください。中上級になって、私なんかの手におえないレベルになったら、かなり専門的なサイトがいくつもありますので、そちらもご紹介します。)
    • good
    • 0
この回答へのお礼

あまりの不勉強に皆様のお力ばかり頼ってしまい申し訳ありません。

ありがとうございました!
フォームの更新前処理に入力したら正しく計算されました!
(税込金額のテキストボックスの更新前処理に入れてました)
ご説明いただいたことも理解できなくてスミマセン。

社の受注管理は入力した時点では税込金額が表示できなくても
他のフォームを開いたりレポートを出力するときに情報が更新されていれば
問題ないので、ご紹介頂いた方法を利用させていただきます。

本当にありがとうございました。

お礼日時:2002/02/07 17:04

三度maruru01です。



yoishoさん、フォローありがとうございます。
取り急ぎのコードで、しかもこの欄に直接書いていったため、いろいろ不備があるようです。
変数をプロシージャレベルではなく、モジュールレベルで宣言するなどの対処が必要でしょう。
1桁ごとの計算はいろいろ工夫が必要ですが、全桁入力後いいなら(例えば税抜金額に"1200"と入力した後)、フォーカス喪失時イベント(Exit)あたりに記述するのがいいかも知れません。

choco_monakaさん、今はわからないことが多いと思いますが、yoishoさんの言うように、本や適当なサイトなどで勉強して、わからないことはここで質問しましょう。私のような素人に毛が生えた程度ではない詳しい人が教えてくれるでしょう。
では。
    • good
    • 0
この回答へのお礼

お世話になっております。
モジュールレベルの宣言‥?
お勉強します!

がんばってお勉強して今度こちらで質問するときは質問も
要領よくできるよう、またご指導いただいたことをちゃんと
意味を理解して入力できるようにしたいと思います。

皆様本当にありがとうございました。

お礼日時:2002/02/07 17:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!