エクセルの数式やマクロVBAで、計算結果が同じなのに、同じでないと判断されてしまう(不一致)時の回避方法を紹介します。
IF関数を使って、計算結果Aと定数Bが同じなら「OK」、違うなら「NG」と表示させたい。
どう見てもA=Bだし、A-B=0なのに、「NG」となってしまうことがあります。
![](https://ramq-cat.com/wp-content/uploads/2021/01/098912.jpg)
AとBが同じなのに、違うとエクセルが言ってくるんです。
セル範囲を指定して右下に合計値を表示させても一緒だし、他のセルに値を張り付けても数字は一緒なんです。
途方に暮れています。
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
その計算は小数点以下の数字が含まれていますか。
![](https://ramq-cat.com/wp-content/uploads/2021/01/098912.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/098912.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/098912.jpg)
今作っている資料の通貨がUSドルなので、小数点以下のもがほとんどです。
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
実は計算元に小数点以下が多く含まれる場合、ごく微小な誤差がでてしまいます。
これはコンピュータの性質上、不可避なことのようです。
![](https://ramq-cat.com/wp-content/uploads/2021/01/098912.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/098912.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/098912.jpg)
・・・困るし、意味がわからないです。。。
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
![](https://ramq-cat.com/wp-content/uploads/2021/01/084919.jpg)
普段私たちが使っている数字は10進法ですが、コンピュータは2進法を使っています。
その過程で起こることのようです。
詳しくはMicrosoftのこちらのページへ↓
![](https://learn.microsoft.com/en-us/media/open-graph-image.png)
![](https://learn.microsoft.com/en-us/media/open-graph-image.png)
![エクセルマクロ](https://ramq-cat.com/wp-content/uploads/2020/11/1484715_s.jpg)
![エクセルマクロ](https://ramq-cat.com/wp-content/uploads/2020/11/1484715_s.jpg)
同じ数字なのに違う数字とみなされる実例1
![](https://ramq-cat.com/wp-content/uploads/2021/06/0d40a5e4a645fc6b96e767d64ac0878e.png)
![](https://ramq-cat.com/wp-content/uploads/2021/06/0d40a5e4a645fc6b96e767d64ac0878e.png)
残高から値を引いていきます。
セルB3には「=B2-A3」という式が入っています。その下のセルも同様の式が入っています。
値の合計(A列の合計)は残高のスタート(97,123.05)と等しいが、最後の残高(セルB7)が「0」になっていません。
![](https://image.moshimo.com/af-img/2427/000000051222.jpg)
![](https://image.moshimo.com/af-img/2427/000000051222.jpg)
回避方法
ドル通貨などのように、小数点以下の数字があるものをいくつも計算していくと、微小な誤差が出ます。
これを回避するためには、考えられる値よりも小さくなったら0とみなすような式を組みます。
ドル通貨であれば、少数第3位以下になれば0とみなす式を組むことで、この微小な誤差を許容でます。
この誤差では、比べる値のうちどちらが大きくなるかわからないので、絶対値を得る「ABS関数」を使います。
回避する数式 ABS関数
![](https://ramq-cat.com/wp-content/uploads/2021/06/1412b7cdb8f1305946c4d4ca7576d38c.png)
![](https://ramq-cat.com/wp-content/uploads/2021/06/1412b7cdb8f1305946c4d4ca7576d38c.png)
同様に残高から値を引いていきます。
セルB3には「=IF(ABS(B2-A3)<0.01,0,B2-A3)」という式が入っています。その下のセルも同様。
1. ABS(B2-A3):B2-A3の絶対値が
2. 1.<0.01:0.01(小数点第2位)よりも小さかったら
3. True→0とする。False→B2-A3の計算結果
最後の残高(セルB7)が「0」になっている。
![](https://image.moshimo.com/af-img/0866/000000029834.jpg)
![](https://image.moshimo.com/af-img/0866/000000029834.jpg)
同じ数字なのに違う数字とみなされる実例2
![](https://ramq-cat.com/wp-content/uploads/2021/06/76c691c22c7ef40a64aa64b04f05e90c.png)
![](https://ramq-cat.com/wp-content/uploads/2021/06/76c691c22c7ef40a64aa64b04f05e90c.png)
実例1のパターンで、上の図のように書式設定を通貨などに変えると、あたかも0であるかのような表示になるが、小数点第2位までは0が並んでいるというだけです。
セルC7に「セルB7が0であるかどうか」を判定する式(セルD7参照)を入れると、0でないという結果が返ってきます。
セルB7で表示する小数点以下の桁数を増やすと次のようになりました。
![](https://ramq-cat.com/wp-content/uploads/2021/06/82cd89bf6e3e7beeac7a6a7e3c296e8a.png)
![](https://ramq-cat.com/wp-content/uploads/2021/06/82cd89bf6e3e7beeac7a6a7e3c296e8a.png)
回避方法は実例と同じです。
コメント