2016-04-27 444 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对此有帮助吗? –