Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 当用户单击userform上的X按钮时,如何退出循环?_Excel_Vba - Fatal编程技术网

Excel 当用户单击userform上的X按钮时,如何退出循环?

Excel 当用户单击userform上的X按钮时,如何退出循环?,excel,vba,Excel,Vba,我有下面的vba代码,可以在userform界面上逐个编辑每一行: 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

我有下面的vba代码,可以在userform界面上逐个编辑每一行:

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时,我需要在第一个代码块处停止每个循环。但如果调用
UserForm\u QueryClose
从第一个代码块退出循环,我不知道如何倾听。

遗憾的是,我认为这是不可能的,因为它不支持多线程

如果您确实坚持要求用户是否暂停,那么最好在运行时简单地询问
If
条件

例如


遗憾的是,我认为这是不可能的,因为它不支持多线程

如果您确实坚持要求用户是否暂停,那么最好在运行时简单地询问
If
条件

例如


您需要添加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
选项显式
作为布尔值的私有停止码
私有子用户表单_Click()
我想我会坚持多久
stopCode=False
对于i=1到1000000
调试.打印i
多芬特
如果stopCode=True,则退出
下一个
端接头
私有子用户表单_QueryClose(取消为整数,关闭模式为整数)
如果MsgBox(“是否要停止”,vbQuestion+vbYesNo)vbYes,则Cancel=True
stopCode=True
端接头

当用户关闭表单时,将询问他们是否要停止代码。如果他们说是,则关闭表单,但停止代码“控制器”也确保停止运行代码。

您需要添加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
选项显式
作为布尔值的私有停止码
私有子用户表单_Click()
我想我会坚持多久
stopCode=False
对于i=1到1000000
调试.打印i
多芬特
如果stopCode=True,则退出
下一个
端接头
私有子用户表单_QueryClose(取消为整数,关闭模式为整数)
如果MsgBox(“是否要停止”,vbQuestion+vbYesNo)vbYes,则Cancel=True
stopCode=True
端接头

当用户关闭表单时,将询问他们是否要停止代码。如果他们说是,它会关闭表单,但停止代码“控制器”也会确保正在运行的代码被停止。

@Rawrplus是正确的,在附近的一列中填写“已完成”并让表单循环找到用户在打开时停止的位置如何?@StevenCarlson,当前代码会这样做,问题是,如果用户使用X按钮退出用户表单,用户表单将再次提示下一行。@Rawrplus是正确的,在附近的一列中填写“已完成”并让表单循环找到用户未打开的位置如何?@StevenCarlson,当前代码执行此操作,问题是如果用户使用X按钮退出用户表单,下一行将再次提示userform。