2017-10-05 1 views
1

私はいくつかのチェックルーチンをExcelファイルに書き込むためにvbaを使用しています。それらのうちの1人は、いくつかのセルの値が小数点以下2つ以下であるかどうかをチェックする必要があります。VBA小数点以下の桁数が2つしかないか確認してください。エラーInt()を使用して

Function checkValues(sheet as Worksheet) as Boolean 
    val = sheet.Cells(1,1).Value 
    val = val * 100 
    valInt = Int(val) 

    if valInt <> val then 
     checkValues = false 
     Exit Function 
    end if 
    checkValues = true 
End Function 

問題は、私は1,12に等しいセル(1,1)の値を入れたときに、この関数はFalseを返すということです。これを行うには、私は基本的にこのコードを持っている機能を記述します。私はデバッグを使用すると、valIntとvalの両方が112に等しいことがはっきりとわかりますが、なぜ 'valInt <> val'というステートメントが私に 'True'を与える​​のかわかりません。

誰かが私を助けることができますか?

ps:私はすでにFix()関数に変更し、他の多くのステートメントを試してみます。

ありがとうございました。

+0

私はロングとしてダブル、valintとしてのvalを宣言しなければならなかったが、それは私のために動作します。 '.Value'の代わりに' .Value2'を試してください。 –

+0

倍精度の数値は十進数を正確に表すことができません(10進数の値がいくつかの累乗の和として表現されない限り、 1 + 2^-2')。 'val = CDec(val)* 100'を使ってみてください – YowE3K

答えて

1

倍精度数値は、小数点の値を2のべき乗の合計で表すことはできません。たとえば、であるため、0.75は正確です。だから、むしろVariant/DoubleよりVariant/Decimalの変数の型を使用します。

Function checkValues(Sheet As Worksheet) As Boolean 
    Dim val1 As Variant ' Allows a subtype of Variant/Decimal 
    Dim valInt As Long 
    val1 = CDec(Sheet.Cells(1, 1).Value) * 100 
    valInt = Int(val1) 

    If valInt <> val1 Then 
     checkValues = False 
     Exit Function 
    End If 
    checkValues = True 
End Function 
+0

ありがとうございました。問題が解決しました。 –

関連する問題