有两个按钮:
Continue
的 Module2 Sub Main
Clean up
Module3 Sub Clean
我想做的是
如果我没有在代码中添加断点,当我单击按钮Continue
时,如何在图片中显示的断点处停止?
如果我想在点击Module2 Sub Main,
Clean up
,我必须停止Continue.
我想在Excel中获取所有操作,但不能再次返回VBA代码。
答案 0 :(得分:2)
您可以在希望代码中断的位置插入以下行
Debug.Assert False
修改强> 但是,使用此方法,在VB编辑器中按Run(F5)之前,将无法运行任何其他VBA代码。
如果您想要做的是将VBA放在等待您按Continue
或Clean up
继续或运行其他宏的位置,则需要更复杂的方法。如果是这种情况,请在评论中告诉我,我可以相应地编辑我的回复。
<强> EDIT2:强>
从你的评论,我知道你想在循环中“暂停”代码进行一些清理,例如。在这种情况下,您需要将DoEvents
与单元格结合使用(或公共变量也可以使用)。
为了说明这个想法,下面是一个示例代码(使用单元格Z1)。您还需要创建2个按钮并将它们链接到下面的2个不同的宏。 StopMacro 的按钮将允许您停止另一个按钮(只需等待1秒钟十次)。
请注意,在宏停止之前会有一点延迟。
Sub StopMacro()
ThisWorkbook.Sheets("Sheet1").Range("Z1").Value = True
End Sub
Sub test()
Dim i As Long
For i = 0 To 9
DoEvents
If ThisWorkbook.Sheets("Sheet1").Range("Z1").Value = True Then
MsgBox "The code was stopped."
ThisWorkbook.Sheets("Sheet1").Range("Z1").Value = False
Exit Sub
End If
'The rest of your code would be here instead of this line
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 1)
Next i
End Sub
因此,您可以在循环内部使用相同的原则,以便通过按停止按钮来阻止代码运行。
但是,您说要暂停您的代码并在之后恢复。在这种情况下,您可以使代码存储您所做的进度,并将其用作下次运行的起点,例如(使用单元格Z2):
Sub test2()
Dim i As Long
Dim StartingPoint As Long
StartingPoint = ThisWorkbook.Sheets("Sheet1").Range("Z2").Value
For i = StartingPoint To 9
DoEvents
If ThisWorkbook.Sheets("Sheet1").Range("Z1").Value = True Then
MsgBox "The code was stopped."
ThisWorkbook.Sheets("Sheet1").Range("Z1").Value = False
'Before exiting, store progression (i-1)
ThisWorkbook.Sheets("Sheet1").Range("Z2").Value = i-1
Exit Sub
End If
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 1)
Next i
'After the loop is completed, we reset the Starting Point to its initial value
ThisWorkbook.Sheets("Sheet1").Range("Z2").Value = 0
End Sub
答案 1 :(得分:1)
您可以在主代码中插入 PseudoBreakPoint 宏(在下面的示例中为 test3 )。这个PseudoBreakPoint宏基本上会运行一个不会退出的循环,直到您按下工作表上的按钮运行继续宏。
Option Explicit
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If
Public LetsContinue as boolean
Sub Continue()
LetsContinue = True
End Sub
Sub PseudoBreakPoint()
LetsContinue = False
Do
DoEvents
If LetsContinue = True Then
MsgBox "The code will now resume."
Exit Sub
End If
Sleep (10)
Loop
End Sub
Sub test3()
MsgBox "Before BreakPoint"
Call PseudoBreakPoint
MsgBox "After BreakPoint"
End Sub
解释:此处的关键是DoEvents
的使用,它允许您使用Excel,就像没有运行VBA代码一样。 DoEvents
唯一的问题是它是一个需要大量资源的命令。这就是为什么将它与Sleep
函数结合起来至关重要的原因,在上面的示例中将其设置为10毫秒。这足以将DoEvents
从每秒几千次运行的次数减少到每秒少于100次,这对CPU使用率不会太大。