2017-10-11 180 views
0

我有一系列可自動執行大部分過程的宏。我想通過Excel Add-In將它分發給我的同事,並且我有一段代碼,但我似乎無法正確使用。Excel VBA:強制用戶保存爲.xlsm

這裏是「主」代碼(正常工作):

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 Save_As 
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 

是給我找麻煩的代碼是「Save_As」。我希望用戶做的第一件事是將文件保存爲啓用宏的文件。理想情況下,我想要的代碼,爲用戶做這些事情:

  1. 強制用戶保存爲.XLSM
  2. 在保存提供當前文件的名稱爲對話框,使他們有一個文件名已經與...合作。
  3. 如果按下CANCEL按鈕,它必須停止整個宏!

我認爲這將是一件相當平凡的事情,但到目前爲止它一直是我的代碼中最困難的部分。

以下是我已經嘗試了Save_As代碼:

​​

這段代碼很簡單,但它並沒有解決取消按鈕。

Dim userResponse As Boolean 

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

再次出於某種原因,這不解決取消按鈕。

我已經嘗試了大概六種不同的東西,其中大部分與上面的代碼類似。

任何幫助表示讚賞。

+0

userResponse = Application.Dialogs(xlDialogSaveAs).Show(52),將出現對話框與52.xlsx作爲文件名。對話框的第一個參數是文件名。 52作爲第二個參數將強制XLSM文件類型。我運行了你的代碼,它完美運行。我不確定你是否需要錯誤行。 – mooseman

+0

@mooseman問題在於下一個代碼在它退出特定Sub時開始運行,並轉到下一個「Call Format_MIUL」代碼。我怎樣才能讓它從整個代碼中解脫出來? – CC268

+0

你的意思是你從另一個調用這個子類,並希望所有代碼停止選擇取消時?這將需要一個整體設計。也許設置一個全局變量,並設置它,如果userResponse = False。 – mooseman

回答

0

你有這樣的:

If FileDialog.Show = False Then 
    Exit Sub 
End If 

哪個不佔一個錯誤,只是承認一個國家。如果只有錯誤,您將希望Exit Sub發生。


此錯誤處理可以通過替換來實現:

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

隨着:

On Error GoTo Cat 
userResponse = Application.Dialogs(xlDialogSaveAs).Show(52) 

Cat: 
    Exit Sub 
+0

我有點困惑。你是說在我的OP中用第二段代碼實現你的第一段代碼嗎? – CC268

+0

@ CC268對不起,我在說(在發佈的代碼中)在userResponse應該觸發Exit Sub之後發生的任何事件的觸發錯誤。這意味着在文件對話可見後你不需要If語句。正如你所寫的(我在回答的第一部分中試圖得到的)是If語句與其餘代碼的順序一致,如果發生錯誤則不會發生。 – Cyril

+0

@ CC268更新後,希望更清楚。 – Cyril