Обновить метку внутри цикла

#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 , если ваша процедура часто показывает «Не отвечает».