【ExcelVBA入門】DoEventsを使って処理を途中で止める方法を徹底解説!

皆さんは、VBADoEnents関数を使って処理をキャンセルする方法を知っていますか?

キャンセルボタンなどを実装するときなど、処理の途中で止めたいケースはありますよね。そこで今回は、DoEvents関数の基礎的な使い方といった基礎的なことから、

  • サンプルコードを使った具体的な使い方
  • 処理速度を保ちつつDoEventsを実行する方法
  • 合わせて覚えると便利なユーザーフォームの作り方

といった応用的な方法まで、徹底的に解説します!

DoEvents関数の使い方とは

DoEvents関数は、処理を途中で止めてOSに処理を渡すための関数です。たとえば、ループ処理中にキャンセルボタンを押す場合などに使います。以下のように書くことで、処理を途中で止めてOSに処理を渡すことができます。

この処理中にキャンセルボタンを押した場合はOSに処理が移る → キャンセルボタンのクリックが実行されるため、処理を途中で止めることができます。

サンプルコード

次に、具体的なサンプルコードをもとに、使い方を解説します。

画像:ユーザーフォームで作った画面

ユーザーフォームのコードサンプル:

画像:実行結果

CommandButton1_Clickで実行ボタンクリック時の処理、CommandButton2_Clickでキャンセルボタンクリック時の処理を書いています。

キャンセルボタンのクリック判定に使うために、キャンセルボタンクリック時にグローバル変数(judgeStop)をTrueに変更し、実行ボタンクリック時のループ処理でjudgeStopがTrueだったときのみ処理を停止しています。

このように、DoEvents関数 + Subをまたいで使えるグローバル変数を組み合わせると簡単にキャンセル処理を作ることができます。グローバル変数については以下で詳しく解説しているので、気になる方は見てみてくださいね!

【ExcelVBA】グローバル変数を使って開発効率を上げる方法とは
更新日 : 2019年6月11日

DoEvents関数で処理が重たくなった時に試す方法

DoEvents関数は他の処理に影響が出ないか調べてからOSに処理を渡すため、処理によっては実行速度が落ちてしまうことがあります。そのため、GetInputState関数とあわせて使うのがおすすめです!GetInputState関数はイベントキューに待機中のイベントのみ調べることができます。

そのため、イベントが発生しているときだけOSに制御を渡すことができるようになり、処理時間を大幅に短縮することができます。

サンプルコード:

処理速度が遅くなってしまった場合は、こちらも合わせて覚えておくと便利ですね。

補足:合わせて覚えると便利なユーザーフォームの作り方

補足ですが、今回のサンプルコードで紹介した画面は、ユーザーフォームを使って作ることができます。ユーザーフォームの使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!

【VBA入門】ユーザーフォームの使い方(テキスト表示、カレンダー)
更新日 : 2019年4月22日

まとめ

今回は、VBAでDoEventsを使って処理を途中で止める方法を解説しました。ループ処理中にキャンセルボタンで処理を止めるケースはよくあります。使い方も簡単なので、ぜひ使ってみてくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説