VBA OSに制御を移すDoEvents関数の使用方法を徹底解説



The following two tabs change content below.
アバター

taka

あることがキッカケでVBAを独学で勉強しました、今ではブログを通してVBAでできることを解説しつつ、VBAや他の言語の勉強、ブログ運営の勉強をしています(^^♪

どうも、taka(@takabou63)です(^^♪

さて、VBAでループ処理のコードの中にたまに見かける【DoEvents】という記述を見たことありませんか?

私の今までの記事の中でもDoEvents関数を多く使っています。

正直、コードの内容によっては【DoEvents】を消してコードを実行しても問題なく動作します。(上記の記事のコードは動作しません。)

では何のためにこの関数が使われているのか?を含めて【DoEvents関数】についてご紹介していきます!

VBAのDoEvents関数の使い方

DoEvents関数は、処理の途中にOS(オペレーティングシステム)に制御を移すための関数です。
時間のかかる処理やループ処理を実行した場合処理が終了するまでOSは制御が不可能になります(;^ω^)
ですが、DoEvents関数を利用すると、一時的にOSに制御を移して処理を行うことができます。

その代わり、DoEvents関数を使うと安定性を保つことができますが、処理速度の低下などのデメリットもありますので使い方には気を付けましょう(*_*;

DoEvents関数の書式

DoEvents関数の書式は以下の通りです。

DoEvents関数はループ中に記述してください

VBAで時間のかかるプログラムを実行している場合、処理中は画面をクリックしたりしても処理が終わるまで反応がありません。

ですがDoEvents関数を処理の間に挟むと、クリック操作などの処理も可能になるのです(^^♪

ユーザーフォーム上にキャンセルボタンなどのコントロールを設置することが可能になり、プログラム処理を途中で止めるなどが可能になるんです。

DoEvents関数の使用例

では試しに、DoEvents関数を使用してプログレスバーコントロールに中断ボタンを設置して処理の中断を可能にしてみましょう!

適当に下記のようなユーザーフォームを用意してみます。

  1. プログレスバーコントロール1つ
  2. コマンドボタンコントロール2つ

プログレスバーコントロールについてはこちら【VBA コントロール【プログレスバー】を使う

下記のコードでは、ループ処理の中に【True】に切り替わったら処理を中断するという処理を組み込んで置き、中断ボタンには中断ボタンを押すと【True】に切り替える、いわゆるスイッチのような処理を与えておきます。

今回のように【処理中にボタンを押す】という行為はDoEvents関数が使われていないと使用できません。

DoEvents関数を外して実行すると中断ボタンを押すことができません。

DoEvents関数の使用デメリットと解決策『処理速度の低下は防げる』

DoEvents関数を使用する場合、一つ注意点があります、それは処理速度の低下です。

DoEvents関数はループ中の処理の中断などをする場合の制御には欠かせない大変便利な関数ですが、その代わり処理速度が著しく低下する場合があります。

もし処理速度の低下を下げたい場合は、DoEvents関数の使用を控えるか、WindowsAPIの「GetInputState関数」を使用することで回避することができます。

WindowsAPIのGetInputState関数の使い方

GetInputState関数はWindowsAPIですので『VBAでAPIを使う方法』で紹介しているように、【Declareステートメント】を使用して宣言する必要があります。

宣言文は以下のようにします。

GetInputState関数はWindowsのイベントキューに待機中のイベントがあるかどうかを確認する関数です。
イベントが発生している場合だけDoEvents関数を呼び出し制御をOSに渡すことで余分な処理を減らし、処理速度の低下を防ぐという使い方ができます。
下記のようにIFステートメントを使用して使います。

では実際にGetInputState関数を使うとどれくらい処理に差が出るのかを試してみましょう!

GetInputState関数とDoEvents関数で処理速度の差を比べてみた

さて、実際にどれくらいの処理速度に差が出るのか試してみます。

今回使用するコードは以下の通りです、コメントアウトして結果を記載していますが。

  • DoEvents関数のみ・・・・30.86秒
  • GetInputState関数とDoEvents関数・・・0.015秒

と、かなりの差が出ていることがお分かりいただけるかと思います。(PC環境によって大きく差があるかもしれません)

もしDoEvents関数で処理速度の低下を気にしている場合はGetInputState関数を使ってみると事をお勧めします(^^)

ちなみに、処理時間の方法は「VBA【GetTickCount関数(API)】で処理の時間を取得する」で紹介しています(^^♪

フォロー・チャンネル登録お願いします

■Twitterフォロー

■YouTubeチャンネル登録

ファイルやコードの利用、WEBサイトの利用について

サンプルコードなどは当サイトの免責事項をよくお読みになってからお使いください。

Sponsored Link

 

WordPressでブログを始めるなら

WordPress簡単インストール&安心の安定性

レンタルサーバー Xserver

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です