
VBA初心者です。会社で最大72時間のカウントダウンタイマーを作ってと言われ、
時間と分をセル入力して起動するように作ってみましたが、何故か9時間以上に設定するとオーバーフローが発生します…。ネットから対策方法を探してInteger、Longの長整数型で宣言してみましたが、うまくいきません。
Format、Timeserial関数あたりが問題?だとは思いますが、かといって対策方法がわかりません。
ちなみに時間・分・秒表示は必須です。どなたかわかる方ご教授下さい!
以下構文になります。
Sub timer()
Dim limit As Date, cnt_d As Double
limit = DateAdd("n", Range("D4"), Time)
limit = DateAdd("h", Range("B4"), Time)
UserForm1.Show vbModeless
UserForm1.Repaint
Do
cnt_d = DateDiff("s", Time, limit)
UserForm1.TextBox2 = Format(TimeSerial(0, 0, cnt_d), "hh:nn:ss")
If UserForm1.TextBox2 = "00:00:00" Then Exit Do
DoEvents
Loop
End Sub

No.5ベストアンサー
- 回答日時:
>試してみましたが、オーバーフローは無いものの表示が正しくありません…何故か0表示のままになります。
>まれに61分表示にもなります。なぜでしょう??
いくつか、原因が考えられますが、下記の点を修正しました。
1.アクティブシートのB4,D4を最初のタイマー値にしているが、それだと、アクティブシートが変わる可能性があるので
明示的にシートを指定するようにした。(シート名を"Sheet1"にしています。あなたの環境にあわせてシート名を変えてください)
又、あなたが提示されたコードでは、D4(分)は、無視されるので、この値も組み込むようにしました。
B4(時)の最大値は100時間にしています。B4,D4で不正な値の場合は、エラーにするようにしました。
2.Time関数は、翌日になると値が0に戻るので、Now関数に変えました。
3.完了後に"timeout"をメッセージボックスにだしています。不要なら削除してください。
以下のようにしてください。
----------------------------------------------------
Sub timer()
Dim t_hh As Long
Dim t_nn As Long
Dim t_ss As Long
Dim err As Boolean
Dim ws As Worksheet
Dim t1 As Variant
Dim t2 As Variant
Dim t_diff As Double
Dim diff As Long
Set ws = Worksheets("Sheet1")
err = False
t_hh = ws.Range("B4").Value
t_nn = ws.Range("D4").Value
If t_hh < 0 Or t_hh > 100 Or t_nn < 0 Or t_nn > 59 Then err = True
t_ss = t_hh * 60 * 60 + t_nn * 60
If t_ss = 0 Then err = True
If err = True Then
MsgBox ("タイマー不正")
Exit Sub
End If
t1 = Now
t2 = t1 + t_ss
UserForm1.Show vbModeless
UserForm1.Repaint
Do
t2 = Now
diff = t_ss - DateDiff("s", t1, t2)
UserForm1.TextBox2 = sec2hhmmss(diff)
If diff <= 0 Then Exit Do
DoEvents
Loop
MsgBox ("timeout")
End Sub
Public Function sec2hhmmss(ByVal cnt_d As Long) As String
Dim hh As Long
Dim nn As Long
Dim ss As Long
Dim amari As Long
hh = cnt_d \ (60 * 60)
amari = cnt_d Mod (60 * 60)
nn = amari \ 60
ss = amari Mod 60
sec2hhmmss = Format(hh, "00") & ":" & Format(nn, "00") & ":" & Format(ss, "00")
End Function
No.3
- 回答日時:
検証したわけではありませんが以下ではどうですか?
Sub timer()
Dim limit As Date, cnt_d As Double
limit = DateAdd("n", Range("D4"), Time)
limit = DateAdd("h", Range("B4"), Time)
UserForm1.Show vbModeless
UserForm1.Repaint
Do
cnt_d = DateDiff("s", Time, limit)
UserForm1.TextBox2 = Format(cnt_d / 86400, "hh:nn:ss")
If UserForm1.TextBox2 = "00:00:00" Then Exit Do
DoEvents
Loop
End Sub

No.2
- 回答日時:
cnt_dをhh:mm:ss形式の文字列に変換する関数を自前で作成しました。
下記の関数を
UserForm1.TextBox2 = sec2hhmmss(cnt_d)
として呼び出してください。hhは23時間の場合でも、その数値が表示されます。
(72時間の場合、72:00:00のようになります。100時間なら100:00:00になります)
Public Function sec2hhmmss(ByVal cnt_d As Long)
Dim hh As Long
Dim nn As Long
Dim ss As Long
Dim amari As Long
hh = cnt_d \ (60 * 60)
amari = cnt_d Mod (60 * 60)
nn = amari \ 60
ss = amari Mod 60
sec2hhmmss = Format(hh, "00") & ":" & Format(nn, "00") & ":" & Format(ss, "00")
End Function
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel-vba 文字列と変数を...
-
足して100になるような乱数のア...
-
C言語 exitの使い方
-
[シェルスクリプト] 空文字の判...
-
VBAの定数の使い方で、計算値を...
-
【C++/CLI】コンボボックスの値...
-
世界のナベアツ
-
1つ前の値を変数に保存する方法
-
UWSCのcallについて
-
フォームを開くときに、コンボ...
-
数字の位ごとの値を表示するプ...
-
計算機イプシロン
-
ラジオボタンの値の取得につい...
-
C#で動的にコントロールを取得...
-
c言語で乱数を扱うときの
-
Exit Subのような・・・。
-
VB6.0-整数と余りを求める
-
C言語の質問です
-
VBAでC列が入力済みならそのま...
-
データ構造のmapとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
Excel-vba 文字列と変数を...
-
フォームを開くときに、コンボ...
-
VB6.0-整数と余りを求める
-
VBAで配列のNULL判定
-
数字の位ごとの値を表示するプ...
-
フリーランタイマーの時間差分...
-
VBAの定数の使い方で、計算値を...
-
足して100になるような乱数のア...
-
Access2003 オートナンバーの現...
-
DWORDって
-
Xorshiftの値を絞り込む方法を...
-
ラジオボタンの値の取得につい...
-
DataGridView 複数行同時変更...
-
C#で動的にコントロールを取得...
-
VBA コンボボックスの値をスピ...
-
vbaで極大値を抽出する方法
-
Nullってどういう意味ですか?
-
コンボボックスの名前を変数に...
-
データ構造のmapとは?
おすすめ情報
回答ありがとうございます。
試してみましたが、オーバーフローは無いものの表示が正しくありません…何故か0表示のままになります。
まれに61分表示にもなります。なぜでしょう??