
No.1ベストアンサー
- 回答日時:
1レスです。
きっと、もっとずっと簡単に出来るとお考えなのでしょう。
例えば、ユーザーがどこかのセルを編集状態にしたらば、
どうやっても、カウントダウンを進める(VBAからセル値を変える)ことは出来ません。
そういう理由から、ユーザーフォームに表示させるのが一般的ではあります。
何故、セルに表示させたいのでしょう?
10分の間、ExcelやVBAは何もしないのでしょうか?
途中でカウントダウンを止めたり、ブックを閉じたりすることはあるでしょうか?
そもそも何故カウントダウンが必要なのでしょう?
等々、疑問は多数湧いてくるものの、すべてに応える体力はありません。
経験してみないと、こちらが何を言っているのかも解らないと思います。
一応、書かれたオーダーには応えています。
中でも無難な(トラブルの少ない)手法を選んだつもりです。
ただ、これが(仕様的に)実際に役に立つのかどうかは、ご本人にしか判りません。
これはあくまでテスト用サンプルです。
テストしてみて求める仕様との違いを確かめながら、仕様をはっきりさせて、
改めて、全体を見通して設計を見直してみてください。
若しくは、目的、用途、条件、といったことを十分に文章化した上で、
あらたに相談するとか、質問を建て直した方が、解決は近いと思います。
ご使用の環境が書かれていませんので、念の為、標準モジュールの記述は
Excel 32ビット版・64ビット版、両方、別々に書いておきました。
どちらかを正しく選ばないとコンパイルエラーになります。
ThisWorkbookモジュールの記述は共通です。
' ' 〓〓〓〓〓〓〓〓標準モジュール・32ビット版〓〓〓〓〓〓〓〓
Option Explicit
Public flgStopTimer As Boolean
Private Declare Function SetTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) _
As Long
Private Declare Sub KillTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long)
Private oTargetRange As Range
Private dtTargetTime As Date
Private nTimerIdx As Long
Private Const dtTimeSpan As Date = #12:10:00 AM# ' 10分後
Private Const nIntervalMilliSecond As Long = 1000& ' 1秒間隔
Sub TestCountDown()
Call StartCountDown
End Sub
Private Sub StartCountDown()
dtTargetTime = Now + dtTimeSpan
Set oTargetRange = Sheets("Sheet1").Cells(1, "A")
oTargetRange.Value = dtTimeSpan
oTargetRange.NumberFormat = "mm:ss"
' With Cells(2, "A")
' .Value = dtTargetTime
' .NumberFormat = "h:mm:ss"
' End With
nTimerIdx = SetTimer(0&, 0&, nIntervalMilliSecond, AddressOf RcvEvent)
End Sub
Private Sub RcvEvent(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal idEvent As Long, ByVal dwTime As Long)
If Now > dtTargetTime Or flgStopTimer Then
KillTimer 0&, idEvent
nTimerIdx = 0&
Set oTargetRange = Nothing
Else
On Error Resume Next
oTargetRange.Value = dtTargetTime - Now
On Error GoTo 0
DoEvents
End If
End Sub
Private Sub StopCountDown()
KillTimer 0&, nTimerIdx
nTimerIdx = 0&
Set oTargetRange = Nothing
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
' ' 〓〓〓〓〓〓〓〓標準モジュール・64ビット版〓〓〓〓〓〓〓〓
Option Explicit
Public flgStopTimer As Boolean
Private Declare PtrSafe Function SetTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As LongPtr, _
ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) _
As LongPtr
Private Declare PtrSafe Sub KillTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As LongPtr)
Private oTargetRange As Range
Private dtTargetTime As Date
Private nTimerIdx As LongPtr
Private Const dtTimeSpan As Date = #12:10:00 AM# ' 10分後
Private Const nIntervalMilliSecond As Long = 1000& ' 1秒間隔
Sub TestCountDown()
Call StartCountDown
End Sub
Private Sub StartCountDown()
dtTargetTime = Now + dtTimeSpan
Set oTargetRange = Sheets("Sheet1").Cells(1, "A")
oTargetRange.Value = dtTimeSpan
oTargetRange.NumberFormat = "mm:ss"
' With Cells(2, "A")
' .Value = dtTargetTime
' .NumberFormat = "h:mm:ss"
' End With
nTimerIdx = SetTimer(0&, 0^, nIntervalMilliSecond, AddressOf RcvEvent)
End Sub
Private Sub RcvEvent(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal idEvent As LongPtr, ByVal dwTime As Long)
If Now > dtTargetTime Or flgStopTimer Then
KillTimer 0&, idEvent
nTimerIdx = 0^
Set oTargetRange = Nothing
Else
On Error Resume Next
oTargetRange.Value = dtTargetTime - Now
On Error GoTo 0
DoEvents
End If
End Sub
Private Sub StopCountDown()
KillTimer 0&, nTimerIdx
nTimerIdx = 0^
Set oTargetRange = Nothing
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
' ' 〓〓〓〓〓〓〓ThisWorkbookモジュール 共通版〓〓〓〓〓〓〓
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.Run "StopCountDown"
End Sub
Private Sub Workbook_Open()
Application.OnTime Now, "StartCountDown"
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
御礼が遅くなりました。私はVBAは全く分からないのですが、安易な質問で大変な労力をおかけしました。
しかし、お蔭様で頂いた方法で初期の目的を達することができました。有難うございました。
ご指摘の通り、安易にできると考えておりましたので、今後は質問のし方も考えたいと思います。拝
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- Excel(エクセル) 表計算ソフトcalcにおいて、1時間10分を1.1と表記する方法とそれらを集計する方法は? 4 2022/04/06 16:54
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Visual Basic(VBA) エクセル VBA 条件によるセル点滅 お詳しい方 ご教授をお願いします。 Excelファイルにて 現 1 2022/11/03 15:53
- Excel(エクセル) エクセルにサムネイル画像組み込み 2 2022/09/02 17:13
- Excel(エクセル) エクセルのセル値に対応してマクロを実行する方法を教えてください セルA1が「1」の時にマクロ名「マク 2 2022/06/19 18:45
- Excel(エクセル) エクセルマクロ セルをクリックするたびに記号を入力 1 2022/10/13 19:47
- Visual Basic(VBA) エクセルVBAについて質問です。 セルA1に"あ" セルB3に"い" セルC5に"う" と入力されて 2 2023/06/10 13:24
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/16 14:36
- Visual Basic(VBA) 昨日、質問した件『VBA にて、条件付き書式で背景色を設定しているセルの範囲で、背景色付きのセルをカ 4 2022/04/07 14:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelシート内セル記述の違いに...
-
初歩的な質問ですがよろしくお...
-
フォーム内のテキストボックス...
-
【vba】フォームに書いてあ...
-
Excel VBAで、ユーザーフォーム...
-
エクセルVBA 時間のカウントダ...
-
モジュールシートの置換え等をE...
-
定義、設定、参照されている変...
-
EXECEL VBA コマンドボタンか...
-
Excelで時刻になったら知らせて...
-
KAKASI[変換ソフトをperlで使う...
-
シートモジュールで使う変数を...
-
python2.7 importについて
-
ラズパイ3と音声認識ソフトJul...
-
どのファイルを開いた時もマク...
-
Excel VBA 『Call』で呼び出す...
-
変数のことで、、(初心者)
-
vba で f1 キーを押すと、特定...
-
モジュールからフォームのボタ...
-
SendKeysの使い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
ユーザー定義関数に#NAME?が返...
-
vba userFormのSubを標準モジュ...
-
Excel VBA 定義されたプロージ...
-
モジュールとクラスの違いって...
-
モジュールの最大数はいくつな...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
VBでグローバル変数を宣言するには
-
【vba】フォームに書いてあ...
-
SendKeysの使い方について
-
モジュールからフォームのボタ...
-
VBAで旧字体を異字体に一括で変...
-
モジュールとは何ですか
-
ExcelでTelnetを動かしたい
-
標準モジュールを削除したい。(...
-
VBA This Workbookモジュール...
-
Access VBA標準モジュールにつ...
おすすめ情報