- ベストアンサー
EXCELのマクロで数値比較の不整合をチェックする方法
- EXCELのマクロを使用して「数量」「単価」「金額」の表の不整合をチェックする方法をまとめました。
- マクロを使って、「金額」欄と「数量」「単価」の計算結果が一致しない場合、マクロは「計算違い」と表示します。
- しかし、一部の場合において「計算違い」と表示されることがあり、問題の特定ができていません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 どうも最近、あまり脱線して書くことはできないようですが、ワークシートには、独特の誤差修正が施されていますが、完全には駆逐できていません。せめて、0.1%以下程度にしてくれればとは思いますが、これは、Microsoft 側の開発側の問題で、IEEE 754 の Double 型をそのまま使用していることが原因です。決して、Microsoft 側の言う、IEEE 754(電子規格)だけの問題ではないと思うのです。 http://support.microsoft.com/kb/78113/ja Excel で浮動小数点演算の結果が正しくない場合がある しかし、その反面、VBA側は、Double型の約半分ぐらいが、そのままの丸め誤差が発生します。それを、どう処理するかであって、一般のユーザーは、その原因を細かく追究しても始まりません。 Cells(cntR, 6).Value Cells(cntR, 7).Value どちらかは分かりませんが、小数点のあるほうは、そのまま、ダイレクトで代入できません。 曲がりなりにもワークシート側で処理されたものと、VBAでの小数点の演算を、そのまま比較するということは出来ません。ワークシートでは、小数点の掛け算自体には、それほどに誤差が発生していないはずです。 VBA(VB6のマニュアルに出てくる)では、浮動小数点誤差対策としては、小数点固定法というものと、整数変換法という方法があります。 今回は、10倍という方法で比較するなら、これは、整数変換法ということにはなるとは思いますが、それを、10で割ってやっても誤差は出ないはずです。 = 単価 * 数量 ↑ VBAでは、ここがDouble型になります。 If (Cells(cntR, 8).Value <> _ (Cells(cntR, 6).Value * Cells(cntR, 7).Value, 0 * 10)/10 Then 通常は、このように、Currency型に変換する方法が使います。 ただし、ワークシート側には、今回は、小数点の誤差は出ていないことを前提としています。(ワークシートには、引き算、割り算でも必ず誤差が出ます) '------------------------------------------- ' Dim cntR As Long Dim MaxRow As Long MaxRow = Range("H65536").End(xlUp).Row For cntR = 5 To MaxRow If Cells(cntR, 8).Value <> _ CCur(Cells(cntR, 6).Value * Cells(cntR, 7).Value) Then Cells(cntR, 23).Value = "計算違い" End If Next End Sub
その他の回答 (1)
- FEX2053
- ベストアンサー率37% (7991/21371)
こいつが原因かもですね。 http://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.shtml RoundDownするってことは、.999999を切り捨てるってことなので。 小数があるなら、一旦整数化して計算するなりしないと。
お礼
下記コードのように修正し解決できました。 ありがとうございました。 If Application.RoundUp(Cells(cntR, 8).Value * 10,0) <> _ Application.RoundDown(Cells(cntR, 6).Value * Cells(cntR, 7).Value, 0) * 10 Then Cells(cntR, 23) = "計算違い" End If
お礼
質問は締めきりますが、貴重な勉強をさせていただき感謝します。 まだまだ初心者ではありますが、今後に必ず役立つものと思います。