Кнопка пользовательской формы реагирует на действия пользователя во время выполнения кода - PullRequest
0 голосов
/ 27 апреля 2020

Я создал индикатор выполнения с пользовательской формой с кнопкой STOP. Эта пользовательская форма хорошо работает и выполняется во время выполнения моих сценариев.

Проблема в том, что я не могу переместить окно userFom с помощью мыши или нажать кнопку СТОП во время выполнения макроса.

I Предположим, что ЦП используется для выполнения кода, а затем пользовательская форма «не успевает» получать пользовательские данные / события.

Как я могу решить эту проблему?

Я ценю вашу помощь :)

1 Ответ

3 голосов
/ 27 апреля 2020

Чтобы сказать Excel, чтобы он на мгновение оставлял код, потребляющий процессор, и обрабатывал события от пользователя, вы должны вставить DoEvents в свой код. Например, если у вас есть длинная позиция для l oop, вы можете написать DoEvents внутри для l oop. Таким образом, на каждой итерации Excel будет обрабатывать пользовательский ввод.

У нас нет образца кода от вас, здесь он мой.

Public Sub YourRoutine()
    Dim row_i As Long

    'CPU Time consuming loop
    For row_i = 1 To 9999999
        Cells(row_i,1).Value = "I'm row number" & vbCrLf & row_i & vbCrLf & "."
    Next i

End Sub

С приведенным выше кодом Excel не будет отвечать пользователю входы, пока саб не заканчивается. Добавляя DoEvents, как показано ниже, код Excel будет отвечать на пользовательский ввод каждый раз, когда row_i увеличивается.

Public Sub YourRoutine()
    Dim row_i As Long

    'CPU Time consuming loop
    For row_i = 1 To 9999999
        Cells(row_i,1).Value = "I'm row number" & vbCrLf & row_i & vbCrLf & "."
        'Interrupt for events
        DoEvents
    Next i

End Sub

Вы также можете сделать 10 шагов и после этих итераций прослушивать пользовательские вводы

Public Sub YourRoutine()
    Dim row_i As Long

    'CPU Time consuming loop
    For row_i = 1 To 9999999
        Cells(row_i,1).Value = "I'm row number" & vbCrLf & row_i & vbCrLf & "."
        'Interrupt for events every 10 iterations
        If row_i Mod 10 = 0 Then
            DoEvents
        End If
    Next i

End Sub

Если у вас нет al oop, а общий c длинный код, поместите DoEvents в каждую точку, которую вы хотите, чтобы Excel прослушивал пользовательские события

...