- ベストアンサー
ACCESSの関数
知人に頼んで作ってもらった、請求管理のデータベースがあります。 請求金額、入金金額、その差額が一覧で見れるようになっていますが 差額が四捨五入できておらず、自分でどうにか四捨五入をして整数で 分かるように設定をし直しました。(ACCESSに関してはド素人です) その時入力したのが 差額: Nz([入金合計]-[請求合計]) でした。 その後知人が修正したものを持って来てくれたので入れ替えたのですが 次は小数点の関係からか、なぜか1円誤差が出るようになりました。 自分でしたときは大丈夫だったので、関数を確認したところ 上記nz部分が、 fix となっていました。 誤差が出るのはややこしいので、Nzに戻そうかと思うのですが 何か問題があるか教えてください。 ヘルプでfixの説明を読みましたが、いまいち意味がわかりませんでした。 どなたかよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
差額:Nz([入金合計]-[請求合計]) これも、おかしな式ですね。 差額:Nz([入金合計])-NZ([請求合計]) なら、ヌルエラー回避としては理解できます。 しかし、そもそも、[入金合計]や[請求合計]に小数点が発生している訳がないでしょう。 10円50銭なんて請求も入金も世の中にはないですからね。 ですから、問題は、ここじゃないですね。 [イミディエイト] ? (1230 * 1.05) * 3 3874.5 例えば、こういう総額方式での単価と数量の計算箇所があるんじゃないのですか? ここで、 3874.5 -> 3875 と請求額を修正しているかどうかじゃないですか? しかし、上述の計算の仕方は信頼できませんよ! ? (Ccur(1230) * Ccur(1.05))*3 3874.5 がお勧めです。 ? Rounds((Ccur(1230) * Ccur(1.05))*3, 切り捨て) 3874 ? Rounds((Ccur(1230) * Ccur(1.05))*3, 切り上げ) 3875 と、この段階で関数を使って整数化します。 書式指定で見かけ上だけ整数化していても問題は解決しませんよ。 なお、取引先100社は、全て切り捨てしていますね。 Access2002 までは Excel みたいな RoundDown みたいな関数がないです。 ですから、そこは、上記のように Rounds関数を使うしかないです。 ' ---------------------------------------------------------------------------------------- ' 共通記号定数 ' ---------------------------------------------------------------------------------------- Option Compare Database Option Explicit ' ' Rounds関数用 ' Public Const 四捨五入 = 0 Public Const 切り捨て = 1 Public Const 切り上げ = 2 ' Public Function Rounds(ByVal M As Currency, _ ByVal A As Integer, _ Optional D As Integer = 0) As Variant Rounds = Sgn(M) * Fix(Abs(M) * 10 ^ D + Abs((A = 0) * 0.5@ + (A = 2) * (Int(M * 10 ^ D) <> (M * 10 ^ D)))) / 10 ^ D End Function
お礼
お礼が遅くなり申し訳ございません。 大変詳しく解説して頂き、有難うございます。 参考に一度、がんばってみたいと思います。 他に回答を下さった方もありがとうございました。 ここで代表してお礼申し上げます。