オーバーフロー

タグの編集
投稿者 ヘルプ  (社会人) 投稿日時 2008/12/19 23:43:39
Dim a As Integer '現時間
    Static b As Integer '合計時間格納
    Static c As Integer '前時間
    Dim d As Integer 
    Dim e As Integer 
    Dim f As Integer
        f = Val(UserForm1.TextBox1.Text) - 1
    '現時間
    If UserForm1.TextBox1.Text + 1 Then
        a = (Minute(Time) * 60) + Second(Time)
    End If
    
    '秒合わせ
    If d < c Then
        Val (a) + 3600
    End If
    
    算出
    If UserForm1.TextBox1.Text + 1 Then
    d = c - a 
    If d = -a Then
       d = 0
    End If
    b = b + d 'bは合計時間
    e = b / f               ←ここでオーバーフロー
    UserForm1.TextBox8 = Round(e, 1)
    c = a '現時間代入
    End If


オーバーフローしてしまいます。
どうすればよいでしょう。
時間の差をだしたい。
投稿者 るしぇ  (社会人) 投稿日時 2008/12/20 00:43:38
d は Static じゃないから毎回 0 になると判断して c が正ならつねに d < c
が成り立ちます。
c は
c = a '現時間代入
で、システム時刻の分と秒の合計。つまり必ず正ですね。
'秒合わせ
が何を意味しているのか不明ですが、条件判断の必要はありません。
まあ、何も処理してないので何の影響もありませんが、邪魔なので全部削除
しましょう。

If d = -a Then
この条件は直前の
d = c - a
に代入して - a = c - a
c = 0 にした方が初回条件として分かり易いので修正。

Dim e As Integer 
e = b / f
UserForm1.TextBox8 = Round(e, 1)
e が整数型なので Round する前に丸められています。
これも意味が無いので削除。

オーバーフローになる処理を逆に追っていくと
e = b / f               ←ここでオーバーフロー
f は入力値なので置いておいて
b = b + d 'bは合計時間
d の積算になってて
d = c - a 

ここで1つ前の処理の
c = a '現時間代入
と見比べると時間が正常に未来へ流れていれば
d は、つねに負で積算されていくから、いつかは必ずオーバーフロー
します。

どこまで負の数を積算していきたいのですか?
…その処理に特に意味があるとは思えませんが、とりあえず
ある程度大きくなったら 0 に戻せば良いのでは?
投稿者 ヘルプ  (社会人) 投稿日時 2008/12/20 08:50:25
すいませんうち間違えてました。

Dim a As Integer '現時間
    Static b As Integer '合計時間格納
    Static c As Integer '前時間
    Dim d As Integer 
    Dim e As Integer 
    Dim f As Integer
        f = Val(UserForm1.TextBox1.Text) - 1
    '現時間
    If UserForm1.TextBox1.Text + 1 Then
        a = (Minute(Time) * 60) + Second(Time)
    End If
    
    '秒合わせ
    If d < c Then
        Val (a) + 3600
    End If
    
    算出
    If UserForm1.TextBox1.Text + 1 Then
    d = a - c                            ←ここ間違えてました。
    If d = -a Then
       d = 0
    End If
    b = b + d 'bは合計時間
    e = b / f               ←ここでオーバーフロー
    UserForm1.TextBox8 = Round(e, 1)
    c = a '現時間代入
    End If

親切にご回答ありがとうございます。
初心者なものでご迷惑おかけしております。
このプログラムだと0の除算がなんとかってエラーが出ました。
申し訳ないです。
どう改善すれば良いかご指導お願いします。
投稿者 るしぇ  (社会人) 投稿日時 2008/12/20 16:35:16
「0で割る計算は不定でも不能でもない,定義できない」
数学の話になるので、詳しく知りたい場合は数学のサイトを検索してみてください。

高校の数学かな?「0では割り算できません」と習うのは。。。
1÷0の答えは?一般的には出せないのでプログラムでも計算できません。

分母が0のときは割り算しないようにしてください。
投稿者 るしぇ  (社会人) 投稿日時 2008/12/20 23:04:58
>    d = a - c                            ←ここ間違えてました。
>    If d = -a Then
修正前と同じように連立方程式を解いて
-a = a - c
c = 2a
前回の処理時間が現時間の2倍の時のみ成り立つ。。。
・・・何がどう間違いでどう改善されたのか分かりません。

d = 0 の処理が実行されたところで積算され続ける b が改善される
わけでもなく。。。
オーバーフローも相変わらずですね。
投稿者 cupid  (社会人) 投稿日時 2008/12/21 22:06:49
要所〃〃でDebug.Printを入れなさい。でないと、上達はおぼつかない。
自分としては、Debug.Printより、Form上のLabelに書き出す方が好きですが、
それでもDebug.Printの方が楽なのは確かです。