こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL2007 VBA IF文について

プログラム
If Sheets("sheet1").Cells(85, 1).Value = Cells(13, 1).Value Then
msgBox "true"
Else
msgBox"false"
End If


Sheets("sheet1").Cells(85, 1).Value ← 0.38125
Cells(13, 1).Value ← 0.38125

上記のプログラムと値のとき、結果はtrueが表示されると思うのですが、なぜかfalseが表示されてしまいます。なぜ、falseが表示されるのか解りましたら教えてください。
値はウォッチで確認しています。

投稿日時 - 2009-11-11 11:20:15

QNo.5438955

困ってます

質問者が選んだベストアンサー

こんにちは。

VBAで小数点を扱う場合、ワークシートのような補正処理がありません。だから、必ず、浮動小数点誤差が存在しますから、ある程度の桁を区切ってあげないといけません。だいたい、小数点の半分ぐらいが、丸め誤差が存在しています。

普通は、CCur などで変換しますが、今回は、小数点5位までありますから、CCur(Currency)は、使えません。Fix 関数や正数だけなら、Int関数を用います。

それから、一旦、変数に置くべきだと思います。

a,b は、そのままですと、Variant/Double 型になっています。

 a = Worksheets("Sheet1").Cells(85, 1).Value
 b = Cells(13, 1).Value

 a = Fix(a * 10 ^ 5) / 10 ^ 5
 b = Fix(b * 10 ^ 5) / 10 ^ 5

このようにして、桁を区切ります。
ただ、正規の方法がどうかは不安が残ります。テキストで読んだ覚えがあるのですが、見つかりません。

投稿日時 - 2009-11-11 15:22:39

お礼

お礼が遅くなり申し訳ありません。
無事、原因と解決法がわかりました。

投稿日時 - 2009-11-15 16:22:26

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.2

桁数を指定して比較すればよいでしょう。
If WorksheetFunction.Round(Sheets("sheet1").Cells(85, 1).Value,5) = WorksheetFunction.Round(Cells(13, 1).Value,5) Then
msgBox "true"
Else
msgBox"false"
End If

投稿日時 - 2009-11-11 11:27:49

お礼

回答ありがとうございます。
上記のやり方で試してみます。

投稿日時 - 2009-11-11 12:49:11

ANo.1

Sheets("sheet1").Cells(85, 1).Value 及び
Cells(13, 1).Value の0.38125は
実数値でしょうか?
計算式でしょうか?

投稿日時 - 2009-11-11 11:25:25

お礼

0.38125は実数値になっています。

投稿日時 - 2009-11-11 12:48:16

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-