データの分析、グラフ作成、および通信のためのツールを備えた Microsoft 表計算ソフトウェアのファミリ。
こんにちは。
手元の環境( Windows11 と Excel2021 の組み合わせ)で確認してみましたが、結果は提示されている表の状態と全く一緒になりました。
図1は、その結果です。
「条件付き書式」のルールについては、質問文で提示されている図の通りに設定しています。
尚、「誤差」の列には下記のような数式を入れ、それを下方向(行方向)に必要なだけコピーしています。
・E8セルの数式
=D8-C8
・G8セルの数式
=F8-C8
・図1
.
こういった予想外の結果が出る場合、計算結果のごく僅かな誤差が原因の場合がよくあります。
図2は「誤差」の列の小数部の表示桁数を 16桁まで拡大した状態です。(「セルの書式設定」の「表示形式」タブで「数値」を選択し「小数点以下の桁数」を 16に設定。)
・図2
.
なぜ 16桁なのかというと、Excel では、計算結果として表示できる最大有効桁数は整数部と小数部を合わせて 15桁に制限されているので、今回の場合は小数部を 16桁で表示させることで計算結果の誤差の有無が分かるからです。
・Excel の仕様と制限
ただ、こういったことが出来るということは Excel 内部では計算結果として 16桁の数値を保持しているとも考えられますし、誤差が生じる場合も、更に小さな誤差を何らかの方法で 16桁に丸めている可能性も考えられます。(あくまでも結果から考えうる推測に過ぎませんが・・・。)
前置きが長くなりましたが、図2を見ていただくと、実際には E列の 11行目から 15行目までの計算結果に僅かな誤差が生じているのがお分かりいただけるかと思います。
なぜ、こういった誤差が生じるのかは、ネットで「 Excel 計算誤差」といったワードで検索してみてください。多くの情報が得られるかと思います。
内部で誤差が生じているのに、図1のように表示(見た目)では誤差が無いように見えるのは、通常は 2つの数値の差分の計算結果が小数部の桁数の多い方に合わせて表示されるためかと思われます。
今回の場合で言えば、「基準点」と「観測点」の差分を表示する「誤差」の列の計算結果の小数部は 3桁になるはずですので、誤差の有無に関わらず、小数点以下 4桁目の数値を四捨五入して小数部 3桁にして表示しているため誤差が無いように見えるのではないかと思います。
ただし、図2のように内部的には小数部 16桁を保持していますので、あくまで見た目だけの四捨五入であって、丸め(四捨五入後に小数点以下 4桁目以降は削除)は行われていないようです。
なので、図1のように、E列の 13行目以降に表示されている数値が「条件付き書式」で 0.015 より大きい数値として認識され、赤文字で表示されてしまいます。
尚、11行目と 12行目の数値は誤差は有っても 0.015 より小さいか等しい数値(且つ -0.015 より大きいか等しい数値)に該当しますので、赤文字表示にはなりません。
以上が、図1、図2から読み取れる状況です。
こういった状況を改善したい場合、「誤差」列の数式を計算結果の誤差を無視できるような数式に変更すれば良いことになります。
以下は、いずれも、今回のように誤差がごく小さな数値である場合の対処方法例になります。
- ROUND 関数を使う方法。
E8セルと G8セルの数式を下記のように変更し、それぞれの数式を下方向(行方向)に必要なだけコピーします。
・数式1:E8セルに入れる数式です。
=ROUND(ROUND(D8,3)-ROUND(C8,3),3)
<数式1の動作概要>
この数式では、左から 2つ目の ROUND 関数で、D8セルの値の小数点以下 4桁目の数値を四捨五入して小数点以下 3桁の数値に丸めた( 4桁目以降は削除した)数値と、左から 3つ目の ROUND 関数で、C8セルの値の小数点以下 4桁目の数値を四捨五入して小数点以下 3桁の数値に丸めた( 4桁目以降は削除した)数値との差を求めますが、この時点では計算誤差が生じる可能性が有りますので、その結果を左端の ROUND 関数で、小数点以下 4桁目の数値を四捨五入して小数点以下 3桁の数値に丸めた( 4桁目以降は削除した)数値にして表示しています。
D8セルの値と C8セルの値についても ROUND 関数を使って丸めているのは、どちらかのセル(あるいは両方のセル)の値が何らかの数式の計算結果として表示されている場合を考えているためです。
・数式2:G8セルに入れる数式です。
=ROUND(ROUND(F8,3)-ROUND(C8,3),3)
<数式2の動作概要>
数式1と同様のため省略します。
2. TEXT 関数を使う方法。
E8セルと G8セルの数式を下記のように変更し、それぞれの数式を下方向(行方向)に必要なだけコピーします。
・数式3:E8セルに入れる数式です。
=TEXT(TEXT(D8,"0.000")-TEXT(C8,"0.000"),"0.000")*1
<数式3の動作概要>
この数式では、左から 2つ目の TEXT 関数で、D8セルの値を見た目通りの小数部 3桁の文字列に変更し、左から 3つ目の TEXT 関数で、C8セルの値を見た目通りの小数部 3桁の文字列に変更した後、その差を求めますが、この時点では計算誤差が生じる可能性が有りますので、その結果を左端の TEXT 関数で見た目通りの小数部 3桁の文字列に変更し、これを *1 とすることで数値に変換し表示しています。
D8セルの値と C8セルの値についても TEXT 関数を使っているのは、どちらかのセル(あるいは両方のセル)の値が何らかの数式の計算結果として表示されている場合を考えているためです。
尚、文字列同士の演算であっても、その文字列が数値と見なすことが出来る数字の並びであった場合には問題なく演算結果を求めることが出来ますので、このような数式の書き方でもエラーとはなりません。
・数式4:G8セルに入れる数式です。
=TEXT(TEXT(F8,"0.000")-TEXT(C8,"0.000"),"0.000")*1
<数式4の動作概要>
数式3と同様のため省略します。
どちらの数式を使った場合でも、結果は図3のようになります。
(図3では数式1と数式2を使っています。)
・図3
.
以上です。
Windows11 と Excel2021 の組み合わせで動作確認しています。
よろしければ、ご自身の環境でお試しになってみてください。
ご参考になれば幸いです。
<文章の一部修正>
意味合い的に少し変だったので、下記の文章を修正しました。(中段あたりに書いている文章です。)
・修正前
なので、図1のように、「誤差」列の 13行目以降に・・・
・修正後
なので、図1のように、E列の 13行目以降に・・・
失礼いたしました。
その他、長い文章のため読みやすさを改善したく、数か所に改行を追加しています。