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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
1つ前の値を変数に保存する方法
-
VB6.0-整数と余りを求める
-
Excel-vba 文字列と変数を...
-
スピンボタンで小数点
-
フォームを開くときに、コンボ...
-
LOG(10)2の意味は?
-
足して100になるような乱数のア...
-
世界のナベアツ
-
丸め誤差の影響
-
乱数の最大値
-
数字の位ごとの値を表示するプ...
-
値の受渡方法
-
フリーランタイマーの時間差分...
-
関数で複数の値を戻り値として...
-
UWSCのcallについて
-
VBAでダブルコーテーション入り...
-
excelの、ある数式内の{}の意...
-
エラーの意味は? Lvalue req...
-
VBAのWorksheetFunctionの引数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
VB6.0-整数と余りを求める
-
数字の位ごとの値を表示するプ...
-
足して100になるような乱数のア...
-
DWORDって
-
VBAの定数の使い方で、計算値を...
-
世界のナベアツ
-
1つ前の値を変数に保存する方法
-
ラジオボタンの値の取得につい...
-
フリーランタイマーの時間差分...
-
C#で動的にコントロールを取得...
-
UWSCのcallについて
-
DataGridView 複数行同時変更...
-
10進数をアスキーコードに変換
-
4択問題のプログラムでランダム...
-
データ構造のmapとは?
-
VBAで配列のNULL判定
-
VBAで72時間タイマーがオーバー...
おすすめ情報
回答ありがとうございます。
試してみましたが、オーバーフローは無いものの表示が正しくありません…何故か0表示のままになります。
まれに61分表示にもなります。なぜでしょう??