Как я могу выполнить длительный процесс в VBA, не сканируя компьютер?

У меня есть приложение VBA, которое создает экземпляр COM-объекта, а затем постоянно опрашивает свойство объектов DataReady, чтобы узнать, есть ли новые данные. Когда новые данные доступны, он вставляет данные в электронную таблицу. Проблема в том, что этот макрос (подпрограмма vba) постоянно выполняется, и это замедляет работу Excel до обхода и делает компьютер несколько непригодным для использования во время выполнения процесса. Есть ли способ запустить этот процесс в отдельном потоке или сделать что-то вроде фонового рабочего .NET?

Мои две попытки состояли в том, чтобы использовать цикл 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

Вторая попытка определенно работает лучше, но все же значительно замедляет работу. Есть ли лучшее решение?

Мой COM-объект — это библиотека классов, которую я написал на C#. Я могу добавить события, которые срабатывают в библиотеке классов, когда данные готовы, но как мне прослушивать эти события в программе VBA?


person PICyourBrain    schedule 09.08.2010    source источник


Ответы (3)


Вы пробовали использовать DoEvents?

While(True)
    If(myObject.DataReady)
        'your code here
    End If
    DoEvents
WEnd
person bugtussle    schedule 09.09.2010

Я думаю, что лучшим решением является создание COM-объектом события VBA всякий раз, когда данные готовы.

Если это не вариант (нет контроля над COM-объектом и т. д.), то вам ПРИДЕТСЯ вращать ЦП. Все, что вы можете сделать, это увеличить временной интервал между проверкой свойства DataReady, которое вы уже обнаружили во втором варианте. Я бы вычислил, насколько жирно можно увеличить интервал без потери функциональности, и оставил бы его там.

person DonaldRay    schedule 09.08.2010
comment
Можете ли вы дать мне какие-либо советы о том, как вызвать событие VBA из COM-объекта и как заставить мой код vba реагировать на событие? - person PICyourBrain; 09.08.2010
comment
Я должен признать, я понятия не имею. Звучит как хороший вопрос для этого сайта, хотя... - person DonaldRay; 09.08.2010

Попробуйте это, посмотрите, улучшится ли ситуация.

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)
person Sam at TVentures    schedule 18.08.2010