2014-06-20 3 views
2

내 질문 : Excel 2013에서 VBA 사용 사용자가 사용자 정의 폼을 채우고 싶지 않다고 결정할 때 Excel의 전체 인스턴스를 정상적으로 닫는 방법 클릭을 종료하거나 취소 하시겠습니까?응용 프로그램. 종료 전에 나머지 매크로를 실행하는 UserForm 시도에서 종료

현재 사용자가 종료 또는 취소를 클릭하면 내 인스턴스 만 열려 있는지 확인합니다. 그렇지 않으면 ThisWorkbook.Close를 사용할 수 있으며 괜찮을 것이라고 생각합니다. 그러나 그렇다면 응용 프로그램이 여전히 존재하기를 원하지 않으므로 Application.Quit을 사용했습니다. 그러나 이것은 매크로 실행을 끝내고, 폼을 언로드하기 때문에 원래 "타입 불일치"를 던지고, "디버그"또는 "종료"를 클릭 한 후에 닫힙니다. 디버그). 지금은 첫 번째 사례를 무시하고 전체 애플리케이션을 종료하려고합니다. 그것은 많은 서브 루틴과 함수가있는 매우 긴 매크로입니다. 그래서 여기서 디버깅과 게시를 위해 단축했습니다. 형식 불일치 오류는 더 이상 발생하지 않지만 실제 오류의 결과라고 생각합니다. 응용 프로그램을 종료하기 위해 명령을 실행 한 후 코드가 호출되었습니다.

Private Sub CommandButton1_Click() 

    Call form_variables 
    frm_REQUEST.Show 
    Call a_REQUEST_main 

End Sub 

서브 루틴

form_variables 

내가 정의 폼에서 데이터를 저장할 수 있도록 공용 변수를 생성하는 서브 루틴이다 :

먼저, 여기에 모든 것이 시작되는 코드입니다.

frm_REQUEST.Show 

및 형태를 나타낸다 (다른 통합 발견 목록을 추출하고, 어떤 형식을 않고 통합 문서를 닫고 정의 폼 드롭 다운 상자로 목록을 입력하는 기능 호출을 포함하여) 초기화하고, 마지막

a_REQUEST_main 

은 공용 변수 (UserForm 데이터가 저장되는 곳)를 사용하고 그 일을합니다 (그러나 사용자 정의 폼이 닫히면 아무것도하지 않아야합니다). .Show가 호출 될 때 실행되는

코드는 다음과 같습니다

Private Sub UserForm_Initialize() 

    ' Get job numbers from other workbook 
    Dim job_selection_list As Variant 
    job_selection_list = get_job_list() 

    With frm_REQUEST.Job_Number_ComboBox 
     .List = job_selection_list 
    End With 

    ' set focus on Job Numbers 
    JN_combobox.SetFocus 

End Sub 

Private Sub cancel_button_Click() 

    Set job_selection_list = Nothing 

    Unload Me 

    Application.Quit 

End Sub 


Private Sub submit_button_Click() 

    ' Values from userform saved as global (?) variables so other subroutines can access. 

End Sub 

내가 프로그램을 통해 밟은 Application.Quit 사용자 정의 폼에서 호출되면, 것을보고, 매크로, 주요 서브 루틴, steps to

Call a_REQUEST_main 

그러나 실제로 모든 것을 종료해야합니다. 나는 "명령"을 저장하고 일의 순서를 변경하고 아무 것도 설정하지 않아도되는 객체를 읽으려고 했으므로 (따라서 드롭 다운 목록이 초기화 될 때 생성되는 job_selection_list의 설정) 나는 얻을 수없는 것 같습니다. 이 일을하거나 온라인에서 무엇이든 찾으십시오. 누구나 가이드를 제공하거나 Excel 인스턴스를 종료하는 더 좋은 방법을 알려 줄 수 있습니까? Stackoverflow 도움말 Kenobi, 당신은 나의 유일한 희망입니다!

감사합니다.

+0

또 다른 질문을 닫을 때 설명하기 위해 변수를 추가 : 사용자 - 신경 이유 사용자 정의 폼에 이미 'QueryClose' 및/또는'Terminate' 프로 시저를 트리거 할 취소 버튼이있을 때 "취소"버튼을 정의했습니다. 내장 된 이벤트 핸들러를 버튼으로 복제하려고하면 불필요하게 복잡해질 수 있습니다. –

+0

이것은 아마도 우스꽝 스러움으로 들릴지 모르겠지만 UI 관점에서 보았을 때, 사용자베이스는 "취소"라고 쓰여있는 멋진 버튼을 가지고 있다고 생각합니다. 그런 다음 Close 기능을 사용하지 않도록하는 것이 불필요하게 복잡해 보였으므로'Query_ Close_button_Click'을'QueryClose' 코드 블록에 넣었습니다. 그러나 아래에있는 귀하의 의견에 대해 설명하겠습니다. 중요한 것 ... – TenaciousSisyphus

+0

'QueryClose' 핸들러는 실제로'Terminate'가 ** 일어나지 않게하는 몇 가지 조건을 잡을 필요가있을 때만 필요합니다. 그 사건에서 중요한 것이 없다면, 단지 스스로 'Terminate' 핸들러를 사용하십시오 : –

답변

0

그냥 사용자가 양식 코드에서

'hold flag if users cancels form 
Public btnCancel As Boolean 
Private Sub CommandButton1_Click() 
Unload Me 
btnCancel = True 
End Sub 

'set the flag each time the form active 
Private Sub UserForm_Activate() 
btnCancel = False 
End Sub 

다음 형태로

에게

Call form_variables 
frm_REQUEST.Show 

If frm_REQUEST.btnCancel Then 
    Application.Quit 
Else 
    Call a_REQUEST_main 
End If 
+0

감사 Sorceri! 코드를 약간 수정 한 후 사용해 보았습니다. 매력처럼 일했습니다. – TenaciousSisyphus

0

버튼의 Click 이벤트 핸들러에서의 대신 형태의 Terminate 이벤트 핸들러 Application.Quit을 넣습니다.

이유는 폼이 언로드 된 경우에도 프로 시저가 계속 실행된다는 것입니다. 따라서 이벤트를 활용하십시오.

이벤트를 Click에 넣으면 양식이 언로드되지만 절차가 계속 실행되어 오류 또는 기타 원치 않는 결과가 발생할 수 있습니다.

참고 : 변경 사항 (있는 경우)을 통합 문서에 저장/삭제하라는 메시지가 나타날 수 있습니다.

+0

너무 길어 보였으므로 위의 코드에 포함시키지 않았지만 실제로 가지고 있습니다 – TenaciousSisyphus

+0

Do 당신이 현재 갖고있는 ** 대신 **. –

+0

너무 길어 보였으므로 위의 코드에 포함시키지 않았지만 동일한 사용자 정의를 사용하여'Terminate','QueryClose' 및'cancel_button_Click'을 모두 가지고 있습니다. 나는 게시와 디버깅을 계속했고,'cancel_button_Click'에서'Unload Me'가'QueryClose' 코드 블록에 대한 실행을 취하고'Terminate' (바로 아래에 있음)로 이어졌다가 다시 돌아온다는 사실을 깨달았습니다. 'cancel_button_Click', 궁극적으로는 _three_'Exit Sub' 명령을 통해 파고들 것입니다! – TenaciousSisyphus