DaveがFor …​ Nextループで多くの情報を処理する必要のあるマクロを作成するとき、彼は常にステータスバーを使用して進行状況を示します。

通常、彼には「Yの行Xを処理しています」などのメッセージが表示されます。 「Y」が大きい値(For …​ Nextループの上端)の場合、Excelはステータスバーの更新を停止し、Excelのタイトルバーに「応答なし」のようなものを表示することがよくあります。ただし、マクロはまだ実行されており、マクロが完了すると、Excelが応答を開始し、すべてが正常に機能します。デイブは、Excelがこのように動作するのを停止し、代わりに、ステータスバーの更新を希望どおりに表示する方法を考えています。

この動作は、Excelが応答を停止したように見えるときに発生するようです。 (結局のところ、プログラムのタイトルバーに表示されるのはWindowsです。)Windowsで複数のプログラムを開いていて、Excelのチャンク処理中に別のプログラムウィンドウをクリックすると、動作を非常に簡単に再現できました。長いマクロ。基本的に、Excelがマクロの実行でビジー状態であるか、Windowsにステータスバーの更新を要求し続けることができない場合は、実際、Excelが応答を停止したように見えます。

使用できるアプローチは2つあります。まず、ループ内でDoEventsコマンドを使用できます。通常、これは、誰かがキーボードを押したときなど、イベントキューにあるものすべてに注意を払うようにマクロに指示するために使用されます。これは、Excelが機能しているマクロから「ルックアップ」し、Windowsと通信するように強制することと同じです。これにより、必然的に、Excelが実際に応答することをWindowsに通知し、ステータスバーの更新を実行できるようになります。

ステータスバーを更新した直後にコマンドを入力することもできます:

Application.StatusBar = "Processing row " & X & " of " & Y DoEvents

もう1つ試してみるのは、ステータスバーをあまり更新しないことです。

ループの上限が非常に大きい場合は、パーセンテージを計算し、合計の一部が完了したときにステータスバーを更新する方がよい場合があります(おそらく合計の5%または10%ごと)。つまり、ステータスバーは、ループ中に数百回または数千回ではなく、10回または20回更新するだけで済みます。これは、Windowsがステータスバーの更新要求に対応できることを意味する場合があります。また、ボーナスとして、ステータスバーを頻繁に更新する必要がないため、マクロの実行速度が向上する場合があります。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(13341)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice365のExcelに適用されます。