How to stop VBA code running?

后端 未结 7 777
臣服心动
臣服心动 2020-12-08 11:22

Say I have a button embedded into my spreadsheet that launches some VBA function.

Private Sub CommandButton1_Click()
    SomeVBASub
End Sub

Private Sub Some         


        
相关标签:
7条回答
  • 2020-12-08 11:56

    How about Application.EnableCancelKey - Use the Esc button

    On Error GoTo handleCancel
    Application.EnableCancelKey = xlErrorHandler
    MsgBox "This may take a long time: press ESC to cancel"
    For x = 1 To 1000000    ' Do something 1,000,000 times (long!)
        ' do something here
    Next x
    
    handleCancel:
    If Err = 18 Then
        MsgBox "You cancelled"
    End If
    

    Snippet from http://msdn.microsoft.com/en-us/library/aa214566(office.11).aspx

    0 讨论(0)
  • 2020-12-08 12:02

    Or, if you want to avoid the use of a global variable you could use the rarely used .Tag property of the userform:

    Private Sub CommandButton1_Click()
        Me.CommandButton1.Enabled = False 'Disabling button so user cannot push it
                                          'multiple times
        Me.CommandButton1.caption = "Wait..." 'Jamie's suggestion
        Me.Tag = "Cancel"
    End Sub
    
    Private Sub SomeVBASub
        If LCase(UserForm1.Tag) = "cancel" Then
            GoTo StopProcess
        Else
            'DoStuff
        End If
    
    Exit Sub
    StopProcess:
        'Here you can do some steps to be able to cancel process adequately
        'i.e. setting collections to "Nothing" deleting some files...
    End Sub
    
    0 讨论(0)
  • 2020-12-08 12:09

    ~ For those using custom input box

    Private Sub CommandButton1_Click()
    
    DoCmd.Close acForm, Me.Name
    End
    
    End Sub
    
    0 讨论(0)
  • 2020-12-08 12:09

    This is an old post, but given the title of this question, the END option should be described in more detail. This can be used to stop ALL PROCEDURES (not just the subroutine running). It can also be used within a function to stop other Subroutines (which I find useful for some add-ins I work with).

    As Microsoft states:

    Terminates execution immediately. Never required by itself but may be placed anywhere in a procedure to end code execution, close files opened with the Open statement, and to clear variables*. I noticed that the END method is not described in much detail. This can be used to stop ALL PROCEDURES (not just the subroutine running).

    Here is an illustrative example:

    Sub RunSomeMacros()
    
        Call FirstPart
        Call SecondPart
    
        'the below code will not be executed if user clicks yes during SecondPart.
        Call ThirdPart
        MsgBox "All of the macros have been run."
    
    End Sub
    
    Private Sub FirstPart()
        MsgBox "This is the first macro"
    
    End Sub
    
    Private Sub SecondPart()
        Dim answer As Long
        answer = MsgBox("Do you want to stop the macros?", vbYesNo)
    
        If answer = vbYes Then
            'Stops All macros!
            End
        End If
    
        MsgBox "You clicked ""NO"" so the macros are still rolling..."
    End Sub
    
    Private Sub ThirdPart()
        MsgBox "Final Macro was run."
    End Sub
    
    0 讨论(0)
  • 2020-12-08 12:14

    Add another button called "CancelButton" that sets a flag, and then check for that flag.

    If you have long loops in the "stuff" then check for it there too and exit if it's set. Use DoEvents inside long loops to ensure that the UI works.

    Bool Cancel
    Private Sub CancelButton_OnClick()
        Cancel=True
    End Sub
    ...
    Private Sub SomeVBASub
        Cancel=False
        DoStuff
        If Cancel Then Exit Sub
        DoAnotherStuff
        If Cancel Then Exit Sub
        AndFinallyDothis
    End Sub
    
    0 讨论(0)
  • 2020-12-08 12:20

    what jamietre said, but

    Private Sub SomeVBASub
        Cancel=False
        DoStuff
        If not Cancel Then DoAnotherStuff
        If not Cancel Then AndFinallyDothis
    End Sub
    
    0 讨论(0)
提交回复
热议问题