1

COM オブジェクトのインスタンスを作成し、オブジェクトのDataReadyプロパティを継続的にポーリングして、新しいデータがあるかどうかを確認する VBA アプリケーションがあります。新しいデータが利用可能になると、データがスプレッドシートに貼り付けられます。問題は、このマクロ (vba サブルーチン) が継続的に実行され、これにより Excel の速度が低下し、プロセスの実行中にコンピューターが使用できなくなることです。このプロセスを別のスレッドで開始したり、.NET バックグラウンド ワーカーのようなことをしたりする方法はありますか?

私の2つの試みは、このようなwhileループを使用することでした..

While(True)
    If(myObject.DataReady)
        Do some stuff here
    End If
WEnd

そして、これ

Sub GrabNewPoint()
If (myModule.NewDataReady_Receiver = True) Then
            Do some stuff here...
End If

If (StopTest = False) Then
    NextTime = Now() + TimeValue("00:00:20")
    Application.OnTime NextTime, "GrabNewPoint"
End If

2 番目の試みは間違いなくうまく機能しますが、それでもかなり遅くなります。より良い解決策はありますか?

私の COM オブジェクトは、C# で作成したクラス ライブラリです。データの準備ができたときにクラス ライブラリで発生するイベントを追加できますが、VBA プログラムでこれらのイベントをリッスンするにはどうすればよいですか?

4

3 に答える 3

2

DoEvents を使ってみましたか?

While(True)
    If(myObject.DataReady)
        'your code here
    End If
    DoEvents
WEnd
于 2010-09-09T15:47:37.287 に答える
0

最良の解決策は、データの準備ができたときに COM オブジェクトで VBA イベントを発生させることだと思います。

それができない場合 (COM オブジェクトを制御できないなど)、CPU を回転させる必要があります。できることは、2 番目のオプションで既に発見した DataReady プロパティをチェックする間隔を長くすることだけです。機能を失うことなく間隔をどれだけ長くできるかを理解し、そのままにしておきます。

于 2010-08-09T13:38:18.850 に答える
0

これを試して、状況が改善するかどうかを確認してください。

Just pause, let the CPU fly...  key is to trap it here so it releases as long as you like
    Public Sub App_Hard_Wait_DoEvents(dblSeconds As Double)
      If dblSeconds = 0 Then Exit Sub
      Dim varStart As Variant
      varStart = Timer
      Do While Timer < (varStart + dblSeconds)
        DoEvents
      Loop
    End Sub


    DO
     Call App_Hard_Wair_DoEvents(10)
    loop until (myObject.DataReady)
于 2010-08-18T00:32:54.127 に答える