Как я могу выполнить длительный процесс в VBA без сканирования ПК? - PullRequest
1 голос
/ 09 августа 2010

У меня есть приложение 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?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

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

While(True)
    If(myObject.DataReady)
        'your code here
    End If
    DoEvents
WEnd
0 голосов
/ 18 августа 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)
0 голосов
/ 09 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...