
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
VB6.0-整数と余りを求める
-
C#で動的にコントロールを取得...
-
フォームを開くときに、コンボ...
-
世界のナベアツ
-
fortran:角度の範囲を限定させる
-
1つ前の値を変数に保存する方法
-
Excel-vba 文字列と変数を...
-
ラジオボタンの値の取得につい...
-
足して100になるような乱数のア...
-
VBAの定数の使い方で、計算値を...
-
C#でのIF文 時間比較のやり方
-
VBAで72時間タイマーがオーバー...
-
相関係数p値の出し方
-
VB6でのLog
-
数字の位ごとの値を表示するプ...
-
データ構造のmapとは?
-
VisualStudio2022でC言語プログ...
-
Windows11のカメラで動画を撮り...
-
エラーの意味は? Lvalue req...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
Excel-vba 文字列と変数を...
-
フォームを開くときに、コンボ...
-
数字の位ごとの値を表示するプ...
-
VB6.0-整数と余りを求める
-
足して100になるような乱数のア...
-
ラジオボタンの値の取得につい...
-
C#で動的にコントロールを取得...
-
VBAで配列のNULL判定
-
データ構造のmapとは?
-
関数で複数の値を戻り値として...
-
世界のナベアツ
-
VBA コンボボックスの値をスピ...
-
VBAの定数の使い方で、計算値を...
-
スピンボタンで小数点
-
1つ前の値を変数に保存する方法
-
Nullってどういう意味ですか?
-
コンボボックスの名前を変数に...
-
DWORDって
-
vbaで極大値を抽出する方法
おすすめ情報
回答ありがとうございます。
試してみましたが、オーバーフローは無いものの表示が正しくありません…何故か0表示のままになります。
まれに61分表示にもなります。なぜでしょう??