「みんな教えて! 選手権!!」開催のお知らせ

Excelマクロにて、タイマーで自動更新は出来るのでしょうか?

Excelマクロの初心者です。

最近関数にて、時間の計算を行うbookを作成しましたが、
下記の様に手動で現時刻欄を更新している状態です。
(これは1カ所ですが、実際には複数箇所を行いたいです。)


Sub 残り時間を更新()
'
Range("C21").Select '現時刻欄を選択
ActiveCell.FormulaR1C1 = "=NOW()" '使用開始時刻欄に現時刻を再設定
Application.CutCopyMode = False

End Sub


これを別のマクロにくっつけて、例えば10分おき位に自動で
更新が出来る様な事は出来ますでしょうか?

理想は、セルに自動更新時間が任意に設定でき、その数字の基で
タイマーが時間が決まり、実行ボタンでタイマー開始、停止ボタン
で実行キャンセルといった、VB上では出来そうな事をExcel上
でも可能でしょうか?

良きアドバイスをいただきたいと思います。
よろしくお願いいたします。

A 回答 (5件)

#1のimogasiさんのご指摘の「初心者が行う域を超えている」というのは、私も同感です。

Excelでも作れますが、APIタイマーは、やむにやまれず、どこかで発表したことがあります。

GetTickCount, SetTimer 等を使いますから、調べてくださってもよいです。ただ、正直なところ、実験的というか、かなり微妙というか、安定性が今ひとつのような気がしますね。今でも、お仕事で使う方にとっては中途半端なものを作って申し訳ないと思っています。

イベントの一種ですから、稼働中でも、Excelやマクロは動きます。ファイルを閉じなければよいです。

しかし、以下のように、UserForm で、OnTime と組み合わせたほうがよいと思います。時間表示も可能です。理由は詳しくは知らないのですが、UserForm の中は、独立して動くことが多いです。ただし、UserFormを立ち上げていると邪魔ですから、GetWindowLong, SetWindowLong, で、隠す方法があります。

これに、OnTime を別に設定させればよいです。
>実行ボタンでタイマー開始、停止ボタンで実行キャンセル
これは、ヘルプを参照してください。安定して使用できます。

分からなければ、しばらくの間でしたら、その辺りの返事を含めて書きます。

ただし、UserForm 起動はフラグを立てて、起動しているのを忘れて、ファイルを閉じないような安全装置は付けてください。ハングする可能性があります。

'//UserForm プロパティは、ShowModal False
'//Labelをひとつ用意してください。
Private Sub UserForm_Activate()
Dim currentTime As String
 While UserForms.Count > 0
  currentTime = Format$(Time(), "h:nn:ss")
 If currentTime <> Label1.Caption Then
  Label1.Caption = currentTime
 End If
  DoEvents
 Wend
End Sub

Private Sub TimerRefresh()
 If UserForms.Count = 0 Then Exit Sub
 UserForm1.TimerRefresh
End Sub
    • good
    • 0
この回答へのお礼

ご指摘をありがとうございました。
Excelでは厳しいという事がわかりました。
PCのスペックもかなり悪いですし、ハングしたら
そのまま壊れそうな・・・。
ですので、手動更新等の別の方法で考えたいと思います。

お礼日時:2010/07/27 22:54

私ならExcelでのタイマー処理は


Application.OnTime
を使用します。
    • good
    • 0
この回答へのお礼

アドバイスをありがとうございました。
タイマーでマクロを実行させようと思ったのですが、
肝心のPC等の能力や負荷の事を想定しておりませんでした。
スペックがかなりマシンですので、手動更新等の別の方法
で再検討したいと思います。

お礼日時:2010/07/27 22:52

windows APIを使えば可能だと思います。



Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
と宣言しておき必要なところで
Sleep 1000
で1秒休みます(CPUのの使用権はOSに戻る)

どこにこのコードをどう入れるかは十分検討してください。
    • good
    • 0
この回答へのお礼

アドバイスをありがとうございました。
PC等の能力や負荷の事を想定しておりませんでした。
スペックがかなり悪いので、別の方法で再検討したい
と思います。

お礼日時:2010/07/27 22:47

インターバルタイマを使うにはプログラムが稼働


していなければなりませんが、プログラム実行中は
Excelの操作はできません。つまり、Excelでも
操作し、かつタイマも使いたいと言うのは不可能
です。「DoEventsを使えば」というのはもの凄く
効率が悪く(何もしなくてもCPU使用率100%のまま)、
かつ事故が起き易い方法なので、とても採用でき
ない方法です。
また、VBAはマルチスレッドに対応していないので、
APIを使っても対応できません。
    • good
    • 0
この回答へのお礼

ご指摘をありがとうございました。
PCに掛かる負荷の事を考えておりませんでした。
別の方法に変更しようと思います。

お礼日時:2010/07/27 22:45

VBA出出来ると思うが、マクロの初心者が行う域を超えていると思う。


また不安定だと思う。エクセルの起動をしておく問題とか。
こういうのはエクセルVBAの範囲を超えている。なんでもエクセルの誤り・不適当例ではないか。
これ(タイマーなど)を使わないような処理設計を考えるべきです。
やりたいことの(本件との絡みだけで良いが)全貌を文章で書けないか。
それの道具立てを識者に批判してもらっては。
質問があいまいで良くわからないが、発想が質問者の思いつきで、普通とは違う路線になっているようにおもう。
いままで勤怠管理・時間外計算でエクセル関数で処理するパターンと、質問者のニーズはどう違うのか。
    • good
    • 0
この回答へのお礼

ご指摘をありがとうございました。
Excelでは厳しいという事がわかりました。
別の方法で考えたいと思います。

お礼日時:2010/07/27 22:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報