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

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

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

このQ&Aに関連する最新のQ&A

A 回答 (6件)

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



まず、更新前(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

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

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



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

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

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

こんにちは。

maruru01です。

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

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

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

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

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

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


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

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q入金額から消費税と源泉徴収税と税抜金額を出す条件分岐について

アクセスのクエリで入金額から税抜金額と消費税額と源泉徴収税額を計算する条件分岐式を教えて下さい。簡単な算数の問題だと思うのですが,上手くいきません。

入金額には,4つのパターンがあって,以下の計算式で税抜金額が求められると思います。ちなみに,税抜金額が100万円以上の場合は想定していないので,源泉徴収税は100万円までの場合として計算式を作りました。

  源泉徴収税 消費税 計算式
(1) ○     ○   入金額/0.95
(2) ○     × 入金額/0.9
(3) ×     ○ 入金額/1.05
(4) ×     × 入金額

これをクエリフィールドで求めるために,
税抜金額: IIf([源泉徴収税]=True,IIf([消費税]=True,Int([入金額]/0.95),Int([入金額]/0.9)),IIf([消費税]=True,Int([入金額]/1.05),[入金額]))
という式をクエリのフィールドに入力したのですが(2)の条件のときも(1)の計算式で計算されてしまいます。
どこが間違っているのでしょうか。初歩的な質問ですみませんが,ご回答お願いします。

アクセスのクエリで入金額から税抜金額と消費税額と源泉徴収税額を計算する条件分岐式を教えて下さい。簡単な算数の問題だと思うのですが,上手くいきません。

入金額には,4つのパターンがあって,以下の計算式で税抜金額が求められると思います。ちなみに,税抜金額が100万円以上の場合は想定していないので,源泉徴収税は100万円までの場合として計算式を作りました。

  源泉徴収税 消費税 計算式
(1) ○     ○   入金額/0.95
(2) ○     × 入金額/0.9
(3) ×     ○ ...続きを読む

Aベストアンサー

いわれたままに式を貼り付けたら 添付図のようになりました
式ビルダ
税抜金額: IIf([源泉徴収税]=True,IIf([消費税]=True,Int([入金額]/0.95),Int([入金額]/0.9)),IIf([消費税]=True,Int([入金額]/1.05),[入金額]))
なぜでしょうね?

QOutlookで[全員に返信]をクリックすると、[宛先]と[CC]をす

Outlookで[全員に返信]をクリックすると、[宛先]と[CC]をすべて[CC]に入るように設定。

今までOutlookずっと愛用していますが、現在は最新版のOutlook2010を使用してます。

[全員に返信]をクリックすると、元メールの[送信元]と[宛先]が新メールの[宛先]に変わり、[CC]はそのまま引継ぎますが、元メールの[送信元]と[宛先]と[CC]を全部[CC]に入るように設定などありますか。

または、[送信元]だけを[宛先]にして、ほかはすべて[CC]に入ってもいいですが。

Aベストアンサー

>[全員に返信]をクリックすると、元メールの[送信元]と[宛先]が新メールの[宛先]に変わり、[CC]はそのまま引継ぎます

これって、Microsoftのメールソフトの仕様ですかね。
自分が受信したメールの宛先やCCであっても、Outlook Expressもそうなるようです。

私のメインのThunderbirdでは、自分が複数の宛先やCCに含まれている場合でも、それらの受信メールから「全員に返信」で、受信メールの「送信元」のみが、返信メールの宛先に入り、他の「宛先」や「CC」はすべてCCに表示されます。

>[送信元]だけを[宛先]にして、ほかはすべて[CC]に入ってもいいですが。

この部分での方法は、返信メールの宛先欄で、送信元以外をドラッグして選択して右クリックから切り取り、CC欄に右クリックから貼り付けするしかないと思います。

Q[Access]複数のサブフォームで1つのテーブル

1つのフォームに複数のサブフォーム(sb1,sb2,sb3)があります。
そのサブフォームは1つの同じテーブルを参照しています。
そこで、sb1, sb2, sb3にデータを入力すると
全て別のレコードに書き込まれます。
これを1つのレコードに書き込む方法はないでしょうか?

簡単に、
sb1 には個人情報
sb2 には会社情報
sb3 にはメールアドレス
のようになっています。

これが
レコード1 個人情報
レコード2        会社情報
レコード3               メールアドレス

となってしまいます。
これを

レコード1 個人情報 会社情報 メールアドレス

とするにはどうしたらよいでしょうか??
よろしくお願いします。

Aベストアンサー

それぞれのサブフォーム更新後にリクエリーすればできそうな気がしますが。
ひとつの入力フォーム上に、同一テーブルを参照するサブフォームを複数置く設計は、No1で回答した方が述べているように、あんまりよい方法ではないと、私も思います。

Qアクセスでテーブル入力用のフォームを他のテーブルのレコードを参照しながら入力するには

こんにちわ
アクセスでテーブルのレコードを作成するのに
他のテーブルのレコードを引っ張ってきて
フォーム上で表示したいのですが
うまくいきません

たとえば、社員名テーブル(従業員番号と名前)
配属テーブル(従業員番号と営業所コード)
支社テーブル(支社名と営業所コードの上2桁)
営業所テーブル(営業所名と営業所コード)を作成しておきます

退職者が出るたびに
退職者テーブル用のフォームに
従業員番号を入力すると
フォーム上にその人の名前・支社名・営業所名が表示され
それを確認してから
その他のデータをその同じフォームに
入力したいのです
今、試しに作ったのは
テーブルに一度上書きしないとデータを引っ張ってこないの不便なのです

よろしくお願いします

Aベストアンサー

従業員番号・名前・営業所コード・支社名・営業所名を表示するクエリを作りそれを基にコンボボックスをフォーム内に作ります。
そのコンボボックスをコンボ1と名前を付けたとしてフォーム上の名前・営業所コード・支社名・営業所名の各フィールドにコンボボックスに表示される内容を出したい場合。
(従業員番号はコンボボックスを作る時に次のフィールドに保存するのところで従業員番号を指定しておいて)

Private Sub コンボ1_AfterUpdate()
名前 = コンボ1.Column(1)
営業所コード = コンボ1.Column(2)
支社名 = コンボ1.Column(3)
営業所名 = コンボ1.Column(4)
End Sub
上記の記述を更新後処理にすれば出来ます。
試してみてください。

Q[Access]あるフォームのクラスモジュールで値を入れた変数を他のフォームでそのまま利用したい

モジュールとクラスモジュール(イベントプロシージャ)に違いがあることや、モジュールを超えて変数を利用したいときは、Publicで宣言する、という辺りを本を読んでおおまかに理解しました。
帳票管理フォームというフォームに受付CDという主キーの番号があります。そのフォーム上に帳票の詳細な事項を入力するフォームを呼び出すボタンがあります。フォームのイベントプロシージャの一番上のOption Compare Database,Option Explicitの直下行にPublic UketukeCD as Integerと宣言し、
ボタンのイベントプロシージャで、
UketukeCD = Me![受付CD].Value
などと記述しました。
新規入力データの受付CDが例えば452ならUketukeCDには452が代入されればいいんです。
帳票の詳細な事項を入力するフォーム(報告書フォームとします)の「読みこみ時」のイベントプロシージャに以下のように記述しました。
こちらのモジュールの一番上にもPublic UketukeCD as Integerと宣言し、(←これは必要なんでしょうか?)
Me![受付CD].Value = UketukeCDと書きました。
過去のデータを検索するときはレコードソースのテーブルの受付CDのデータを受付CDフィールドに持ってき、新規入力の場合は、受付CDは帳票管理フォームのものを代入するという設計で、UketukeCDの値(例:452)を報告書フォーム内の受付CDフィールド内に出力する、という感じですが、なぜかUketukeCDにはいつも0が代入されています。
変数は他のモジュールで利用できても代入された値までは移行されないのですか?
イベントプロシージャだからできないんですか?
字数の制限上、コードをかなり省略しています。
足りない部分は補足で補いますのでおっしゃって下さい。

モジュールとクラスモジュール(イベントプロシージャ)に違いがあることや、モジュールを超えて変数を利用したいときは、Publicで宣言する、という辺りを本を読んでおおまかに理解しました。
帳票管理フォームというフォームに受付CDという主キーの番号があります。そのフォーム上に帳票の詳細な事項を入力するフォームを呼び出すボタンがあります。フォームのイベントプロシージャの一番上のOption Compare Database,Option Explicitの直下行にPublic UketukeCD as Integerと宣言し、
ボタンのイベントプロシ...続きを読む

Aベストアンサー

どうも変数のスコープ(変数の有効範囲)を理解していないようですね。
例えば
------モジュールのモジュール1
Option Compare Database
Public a As Integer
Sub aaa()
a = 3
End Sub

------フォーム1のモジュール
Option Compare Database
Public a As Integer
Private Sub Form_Load()
Dim a As Integer
a = 1
MsgBox CStr(a)
End Sub

Private Sub コマンド1_Click()
a = 2
Call aaa
End Sub

Private Sub コマンド2_Click()
MsgBox CStr(a)
End Sub

-------フォーム2のモジュール
Option Compare Database

Private Sub Form_Load()
MsgBox CStr(a)
End Sub


ではこれをフォーム1を開いて、ボタン1を押して、ボタン2を押して、フォーム2を開くと
メッセージボックスは



との順で表示されます。

これはスコープが
関数内が宣言
フォーム共通の宣言
DB全体(モジュール)の宣言

の順に優先度が高いためです。一番したが一番低い
各々スコープは

関数内は
sub

End sub
が有効範囲で

フォーム共通の宣言は同一フォーム内で有効

モジュールの場合は同一DB内で有効です。

通常、Publicを宣言して別のフォームに値を渡す場合はモジュールにPublic宣言をします。

よって今回の場合はフォームAにPublic変数を定義してもフォームBに対しては有効では有りません。
このような場合はモジュールでPublic変数の定義をする必要があります。

フォーム内は宣言不要!!

どうも変数のスコープ(変数の有効範囲)を理解していないようですね。
例えば
------モジュールのモジュール1
Option Compare Database
Public a As Integer
Sub aaa()
a = 3
End Sub

------フォーム1のモジュール
Option Compare Database
Public a As Integer
Private Sub Form_Load()
Dim a As Integer
a = 1
MsgBox CStr(a)
End Sub

Private Sub コマンド1_Click()
a = 2
Call aaa
End Sub

Private Sub コマンド2_Click()
MsgBox CStr(a...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報