我下面有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
是否被调用以退出第一段代码的循环。
答案 0 :(得分:1)
遗憾的是,鉴于vba不支持多线程,我认为这是不可能的。
如果您确实要问用户是否要暂停,最好在运行时简单询问一个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'也可以确保正在运行的代码已停止。