2009-07-03 25 views
8

私は、矛盾を探している何千ものレコードを調べるルーチンを持っています。これは完了までに5分以上かかりますが、私は進捗バーと経過時間カウントを提供していますが、予想以上に長い時間がかかる場合は、ctrl-breakを押してレポートを終了することを奨励したいとは思いません。長時間実行されるVBAタスクをユーザーが終了する方法を教えてください。

フォームが非モーダルであるため、進行状況バーのボタンは機能しません。そのため、ユーザーがこのような状況で終了できるようにするためのきれいな方法はありますか?

答えて

11

DoEventsと実行範囲のスコープが大きい変数が必要です。つまり、単なる手続きであれば、モジュールレベルの変数が必要です。 2つ以上のモジュールの場合は、グローバル変数が必要です。それが行われるまで、ここで

Stopwatch at DDoE

通常参照してください、VBエンジンは、プロセッサをタイアップされます。しかし、DoEventsを使用すると、VBはプロセッサを待ち行列内の次のもので動作させ、その後VBに戻ることができます。

+0

偉大な答え!あなたがこれを行うことができるか分からなかった! – mandroid

+0

ブリリアント。ありがとう、ディック。 – Lunatik

+0

+1すてきな答え。バッジを楽しむ:) – brettdj

0

私はあなたがそれが働きたいと思うようにそれを行う方法はないと思います。 VBAはスクリプト言語なので、プロシージャを開始すると、実行されるまで実行されます。元のプロシージャが実行されている間に別のボタンをクリックしてもらいたい場合は、そのプロシージャをどのように参照して停止するかわかりません。

あなたはcontineしたいかどうかをユーザーに尋ねることができますが、それはもっと長く実行されます。

また、プロシージャでExcel以外の条件をチェックして、それが真である限り実行し続けることもできます。特定のテキストファイルがフォルダ内にあるかどうかチェックするのが簡単かもしれません。プロシージャを停止したい場合は、フォルダを開いてファイルを移動します。あなたのループの次の反復では、ファイルが見えず実行を停止します。クールジー、非効率、エレガントではないが、うまくいく。また、セル、チェックボックス、ラジオボタン、基本的にExcelの別のインスタンスで実行されている別のExcelシートのコントロールをチェックすることもできます。再びクールジー。

CTRL + Breakが機能します。それを受け入れて進んでください。ただし、コードについてパスワードで保護してCTRL + Breakを押すと、デバッグオプションが使用できなくなり、ContinueまたはEndのみになります。

これは頻繁に実行されるコードの場合、人間がコンピュータを使用していないときにスクリプトを実行するスクリプトを考えたことがありますか?私は、ウィジェットを通過するには数時間かかるテルネットスクリーンスクラップングマクロを実行していましたが、私はいつもそれらを別のコンピュータで、または私がそこにいなかったとき(夜間/週末)に走らせました。

関連する問題