2009-04-10 25 views
10

MS Access VBAの別のスレッドで実行中のプロセスを作成するにはどうすればよいですか?私はちょうど座ってメッセージを待つプロセスを作りたいと思っています。MS AccessのVBA +スレッド

答えて

3

良い質問ですが、できないと思います。

+2

+1非常に印象的である:正しいです。マルチスレッドコンポーネントを作成(または既存のコンポーネントを使用)してVBAから呼び出すことはできますが、VBA自体はマルチスレッド化されていません。 – Joe

0

私が考えることができる最も簡単な方法は、フォームを作成し、それに既存の、またはそれ自身のコントロールを置くことです。

4

VBA自体でこれを直接行う方法はありません。これについて詳しくはHere is a MSDN forum discussionを参照してください。 OfficeはマルチスレッドのためのVBA拡張を公開しませんでした。

ただし、Windows APIを呼び出したり、マルチスレッド化された呼び出しを実行するVBA(別の場所で書かれた)に独自のCOMオブジェクトを作成することでこれを行うことができます。どうにかして(おそらくあなたのCOMオブジェクト、または同様の何かに対してポーリングする)呼び出しスレッドにすべてをマーシャリングすることを確認してください。

また、COMスレッディングのbendeweyのリンクは、これと非常に関係があるので、チェックしてみてください。

-1

MS Access VBAでフォームを使用できる場合は、フォームにタイマーをドロップし、遅延を10 msなどの非常に低い値に設定します。次に、タイマーイベント関数にコードを置き、別のスレッドで実行されます。

+5

VBAのフォームのタイマーはメインスレッドで発生します。フォームは、別のスレッドではなく、スケジュールするためにWindowsメッセージを使用します。 –

+0

Reed、私はこれがVB6に当てはまると確信しています。 VBAとは違うのですか? – andrewrk

+0

いいえ、同じスレッドで実行されます – Onkelborg

1

ShellOpen()のようなものを使用して、シェルスクリプトを起動する(例:Visual Basic Sc​​ript x回、ファイルを介してスクリプトと通信し、結果がいつ到着したかを検出するためのプーリングメカニズム)。私はそれがCOMコンポーネントを書くよりも簡単だと思います。また、VB ScriptはVBAと非常によく似ています。悪い面はかなりありますが、ファイルを書き込んだり読み込んだりするのはメモリを共有するよりも時間がかかり、プーリングするとVBAスクリプトが応答しないように見えることがあります。

-1

DoEventsプロシージャを使用すると、イベント。このサブを随時呼び出してください。メインスレッドはフリーズしません。

+4

これは良い解決策ではありません。悪いです。本当に悪いです – Onkelborg

+0

なぜこのような悪い解決策がありますか?スクリプトでこのアプローチを使用しましたが、うまくいきました。私はちょうど1000ミリ秒または1秒の間隔でDoEventsを呼び出しました。 – Ionut

+0

さて、それは働いたが、それはそれだ。 1秒に1回メッセージに応答するインターフェイスは応答しません。そして、プログラムにポーリングのためだけにコードを実行させるのは悪い習慣です。何も起こらないときにプログラムをスリープさせる方が良いです。他のプログラムは、コンテキストスイッチが少なくなっているため、電力消費量が低下します。 本当にポーリングを行う必要がある場合は、少なくともDoEventsアプローチを使用しないでください。少なくともタイマーを使用すると、メッセージキューが壊れず、アプリケーションが応答しなくなります – Onkelborg

4

あなたはこの回避策をチェックアウトする場合があります:http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html

それはエクセルですが、それは実質的に同じである必要があります。これは、例を確認してください..「エージェント」VBScriptを構築し、それらがタスクを実行することによって動作してい、それは

-Viggo