• ベストアンサー

Access97フォームで計算したものをテーブルに入力したい

Access97で受注管理のデータベースを設計中です。 フォームのテキストボックス[税込金額]のコントロールソースに =Int([税抜金額]*[消費税率]*0.01+[税抜金額]) という式を入れました。 はたと気がついたら、基になるテーブルの[税込金額]には当然 (コントロールソースじゃなくなってしまったから)そこで 計算された値は更新されません。 テーブルにその値を更新したいのですが、そのためにはどのように すればよろしいでしょうか? 基になるテーブルに[税抜金額][消費税率][税込金額]という項目が あります。で、フォームを使用して入力時に税抜き金額を入力し、 消費税率を入力すると税込金額が小数点切り捨てで自動で入力される という風に組めればフォームの中で計算できなくてもフォームで値が 表示されればかまいません。 要領を得ない質問でスミマセン。お手数ですが教えてください。

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

  • ベストアンサー
  • yoisho
  • ベストアンサー率64% (331/516)
回答No.5

イベントの意味について多少混乱されているようなので、補足説明をさせていただきます。 まず、更新前(BeforeUpdate)イベントですが、これはテキストボックスに対してと、フォームに対してで、意味が多少異なります。 フォームに対しての場合は、そのフォーム上でレコードが保存される直前に発生するイベントです。それではどんなときにレコードが保存されるのか?一つはカーソルが別のレコードに移動したとき、もう一つはレコードの編集中にフォームを閉じたときです。 (テキストボックスに対しては、HELPか参考書で勉強してみてください。) ということで、私がお示しした方法ですが、イベントプロシージャは、テキストボックスではなく、フォームのイベントとして記述してください。この方法では、レコードが保存される直前に[税込金額]の値を書き換えて、その計算結果をテーブルに保存することになります。ですから、同じレコード内でカーソルを各テキストボックスの[税抜金額]、[消費税率]、[税込金額]のいずれかに移動しただけでは値は更新されず、別のレコード(新規レコードでもよい)に移動した時点で[税込金額]の値が計算され、テーブルの値も更新されることになります。 次に、変更時(Change)イベントですが、これは、そのテキストボックスに文字が入力された(削られたときも)時に発生します。 ということで、私の方法では別のレコードに移動しなければ[税込金額]の値が更新されないのに対して、maruru01さんが回答されている方法では、数字を入力した瞬間に更新されますので、即時性の点で、より使いやすいプログラムだと思います。 ただ、変更中のテキストボックスの値は、文字列としか認識できないため(数値として得ることができない)Clng()関数を使って数値データに変換するような工夫が必要になります。 [税抜金額]に一桁しか入力できないのは、一文字入力した時点で、Me!消費税率.SetFocus で強制的にカーソルの移動が行われているためです。その他多少の修正も必要のようですので、この方法に挑戦されるのでしたら、HELPのTextプロパティをよく読んでみてください。 これからVBAにチャレンジされるということでしたら、参考書の他に、k_ebaさんが紹介されているようなHPもとても勉強になります。 VBAは始めるとそれなりに奥が深いものもありますが、その分、自由度が高く、自分のアイディアが活用できるようになるとけっこうはまってしまったりします。ぜひがんばってください。(わからないことがあったら、また質問してください。中上級になって、私なんかの手におえないレベルになったら、かなり専門的なサイトがいくつもありますので、そちらもご紹介します。)

choco_monaka
質問者

お礼

あまりの不勉強に皆様のお力ばかり頼ってしまい申し訳ありません。 ありがとうございました! フォームの更新前処理に入力したら正しく計算されました! (税込金額のテキストボックスの更新前処理に入れてました) ご説明いただいたことも理解できなくてスミマセン。 社の受注管理は入力した時点では税込金額が表示できなくても 他のフォームを開いたりレポートを出力するときに情報が更新されていれば 問題ないので、ご紹介頂いた方法を利用させていただきます。 本当にありがとうございました。

その他の回答 (5)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.6

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

choco_monaka
質問者

お礼

お世話になっております。 モジュールレベルの宣言‥? お勉強します! がんばってお勉強して今度こちらで質問するときは質問も 要領よくできるよう、またご指導いただいたことをちゃんと 意味を理解して入力できるようにしたいと思います。 皆様本当にありがとうございました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

再び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を習うことをお奨めします。 教材は、本屋にいっぱいありますので、とりあえず、「はじめての~」とか、「~初級編」とか「よくわかる~」などと題したものを使うとよいでしょう。 がんばって下さい。 では。

choco_monaka
質問者

お礼

