Как я могу выполнить длительный процесс в 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?
3 ответа
Вы пробовали использовать DoEvents?
While(True)
If(myObject.DataReady)
'your code here
End If
DoEvents
WEnd
Попробуйте, посмотрите, не улучшится ли что-нибудь.
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)
Я думаю, что лучшее решение - заставить объект COM вызывать событие VBA всякий раз, когда данные готовы.
Если это не вариант (нет контроля над COM-объектом и т. Д.), То вам нужно будет раскрутить процессор. Все, что вы можете сделать, это увеличить временной интервал между проверкой свойства DataReady, которое вы уже обнаружили во втором варианте. Я бы выяснил, насколько жирным вы можете увеличить интервал без потери функциональности и оставить его там.