VBAでsleepを使うと固まる!?待機中もフリーズさせずに操作を可能にするDoEventsテクニック

RPA


私はプログラミングの専門家ではありませんが、社内で自動化を推し進めています。

VBAを使うことで、コストをかけずに多くの自動化が実現出来ます。

このブログでは、私が実際に使っている自動化の例を時々共有しています。

スリープ関数で一時待機させるとパソコンが固まっちゃう・・・

PC_TROUBLE

いろいろな場面で、プロセスを待機させることが必要になることがあります。

しかし、スリープ関数を使ってある程度長い時間一時停止させるとエクセルが固まってしまいます。

加えて、待機中はエクセルを操作ができません。

この記事では、VBAを使用してExcelマクロを一時停止させる方法を紹介し、作業の流れをスムーズに保つテクニックを探ります。

特定のプロセスを一定時間停止させる必要がある場合、真っ先に思いつくのはスリープ関数です。

待機させる場面とその待機時間にもよりますが、ある程度長い時間待機させるとExcelやWindows全体が固まってしまいます。

VBAには、アプリケーションの応答性を維持しながら待機する方法がいくつかありますので、今回はその手法の一つを紹介します。

DoEvents関数を用いた効果的なループ手法

DoEvents関数を使用することで、Excel VBAは背後で待機しながらも、他のイベント処理を続けることができます。

これにより、Excelが応答しなくなることを防ぎつつ、一定時間の処理を一時停止できます。以下に、この方法を実装する簡単な例を示します。

Sub WaitWithDoEvents()
    Dim startTime As Double
    startTime = Timer
    ' 10秒間待機
    Do While Timer < startTime + 10
        DoEvents
    Loop
    MsgBox "10秒が経過しました。"
End Sub




Do While Timer < startTime + 10 ←ここの「10」を変更すれば待機時間が変わります。

このコードでは、Timer関数を使用して現在の時刻を取得し、そこから10秒間のループを開始します。DoEventsをループ内に置くことで、Excelがその他のイベント、例えばユーザーの入力や画面更新などに応答できるようになります。

どのような場面で使うか

この方法の最大の利点は、プロセスの待機中でもExcelがフリーズすることなく、ユーザーがシートの操作や他のタスクを行える点にあります。また、DoEventsを使用することで、必要に応じて待機処理を中断するためのユーザーインターフェース(例えば停止ボタンなど)を提供することも可能です。

例えばこんなときに使えます

ユーザーによるデータ入力待機

VBAを使って入力待機時間を設定することで、Excelの柔軟性を活かしたインタラクティブな仕組みを作ることができます。

例えば、クイズを出題してから10秒待機して、その間に回答を入力してもらい、時間になったら答え合わせをさせたりすることもできます。

停止ボタンの活用

長時間実行されるマクロの場合、ユーザーが任意のタイミングでプロセスを中断できるようにすることが望ましいことがあります。待機時間を組み込んだループ処理をさせる場合、その待機時間中にもExcelのUIが反応し続けるため、停止ボタンなどのUI要素をクリックしてプロセスを中断することが可能になります。これにより、ユーザーはよりコントロールしやすい操作環境を得られます。

まとめ

DoEventsを使用したこの待機方法は、Excelマクロの自動化において、Windowsのフリーズを避けながら一定時間処理を停止させる手段の一つです。

皆さんが作成しているVBAに是非組み込んで使ってみてください。

コメント

タイトルとURLをコピーしました