2016-04-27 445 views
4

我試圖編寫一個簡短的宏,這將防止Excel工作簿的用戶關閉工作簿而不保護第一張工作表。Before關閉VBA事件關閉工作簿取消= True時

該代碼顯示消息框,但隨後繼續關閉工作簿。據我瞭解,如果「取消」參數設置爲True,工作簿不應該關閉。

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If Sheets(1).ProtectContents = True Then 
     Cancel = False 
    Else 
     MsgBox "Please Protect 'Unique Futures' Worksheet Before Closing Workbook" 
     Cancel = True 
    End If  
End Sub 

我只需要代碼以顯示消息框,然後,如果第一片材沒有被保護不會關閉。

+0

我剛試過取消=不是表(1).ProtectContents,它工作正常。你是否瀏覽了代碼? –

+0

您確定索引1的工作表實際上指向您正在測試的工作表嗎?您可以使用VBE中的立即窗口快速測試此功能。 (按CTRL + G打開立即窗口,然後鍵入'?Sheets(1).Name') – user3561813

+0

我將您的代碼粘貼到新工作簿的ThisWorkbook模塊中。當我試圖關閉它時,我收到了消息,工作簿仍然打開。所以,它爲我工作。我想不出如何得到MsgBox,但沒有取消。 –

回答

2

我可以複製它,如果我將Application.EnableEvents設置爲False。在下面的例子中,我已經記得它的狀態將它放回原來的狀態,但是,我不確定它是如何起始於False的狀態的。

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Dim BlnEventState as Boolean 

    BlnEventState = Application.EnableEvents 
    Application.EnableEvents = True 

    If Sheets(1).ProtectContents = True Then 
     Cancel = False 
    Else 
     MsgBox "Please Protect 'Unique Futures' Worksheet Before Closing Workbook" 
     Cancel = True 
    End If 

    Application.EnableEvents = BlnEventState 

End Sub 

這可能是一個更安全的長期選擇,強制國家而不是設置它。

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Application.EnableEvents = True 
    If Sheets(1).ProtectContents = True Then 
     Cancel = False 
    Else 
     MsgBox "Please Protect 'Unique Futures' Worksheet Before Closing Workbook" 
     Cancel = True 
    End If  
End Sub 
+0

@ user2543601對此有幫助嗎? –