度々お世話になっております。 ありがとうございました! ご説明いただいたとおり、コードを記入しチェックしてみました。 きちんとテーブルにデータが入ってます!!! はじめエラーが出ましたが、テーブルの税抜金額の通貨型を長整数型に 修正したら正しく計算できました。(As CurrencyにしてCCurに修正 したんですけどデバッグウィンドウから抜けられなくなってしまいました) でもなぜか、フォームを閉じてもう一度開いて入力したら税抜金額に1桁しか 数字が入らなくて、(1文字入れると税込金額にカーソルが移動します。) どこか違うテキストボックスを使って数字を入力してから税抜金額の欄に コピーペーストしないと入力ができないようになってしまいました。 それって何がいけないんでしょう。もっとちゃんと‥せめてご説明頂いたこと くらい理解できるよう、ご紹介いただいたように、早速今日は早めに上がって VBAの本探しに行きます。確かにクエリ、マクロでできることにも限界あるかも しれませんね。もっとお勉強します! 他に入力して税抜金額にコピーペーストするならフォームフッターに式を 入れてその値をコピーしたものを税込金額にペーストしてもらった方がいいかも? もちょっと勉強してからまたご質問させてください 本当にありがとうございました。

  • yoisho
  • ベストアンサー率64% (331/516)
回答No.3

私もk_ebaさんのご意見に賛成なんですけど、どうしてもということであれば・・・。 [税込金額]テキストボックスのコントロールソースは[税込金額]としておいて、 単に更新前イベントで、 Me![税込金額] = Int(Me![税抜金額] * Me![消費税率] * 0.01 + Me![税抜金額]) としてやるのが、簡単かと思います。

choco_monaka
質問者

お礼

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

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 テキストボックスのコントロールソースは元のまま([税込金額])にして、 税抜き金額と消費税率のテキストボックスのChangeイベントなどで、 Me!税込金額.SetFocus Me!税込金額.Text = Int(Me!税抜金額.Text * Me!消費税率.Text * 0.01 + Me!税抜金額.Text) とすればいいと思います。 もちろん、[表示]みたいなコマンドボタンを作って、そのクリックイベントに記述してもいいですし。 あ、そうそうご存知かも知れませんが、テキストボックスのTextプロパティはフォーカスをあてないと、参照および設定が出来ませんので、実際はそれぞれのChangeイベントで変数に代入しておくのがいいと思います。 では。

choco_monaka
質問者

お礼

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

  • k_eba
  • ベストアンサー率39% (813/2055)
回答No.1

税込金額はデータベースの項目にしなければいけませんか? 税込み金額みたいに計算で求められる物はデータベースの項目に持たず クエリーで追加するようにすれば例えば税率などが変わっても クエリーを使用する時に再計算する為に基準値を変えればOKです クエリーの使い方を勉強しましょう。 頑張って下さい

参考URL:
http://www.people.or.jp/~Niki/, http://www.people.or.jp/~Niki/,
choco_monaka
質問者

お礼

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

choco_monaka
質問者

補足

本当はポイントをK_ebaさんにもにお入れしたいのですが、お二人を 選ばなければとのことですので、今回はyoishoさん、maruru01さんに 入れさせていただきたいと思います。 ご紹介いただいたサイトや本でもっとお勉強します。 本当にありがとうございました。

