如何使用按钮来控制不同模块中的VBA代码和断点

时间:2017-10-13 03:47:02

标签: excel-vba vba excel

有两个按钮:

Continue

Module2 Sub Main Clean up

Module3 Sub Clean

我想做的是

如果我没有在代码中添加断点,当我单击按钮Continue时,如何在图片中显示的断点处停止?

如果我想在点击Module2 Sub Main,

之后点击Clean up,我必须停止Continue.

我想在Excel中获取所有操作,但不能再次返回VBA代码。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以在希望代码中断的位置插入以下行

Debug.Assert False

修改 但是,使用此方法,在VB编辑器中按Run(F5)之前,将无法运行任何其他VBA代码。

如果您想要做的是将VBA放在等待您按ContinueClean 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使用率不会太大。