Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1405 / 13646 ツリー ←次へ | 前へ→

【74667】なぜ一致しないのですか? へっぽこ 13/8/27(火) 22:26 質問[未読]
【74669】Re:なぜ一致しないのですか? ウッシ 13/8/27(火) 23:57 回答[未読]
【74674】Re:なぜ一致しないのですか? へっぽこ 13/8/28(水) 20:35 お礼[未読]
【74678】Re:なぜ一致しないのですか? kanabun 13/8/29(木) 0:04 発言[未読]

【74667】なぜ一致しないのですか?
質問  へっぽこ  - 13/8/27(火) 22:26 -

引用なし
パスワード
   数値の比較(IF文)で困っています。
基本的なことだと思うのですが、ご教示ください。

セルB3には 1029.505
セルB4には 1029505 が入力されています。

Sub Sample()
  
  If (Range("B3").Value * 1000) = Range("B4").Value Then
    Range("B5") = "OK"    ' 処理(1)
  Else
    Range("B5") = "NG"    ' 処理(2)
  End If

End Sub

この状態で、上記のマクロを実行すると、処理(2)が実行されて
セルB5には NG が表示されます。
1029.505 x 1000 = 1029505 だからセルB4とは一致して、
処理(1)が実行され、セルB5には OK が表示されると思っていました。

なぜか、
セルB3:1019.505、セルB4:1019505 や
セルB3:1029.405、セルB4:1029405 に
修正すると、セルB5に OK が表示されます。

何が間違っているのでしょうか?

【74669】Re:なぜ一致しないのですか?
回答  ウッシ  - 13/8/27(火) 23:57 -

引用なし
パスワード
   こんばんは

excel 誤差 とかでWEB検索すれば色々出てきます。
少数の演算誤差の影響についての対策も色々見つかります。

▼へっぽこ さん:
>数値の比較(IF文)で困っています。
>基本的なことだと思うのですが、ご教示ください。
>
>セルB3には 1029.505
>セルB4には 1029505 が入力されています。
>
>Sub Sample()
>  
>  If (Range("B3").Value * 1000) = Range("B4").Value Then
>    Range("B5") = "OK"    ' 処理(1)
>  Else
>    Range("B5") = "NG"    ' 処理(2)
>  End If
>
>End Sub
>
>この状態で、上記のマクロを実行すると、処理(2)が実行されて
>セルB5には NG が表示されます。
>1029.505 x 1000 = 1029505 だからセルB4とは一致して、
>処理(1)が実行され、セルB5には OK が表示されると思っていました。
>
>なぜか、
>セルB3:1019.505、セルB4:1019505 や
>セルB3:1029.405、セルB4:1029405 に
>修正すると、セルB5に OK が表示されます。
>
>何が間違っているのでしょうか?

【74674】Re:なぜ一致しないのですか?
お礼  へっぽこ  - 13/8/28(水) 20:35 -

引用なし
パスワード
   ウッシさん へ

Excelで小数を扱うときには注意が必要なのですね。

ありがとうございます。
とっても助かりました。

▼ウッシ さん:
>こんばんは
>
>excel 誤差 とかでWEB検索すれば色々出てきます。
>少数の演算誤差の影響についての対策も色々見つかります。

【74678】Re:なぜ一致しないのですか?
発言  kanabun  - 13/8/29(木) 0:04 -

引用なし
パスワード
   ▼へっぽこ さん:

> なぜか、
> セルB3:1019.505、セルB4:1019505 や
> セルB3:1029.405、セルB4:1029405 に
> 修正すると、セルB5に OK が表示されます。

解決みたいですけど、

1029.505 のときも 1000倍して 1029505 になるようにするには
データを入力するセル範囲の表示形式をあらかじめ通貨型にしておくと
(\がついて表示されますが)いいですよ。
通貨型は 元の数値を10000倍した整数にして内部保存していますから、
小数点以下4桁までの実数であれば、誤差が発生しません。

1405 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free