関連するQ&A

  • ACCESSのテーブルとフォーム

    大変失礼ですが、いきなり質問です。よろしくお願いします。 テーブルに「受注データ」 フォームに「入力画面」というのを作ってあります。 そのフォームの一部に「商品金額」・「送料」・「消費税」・「合計金額」というテキストボックスがあります。それぞれのコントロールソースには単純にテーブルのデータを使うようにしてありますが・・・・・・「合計金額」のコントロールソースに「商品金額」・「送料」・「消費税」の合計を計算してくださいというような設定をしてしまったら、フォーム上ではしっかり計算をして表示してくれたのですが、テーブルの「合計金額」の列は空白になってしまいます。 テーブルの列が空白ではなく、フォームで表示されたその数値をテーブルの列に戻す?返す?という事を設定するにはどうしたら宜しいのでしょうか?是非ご教示下さいます様お願い申し上げます。ちなみにACCESS2000を使用しています。なぜかVBAの画面でヘルプを開こうとするとインストールされていないみたいで開かないんです。(←これ、余談です。すみません。)

  • フォームの計算がテーブルに反映するには?

    Windows2000/ACCESS2000を使用してます。 フォームで自動的に合計や消費税が計算されるように設定しましたが、保存されたテーブルを見てみると合計や消費税は空白になっていて計算された値が入力されてませんでした。 フォームでの計算式は以下のように設定しました。 合計のフィールドを選んで、プロパティを開きその中のデータタブのコントロールソースに式ビルダーで、 =A+B と設定しました。フォーム上では計算されるの ですが・・・ どのようにしたらテーブルに計算された値が表示されるのでしょうか? 宜しくお願いします。

  • 「Access」で、式が入っているテキストボックスに直接入力したい。

    「Access2000」を 使用しています。 まだ「アクセス」を使い始めたばかりなので、 分からないことが多いのですが…。 「フォーム」で、 「税抜き」というテキストボックスの コントロールソースに関数 (=Int([税込み]/1.05+0.9))を入れました。 これで「税込み」価格を入力すると 自動的に「税抜き」価格が表示されるようには なったのですが、「税抜き価格をダイレクトに 入力したいケース」が出てきて困っています。 「Excel」の場合、 式の上に直接入力すれば、式が消えて 値を直接打ち込むことが出来ますが、 「アクセス」の場合は式が入っている テキストボックスに、値を直接入力 することは出来ないのでしょうか?

  • Access2003 フォームについて

    Access初心者です。ご存知の方がいらっしゃいましたら教えて下さい。 内税と外税の計算について 現在請求書を作成するmdbを制作しております。 メインフォームに「小計」、「消費税」、「合計」という項目があります。 それぞれの詳細は以下のとおり。 ●「小計」のコントロールソース→=[Q-請求明細 サブフォーム]!合計金額 ●「消費税」のコントロールソース→=[小計]*0.05 ●「合計」のコントロールソース→=[小計]+[消費税] 同じメインフォーム上に「内税」と「外税」というオプションボタンを配置して、 「内税」にチェックを付けた場合は、「消費税」が計算されない。 「外税」にチェックを付けた場合は、「消費税」が計算される。 このような仕様にしたいと思い作っているのですが、どのように作成すると良いか 分かりません。 ご存知の方がいらっしゃいましたら是非教えて下さい。 不足箇所がありましたら追記致します。

  • アクセスの計算方法を教えて下さい

    テーブル(1)にある「金額A」からテーブル(2)にある「金額B」「金額C」「金額D」を差し引いた値をフォームでテキストボックスを挿入し求めたいのですが、計算式が解らず困っています。 単なるコントロールソースに =SUM[[金額A]-[金額B]-[金額C]-[金額D] と入れたのですが、値が出ません。 テーブルからのフォームでは、できないのでしょうか?

  • アクセス: フォーム上で計算した数字をテーブルに保存したい。

     こんばんは。また質問させてもらいます・・。 これがアクセスに関して、最後の質問になるようにしたいです!!  さて、フォームに入力したものは自動的にテーブルに保存されます。 しかし、フォーム上で計算したものは、テーブルに反映されていませんでした。 過去の質問にフォーム上計算したものは、テーブルに反映されないということがわかりました。 では、一体どうすればいいのでしょうか。  フォームのコントロールソースには =([QTY]*[COST]) 数量*値段を入れています。 どうすれば、テーブルに表示できるでしょうか。 ご教授お願いいたします。 過去の質問は、こちらを参考しました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1002073

  • フォームにて自動計算したい・・・

    自力でネットで調べてある程度まで完成しましたが、合計金額の計算式がわからない為詰まりました・・・ まず、オークションで落札された代金を入力してもらうと、合計・消費税・税込み合計が表示される。 その次に発送先を選択されると、合計・消費税・税込み合計が更新(再計算)される・・・ というようにしたいのですが・・・ まったくわからず困っております(^^;お助けください

  • ピボットテーブルで小計と合計が合わない

    おねがいします。ピボットテーブルで購入先別、購入品別に税抜き額と消費税率1.1を記入した表から、税込み額を集計したのですが、A社の製品別の税込み額を足してもA社合計税込み額と合いません。(1.1×100+1.1×200=330なのに集計表では660になっている) この原因はピボットテーブルの計算ではA社合計額は税込み小計額の合計(正しい計算方法)ではなく、消費税率の合計(1.1+1.1=2.2)×税抜き額合計(100+200=300)をしているからですが、どうしたら正しい方法で計算するようにできるでしょうか?

  • 税率UPに伴うリベート計算の仕方と説明方法

    これまでクライアントに対して税込売上の8%をリベートとして支払っていました。今後、消費税率が順次UPされることに伴い、支払金額はそのままにリベート率をUPさせて税抜金額に対してリベート率を掛けたいと思います。 計算方法としては・・・ (1)10,500円(税込売上)*8%(税込時リベート率)=840円(リベート支払金額) (2)10,000円(税抜売上)*x%(税抜時リベート率)=840円(リベート支払金額)                             x=8.4%(税抜時のリベート率) でいいと思うのですが、先方は・・・ 消費税の5%を引いて、そこに税込時のリベートを乗せるのだから 5%(現在の消費税率)+8%(税込時リベート支払率)=13%(税抜時のリベート率) と主張します。 13%を(2)に代入すれば (2)10,000円(税抜売上)*13%(税抜時リベート率)=1,300円(リベート支払金額) となり、(1)とイコールにならないので間違いだとは思うのですが、13%とする考え方のどこに間違があるのかわからずうまく説明できません。 計算や数字の苦手な人にもわかってもらうためには、どのように説明すればよろしいでしょうか?ご教示ください。 もしかして、こちらが間違ってますか?

  • Access2010フォーム関数からテーブル入力

    アクセス2010について過去からの質問があまりないようですので 浅学ながら質問させていただきます。 フォームのテキストボックス内にて DlookUp関数で返した値を、 "Aテーブル"へ自動で入力したいのですが、 そのような関数はあるのでしょうか? また、このような操作は Dlookupを記述しているコントロールソースから 改行でコードを入力すればよいのでしょうか? ご教示いただければ幸甚です。 よろしくお願いいたします。

専門家に質問してみよう