#vba #excel
#vba #excel
Вопрос:
Проблема
У меня есть форма, которая запускает цикл обработки элементов при активации. Визуальная часть формы содержит текст, который должен отображать «Обработка X или Y элементов«, чтобы показать ход выполнения цикла. Проблема в том, что вместо обновления визуальной части цикл приводит к тому, что Excel перестает отвечать во время выполнения. Как мне предотвратить это?
Редактировать: я мог бы добавить, что функции DataFunctions.getStatus()
, а также все Process.*()
функции содержат некоторую связь с базой данных (T-SQL).
Код
Private Sub UserForm_Activate()
Dim currentStatusCode As Long, _
agCount As Long, _
currentAg As String
'Get array and find its size
agArray = getAgArray()
agCount = UBound(agArray) 1
'Loop through the list of items and process them one by one.
For i = 0 To agCount - 1
updateLabel i 1, agCount '<-- This is where the visual is updated
currentAg = agArray(i)
currentStatusCode = DataFunctions.getStatus(currentAg)
If currentStatusCode = 100 Then
Process.validate currentAg
currentStatusCode = DataFunctions.getStatus(currentAg)
End If
If currentStatusCode = 101 Then
Process.create currentAg
currentStatusCode = DataFunctions.getStatus(currentAg)
End If
If currentStatusCode = 103 Then
Process.createSomethingElse currentAg
currentStatusCode = DataFunctions.getStatus(currentAg)
End If
If currentStatusCode = 104 Then
Process.changeStatus currentAg
'No need to get the new status here
End If
Next i
End Sub
Комментарии:
1. Я бы посоветовал попробовать
DoEvents
и / илиMe.Repaint
2.
Me.Repaint
сделал трюк — большое вам спасибо! Если вы опубликуете это как «реальный» ответ, тогда я могу принять его, чтобы другим тоже можно было помочь.
Ответ №1:
Использование Me.Repaint
должно заставить форму перерисовывать себя, тем самым обновляя метку. Вы также можете добавить DoEvents
, если ваша процедура часто показывает «Не отвечает».