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 옵션에 대해 더 자세히 설명해야 합니다.이것은 실행 중인 서브루틴뿐만 아니라 모든 프로시저를 중지하는 데 사용할 수 있습니다.다른 서브루틴을 중지하는 기능 내에서도 사용할 수 있습니다(제가 작업하는 일부 애드인에 유용하다고 생각함).
실행을 즉시 종료합니다.자체적으로 필요하지는 않지만, 코드 실행을 종료하고 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
'IT' 카테고리의 다른 글
길이가 큰 VARCHAR2 열 정의의 영향 (0) | 2023.06.07 |
---|---|
피벗 테이블 목록의 오래된 항목 (0) | 2023.06.07 |
"변환 처리기 외부의 vuex 저장소 상태를 변환하지 않음"의 .pushends (0) | 2023.06.07 |
TypeScript 컴파일 오류 TS5037: '--module' 플래그가 제공되지 않으면 외부 모듈을 컴파일할 수 없습니다. (0) | 2023.06.07 |
설명 계획을 사용하여 쿼리를 최적화하는 방법은 무엇입니까? (0) | 2023.06.07 |