IT

VBA 코드 실행을 중지하는 방법은 무엇입니까?

itgroup 2023. 6. 7. 22:31
반응형

VBA 코드 실행을 중지하는 방법은 무엇입니까?

예를 들어 스프레드시트에 일부 VBA 기능을 시작하는 버튼이 내장되어 있다고 가정합니다.

Private Sub CommandButton1_Click()
    SomeVBASub
End Sub

Private Sub SomeVBASub
    DoStuff
    DoAnotherStuff
    AndFinallyDothis
End Sub

중지되는 "취소" 버튼을 사용할 수 있는 기회를 갖고 싶습니다.SomeVBASub임의의 순간에 사형을 집행하는 것, 그리고 나는 관여하는 것에 관심이 없습니다.Ctrl+Break조용히 하고 싶으니까요

이것은 꽤 흔한 문제일 것 같은데, 어떤 생각이 있나요?

감사해요.

플래그를 설정하는 "CancelButton"이라는 다른 단추를 추가한 후 해당 플래그를 확인합니다.

만약 당신이 "물건"에 긴 루프가 있다면, 거기서도 그것을 확인하고 그것이 설정되어 있다면 종료합니다.긴 루프 내에서 DoEvents를 사용하여 UI가 작동하는지 확인합니다.

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

응용 프로그램은 어떻습니까?EnableCancelKey - Esc 버튼 사용

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

http://msdn.microsoft.com/en-us/library/aa214566(office.11).aspx 의 토막글

또는 글로벌 변수를 사용하지 않으려면 거의 사용하지 않는 변수를 사용할 수 있습니다..Tag사용자 양식의 속성:

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

Jamietre가 말한 것, 하지만.

Private Sub SomeVBASub
    Cancel=False
    DoStuff
    If not Cancel Then DoAnotherStuff
    If not Cancel Then AndFinallyDothis
End Sub

이런 거 많이 해요.많이. :-)

저는 "DoEvents"를 더 자주 사용하는 것에 익숙해졌지만, 여전히 확실한 중지 방법을 두 번 확인하지 않고 실행되도록 설정하는 경향이 있습니다.

그리고 나서, 오늘 다시 그것을 하고, 저는 "그럼 3시간 후에 끝날 때까지 기다리면 되겠네요"라고 생각하고, 리본을 가지고 노를 저기 시작했습니다.이전에 리본의 "보기" 섹션에서 "매크로" 풀다운을 보고 무한한 매크로가 실행되는 것을 볼 수 있다고 생각했습니다.

저는 이제 당신이 Alt-F8을 사용하여 이것을 시작할 수 있다는 것을 깨달았습니다.

그리고 저는 생각했습니다. 만약 제가 다른 매크로에 "발을 디딘다면" 저를 구할 수 있을까요?그것은 :-) 당신이 실행 중인 매크로에 발을 들여놓아도 작동합니다. (하지만 당신은 당신이 하고 있는 곳에서 여전히 패배합니다.) 당신이 나처럼 매우 게으른 프로그래머이고 많은 "글로벌" 변수를 선언하지 않는 한, 이 경우 글로벌 데이터가 유지됩니다. :-)

K

사용자 정의 입력 상자를 사용하는 사용자의 경우

Private Sub CommandButton1_Click()

DoCmd.Close acForm, Me.Name
End

End Sub

이전 게시물이지만 이 질문의 제목을 고려할 때 END 옵션에 대해 더 자세히 설명해야 합니다.이것은 실행 중인 서브루틴뿐만 아니라 모든 프로시저를 중지하는 데 사용할 수 있습니다.다른 서브루틴을 중지하는 기능 내에서도 사용할 수 있습니다(제가 작업하는 일부 애드인에 유용하다고 생각함).

Microsoft가 언급한 와 같이:

실행을 즉시 종료합니다.자체적으로 필요하지는 않지만, 코드 실행을 종료하고 Open 문으로 열린 파일을 닫고 변수를 지우는 절차의 어느 곳에나 배치할 수 있습니다*.END 방법이 자세히 설명되어 있지 않다는 것을 알게 되었습니다.이것은 실행 중인 서브루틴뿐만 아니라 모든 프로시저를 중지하는 데 사용할 수 있습니다.

다음은 예시적인 예입니다.

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

언급URL : https://stackoverflow.com/questions/3979893/how-to-stop-vba-code-running

반응형