Как выйти из цикла, когда пользователь нажимает кнопку X на пользовательской форме? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть код vba ниже для редактирования каждой строки одна за другой в интерфейсе пользовательской формы:

Private Sub CommandButton1_Click()
    Dim MyRange As Range
    Dim cell As Range

    Set MyRange = Range("A2", Range("A2").End(xlDown))

    For Each cell In MyRange            
        cell.Select

        'Build form            
        MyForm.Title.Caption = cell.Offset(0, 2)

        If cell.Offset(0, 2) = 1 Then
            MyForm.Checked.Value = True
        Else
            MyForm.Checked.Value = False
        End If

        'Show form
        MyForm.Show  
    Next cell
End Sub

У меня есть тысячи строк, и мне нужно дать пользователю немного отдохнуть!

Я хочу, чтобы этот процесс приостанавливался, если пользователь нажимает кнопку X, но я не смог найти способ выйти из цикла.

Мой код пользовательской формы, как показано ниже:

Private Sub Checked_Click()
    If MyForm.Checked.Value = True Then
        ActiveCell.Offset(0, 1).Value = 1
    Else
        ActiveCell.Offset(0, 1).Value = ""
    End If 
End Sub


Private Sub DoneButton_Click()
    ActiveCell.Offset(0, 2).Value = 1
    Unload MyForm 
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
       MsgBox "paused"
    End If
End Sub

Чего я пытаюсь достичь?

Мне нужно остановиться для каждого цикла в первом блоке кода, когда пользователи нажимают кнопку X, чтобы закрыть форму пользователя. Но я не знаю, как слушать, если UserForm_QueryClose вызывается для выхода из цикла из первого блока кода.

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Вам необходимо добавить DoEvents, который будет проверять взаимодействие с пользователем. Однако простое закрытие формы не остановит выполнение кода, поэтому вам потребуется добавить еще один контроллер.

Например

Option Explicit
Private stopCode As Boolean
Private Sub UserForm_Click()
    Dim i As Long
    stopCode = False
    For i = 1 To 1000000
        Debug.Print i
        DoEvents
        If stopCode = True Then Exit For
    Next
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If MsgBox("Do you want to stop", vbQuestion + vbYesNo) <> vbYes Then Cancel = True
    stopCode = True
End Sub

Когда пользователь закрывает форму, ему будет предложено остановить код. Если они говорят «да», это закрывает форму, но stopCode «контроллер» также обеспечивает остановку работающего кода.

1 голос
/ 22 мая 2019

К сожалению, я не думаю, что это возможно, учитывая, что не поддерживает многопоточность.

Если вы действительно настаиваете на том, чтобы спросить пользователя, делать ли паузу, лучше просто спросить If об условном выражении во время выполнения.

например.

For i = 1 to myRange.Cells.Count

 ' your code here...

 If i = myRange.Cells.Count / 2 Then
    If MsgBox("Continue to the for loop?", vbYesNo) = vbNo Then
       UnLoad MyForm
       Exit For
    End If
 End If

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