Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : その他)
セルに数値を入れると表示が止まる
投稿日時: 21/02/19 05:59:02
投稿者: numabukuro
メールを送信

セルA1に、時間を表示するものです。
他のセルに、文字や数値を入れるとセルA1の表示が止まってしますのはなぜですか?
よろしくお願い申し上げます。
 
Sub myTimer3()
    Dim i As Integer
    
    flag = True
     
    Do While flag = True
        Application.Wait [Now()] + 1000 / 86400000
        Range("A1").Value = Timer
        DoEvents
    Loop
 
End Sub

回答
投稿日時: 21/02/19 08:28:05
投稿者: simple

なんらかの入力をセルに入れる過程で、
セルの「編集状態」に入りますよね。
一般的に、「編集状態」ではマクロが動作しないこととなっている(仕様)ので、
その関係でマクロ実行が止まるのではないでしょうか。
 
仮に、ボタンを押して、セルに自動入力するようなことにすれば、
編集状態を経由しないので、止まらないでしょうね。
# あくまで架空の話であって、それを推奨するわけではありません。

回答
投稿日時: 21/02/19 09:23:09
投稿者: Suzu

他に、入力を契機としたVBA が動作していませんか?
 
 
質問とは関係ありませんが、1秒ごとに 「1」数値を上げるためのVBAですよね。
それだけの為に、PCの負荷を占有するのは 非効率だと思っています。

投稿日時: 21/02/19 13:45:26
投稿者: numabukuro
メールを送信

simple様
 
ボタンを作ると、うまくできました。
ありがとうございました。
 
by numabukuro
 
 
 
Suzu様
 
ありがとうございます。
動作していません。
VBのtimer機能を作っています。
1秒間に1回、イベントを発生させるためです。
 
by numabukuro
 
 

回答
投稿日時: 21/02/20 09:02:11
投稿者: simple

私もSuzuさんの意見に同意します。
VBには元々Timerクラスがあるので苦労はしませんが、
VBAでそれを作るのは大変です。
今のような仕組みだと、資源をすべてWaitが使ってしまうのでNGでしょう。
OSの時計表示ではNGなんですか?
 
どうしてもということであれば、私なら、Application.OnTimeを使うかもしれません。
(1)マクロmainをボタン登録。  これを押すことで処理を開始します。
(2)マクロmyResetをボタン登録。 これを押すことで処理を中止します。
 

Option Explicit
Dim nextTime As Date
Sub main()
    time表示
End Sub

Sub time表示()
    [A1] = Timer / 86400
    nextTime = Now() + TimeValue("0:0:01")
    Application.OnTime nextTime, "time表示"
End Sub

Sub myReset()
    On Error Resume Next
    Application.OnTime EarliestTime:=nextTime, _
        Procedure:="time表示", Schedule:=False
End Sub

A1セルには、表示形式 h:mm:ss を設定しておきます。
なお、OnTimeの時刻の精度は余り高くないと聞いたことがあります。
使えるかどうかは、使用用途によるでしょうね。
また、OnTimeの仕様については、ヘルプを参照してください。
(予約された時刻にセル編集中であったりすると、同様に表示待ちとなります(仕様)が、
  止まることはないでしょう。)

投稿日時: 21/02/21 06:14:27
投稿者: numabukuro
メールを送信

simple様
 
目から鱗が落ちるご指導、誠にありがとうございました。
Application.OnTime は、初めて知る内容でした。
ご親切に詳しいコードまで付けていただきまして、申し訳ございませんでした。
生徒へわかりやすい教材を与えるため頑張ります。
 
by numabukuro