Excel VBA質問箱 IV

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

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


2311 / 13644 ツリー ←次へ | 前へ→

【68781】時刻シリアル値には誤差が生じますか? たかC 11/4/17(日) 11:03 質問[未読]
【68782】Re:時刻シリアル値には誤差が生じますか? neptune 11/4/17(日) 11:17 回答[未読]
【68783】Re:時刻シリアル値には誤差が生じますか? たかC 11/4/17(日) 12:17 お礼[未読]
【68784】Re:時刻シリアル値には誤差が生じますか? kanabun 11/4/17(日) 12:51 発言[未読]
【68785】Re:時刻シリアル値には誤差が生じますか? たかC 11/4/17(日) 13:20 お礼[未読]

【68781】時刻シリアル値には誤差が生じますか?
質問  たかC  - 11/4/17(日) 11:03 -

引用なし
パスワード
   初めて質問させていただきますよろしくお願いします
以下のコードは

1、変数tmcntにシリアル値で10時を代入する
2、シリアル値で1分づつ足していってtmcntが11時になったら"11時ですよ"と表示させる

ことを意図したものです。

ところが、tmcnt=vol_11になっても
msgboxのほうに分岐が行きません
(ローカルウインドウでは両方とも0.458333333333333)

これは割り切れない数字を足していくという
誤差によって生じたものなのでしょうか?
それともなにか、きわめて基本的なことがわかっていないことによるものなのでしょうか?

お教えいただければ幸いです


Sub test_t()
Const vol_min As Double = 1 / 24 / 60
Const vol_10h As Double = 10 / 24
Const vol_11h As Double = 11 / 24
Dim tmcnt As Double
  
tmcnt = vol_10h

  For i = 1 To 100
  tmcnt = tmcnt + vol_min

    If timcnt = vol_11h Then
    MsgBox ("11時ですよ")
    End If

  Next

End Sub

【68782】Re:時刻シリアル値には誤差が生じますか?
回答  neptune  - 11/4/17(日) 11:17 -

引用なし
パスワード
   ▼たかC さん:
>これは割り切れない数字を足していくという
>誤差によって生じたものなのでしょうか?
>それともなにか、きわめて基本的なことがわかっていないことによるものなのでしょうか?

以下に概要を説明してありますので読んでみてはどうですか?
シリアル値も
「データ型と演算誤差についての注意」
ht tp://support.microsoft.com/kb/409744/ja

その他にも「浮動小数点数型 誤差」をキーワードにググれば沢山ヒットします。

更に「日付型」「シリアル値」等をググって見れば理解は深まると思います。

【68783】Re:時刻シリアル値には誤差が生じますか?
お礼  たかC  - 11/4/17(日) 12:17 -

引用なし
パスワード
   neptuneさん お返事いただきありがとうございます。

教えていただいたリンク先早速読んでみます。
また、検索でもいろいろ勉強したいと思います
ありがとうございました。

【68784】Re:時刻シリアル値には誤差が生じますか?
発言  kanabun  - 11/4/17(日) 12:51 -

引用なし
パスワード
   ▼たかC さん:

>ところが、tmcnt=vol_11になっても
>msgboxのほうに分岐が行きません

>これは割り切れない数字を足していくという
>誤差によって生じたものなのでしょうか?
>それともなにか、きわめて基本的なことがわかっていないことによるものなのでしょうか?

誤差の件はそのとおり( = で比較するより、>=としたほうがよい)ですが、
メッセージに行かない原因は
ほかにもあります。

>Dim tmcnt As Double

>    If timcnt = vol_11h Then

モジュールの先頭に
Option Explicit
と書いてからコンパイルしてみてください。
変数i と 変数timcnt が「宣言されていません」とコンパイラから
警告があると思います。
それで、なぜメッセージに行かないかわかると思います。

【68785】Re:時刻シリアル値には誤差が生じますか?
お礼  たかC  - 11/4/17(日) 13:20 -

引用なし
パスワード
   浮動小数点の問題はともかくとして
tmcntになっていなければならないところが
timcntになっていたらまともに動作するわけがないですね

かなり恥ずかしいです

もう少し複雑なコードを作っていて
単純化して質問したつもりだったのですが
もし次回質問させていただく場合はちゃんと推敲の上投稿させていただきたいと思います


ご指摘ありがとうございました

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