2017-10-20 79 views
1

編輯:我想出了自己。我覺得非常愚蠢,但用「結束」取代「退出小組」完美。xlDialogSaveAs - 如果選擇「取消」,結束所有代碼

背景:我有一個使用「調用」函數在一個Sub中運行多個子的Sub(請參見下面的代碼#1)。

Option Explicit 

Sub MIUL_Run_All() 

Dim StartTime As Double 
Dim SecondsElapsed As String 

'Remember time when macro starts 
    StartTime = Timer 

Call OptimizeCode_Begin 

Call Format_MIUL 
Call Custom_Sort_MIUL 
Call Insert_Process_List 
Call Format_Process_List 

Call OptimizeCode_End 

'Determine how many seconds code took to run 
    SecondsElapsed = Format((Timer - StartTime)/86400, "ss") 

'Notify user in seconds 
    MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation 

End Sub 

我被叫出第一個代碼,「Format_MIUL」,提示用戶保存文件,使用下面的代碼行(參見下面的代碼#2)。這段代碼有效,但問題是,如果用戶按下「取消」按鈕,主子代碼(上面代碼#1)中調用的其餘代碼將繼續運行。如果用戶按下取消按鈕,我希望所有代碼都停止。我似乎無法弄清楚如何做到這一點。

'Save file as .xlsm 
MsgBox "  Save as Excel Workbook (.xlsx)!" 
Dim userResponse As Boolean 

On Error Resume Next 
userResponse = Application.Dialogs(xlDialogSaveAs).Show(, 51) 
On Error GoTo 0 
If userResponse = False Then 
Exit Sub 
Else 
End If 

任何幫助,非常感謝。

+0

我覺得非常愚蠢,但用「End」替換「Exit Sub」是完美的。 – CC268

+0

請爲你的問題寫一個答案,以便其他人可以找到類似問題的解決方案 – Maldred

+1

Neater將Format_MIUL轉換爲保存時返回TRUE的函數,否則你可以這樣調用它: If Format_Miu Then 'Other調用 End If – jkpieterse

回答

2

Call關鍵字已過時20年,您可以將其刪除。

End關鍵字將有效年底執行,但是這幾乎是一個大紅色的「自毀」按鈕,你從來沒有有效地需要使用,給予適當的結構代碼。

看起來像Format_MIULSub程序。使它成爲一個Function一個Boolean值告訴調用者是否是確定以繼續,或者如果操作的其餘部分應取消:

Private Function Format_MUIL() As Boolean 
    '... 
    'Save file as .xlsm 
    MsgBox "  Save as Excel Workbook (.xlsx)!" 
    Dim userResponse As Boolean 

    On Error Resume Next 
    userResponse = Application.Dialogs(xlDialogSaveAs).Show(, 51) 
    On Error GoTo 0 

    'return False if userResponse isn't a filename, True otherwise: 
    Format_MUIL = Not VarType(userResponse) = vbBoolean 
End Function 

而現在不是這樣的:

Call Format_MIUL 

調用者可以做到這一點:

If Not Format_MIUL Then Exit Sub 

然後你走了,優雅的退出沒有任何自毀按鈕按下。

+0

有趣......我沒有做太多的VBA,這個代碼並不是真正需要的,只是這裏其他用戶的一個很好的工具,所以我對正確結構化代碼的瞭解是相當有限的。我不清楚如何用函數替換所有的「呼叫」關鍵字。並不是每個小組都有這樣的對話框。另外,我會在哪裏將「格式MIUL = Not VarType ...」格式化爲MIUL代碼? – CC268

+0

@ CC268,正如你所看到的那樣,它並不難!FWIW你可以學得越來越多,並改進你的編碼和[Rubberduck](http://rubberduckvba.com)的知識,我開發的一個開源的VBIDE插件項目,它還可以通過兩次點擊來修復整個項目中[缺少]縮進,並警告你 –

+0

我沒有說「用調用關鍵字替換函數」,我說*刪除了「調用」關鍵字* - 它們是多餘的,「調用DoSomething」是與「DoSomething」完全相同。是的,'Format_MIUL = ...'進入'Format_MIUL' **函數** - 這就是您如何在VBA中設置函數的返回值,方法是分配給它的標識符。 –

相關問題