意外と知らないExcelの罠

仕事で使っているワークシートがありまして、入っている数式を上書きしたらわかるように
チェックするためのプログラムを作ってありました。


チェックでは二方向から合計したセルを比較することで一方が間違っているかがわかるというものです。


ところがこの比較するプログラムが明らかに同じセルの数値にFalseを返したのです。
更に調べるとワークシート関数で比較するとTrueを返します。


それで、セルに何が入っているかを調べる為にTypeName関数で型を調べると
どちらもDoubleであることがわかりました。


これはまるめによる誤差ではないかと調べるとわかりました。
http://msdn.microsoft.com/ja-jp/library/ae382yt8%28v=VS.80%29.aspx


関数の途中で剰余を使っていたために浮動小数点に誤差が生じていたのです。
この場合の解決方法として、誤差はたいてい小さな値なので差をとって一定値以下なら同じとしちゃえ
という乱暴な方法のようなので、その為の関数を作ってみます。

'浮動小数点数を比較する
Function DecHikaku(d1 As Double, d2 As Double) As Boolean
    If d1 = d2 Then
        DecHikaku = True
    Else
        If d1 > d2 Then
            If d1 - d2 < 0.0001 Then
                DecHikaku = True
            Else
                DecHikaku = False
            End If
        Else
            If d2 - d1 < 0.0001 Then
                DecHikaku = True
            Else
                DecHikaku = False
            End If
        End If
    End If
End Function


今まで意識せずに=で比較してたケースでも例外が発生するケースは重々にあるようです。