用户单击用户窗体上的X按钮时如何退出循环?

时间:2019-05-22 10:58:21

标签: excel vba

我下面有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 个答案:

答案 0 :(得分:1)

遗憾的是,鉴于不支持多线程,我认为这是不可能的。

如果您确实要问用户是否要暂停,最好在运行时简单询问一个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

答案 1 :(得分:1)

您需要添加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 'controller'也可以确保正在运行的代码已停止。