2016-04-27 12 views
4

Excelのブックのユーザーが最初のシートを保護せずにブックを閉じるのを防ぐための短いマクロを作成しようとしています。BeforeClose VBAイベントをキャンセルするときにブックを閉じる

コードは、メッセージボックスを表示しますが、その後、ブックを閉じます。私の理解から、 "キャンセル"パラメータが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

私はちょうどCancel = Not Sheets(1).ProtectContentsを試してみましたが、うまくいきました。コードを踏んだことはありますか? –

+0

インデックス1のワークシートが実際にテストしているシートを指していることは確かですか? VBEのイミディエイトウィンドウを使用してこれを簡単にテストできます。 Ctrl + Gキーを押してイミディエイトウィンドウを開き、 '?Sheets(1).Name'と入力します) – user3561813

+0

新しいブックのThisWorkbookモジュールにコードを貼り付けました。私はそれを閉じようとしたときにメッセージを受け取り、ワークブックは開いたままになりました。それで、それは私のために働いた。私はMsgBoxをどうやって手に入れるか考えていませんが、キャンセルはしません。 –

答えて

2

Application.EnableEventsFalseに設定すると、それを複製することができます。下の例では、私はそれが後に置かれるように状態を記憶していましたが、どのようにそれが最初に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これは役に立ちましたか? –

関連する問題