2017-03-21 5 views
3

Also habe ich versucht, ein kleines Excel-Blatt zusammenzustellen, das einen Eintrag Log es hat. Wann immer das Blatt geschlossen wird, werden Name, Datum und Uhrzeit hinzugefügt.BeforeClose wird mein Excel-Sheet VBA nicht schließen

Also im Grunde habe ich drei Makro läuft, werde ich nur zwei erwähnen. Das Hauptmakro fragt, ob ich das Blatt schließen will und ich werde mit ja oder nein antworten müssen. Das funktioniert gut. Wenn ich Ja drücke, ruft das Hauptmakro ein Untermakro auf, das mich auffordert, eine Zeichenkette einzugeben. Wenn diese Eingabebox leer ist oder der Eintrag abgebrochen wird, möchte ich, dass die Hauptsubroutine nicht mehr ausgeführt wird und den Schließvorgang abbricht. Was nicht funktionieren wird. Der Fehler im Code zu mir scheint ziemlich klar, aber ich weiß nicht, wie man es verhindert und eine bessere Lösung findet. Wenn Sie mir helfen könnten, eine Lösung zu finden, würde ich es sehr schätzen.

Diese Codezeile scheint das Problem zu sein:

If Cancel_Button_LOG = False Then Cancel = True 

Here I komprimierte Versionen der beiden Makros hinzufügen, werden

Public Sub Add_Entry_to_Log() 
    Dim i As Integer 
    Dim response As Variant 

    Cancel_Button_LOG = True 
    response = InputBox("Please enter your Name", "Name") 
    If response <> "" Then 
    Else   
     Cancel_Button_LOG = False 
     MsgBox "Please enter your name", vbExclamation + vbOKOnly, "Name" 
    End If 
    Worksheets("Log").Protect "secret" 
    ThisWorkbook.Save 
End Sub 

Jetzt möchte ich die Cancel_Button_log Variable verwenden, die stornieren Hauptsubsystem:

Dim answer As Variant 
    answer = MsgBox("Are your sure you want to close the workbook?", vbYesNo) Cancel = False 
    Select Case answer 
     Case Is = vbYes 
      Worksheets("Log").Unprotect "secret" 
      Call Test 
      Call Add_Entry_to_Log 
      If Cancel_Button_LOG = False Then Cancel = True  
      Worksheets("Log").Protect "secret" 
     Case Is = vbNo 
      Cancel = True 
    End Select 

    ThisWorkbook.Save 

End Sub 
+0

Sie Verwenden Sie 'Option Explicit' am Anfang Ihrer Codes (ich empfehle es)? Und wird 'Cancel_Button_LOG' global deklariert? Weil es notwendig ist, wenn Sie es in mehr als einer Untereinheit verwenden möchten. –

+0

Meinst du, wenn du schließst (oder zu einem anderen Blatt wechselst), als du "So wann immer das Blatt geschlossen wurde", ** ODER ** schreibst, wenn du deine Arbeitsmappe schließt (wie in deinem angehängten Code)? –

Antwort

2

Ich denke, Sie tun dies in der kompliziertesten wa y möglich. Wenn ich Ihre Anforderungen richtig zu verstehen - Sie können ersetzen den gesamten Code in Ihrem ThisWorkbook Modul mit etwas wie folgt aus:

Const WB_LOG As String = "Log" '// name of sheet that the log is in 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    If MsgBox("Do you really want to close the workbook?", vbYesNo) = vbYes Then 
     With Sheets(WB_LOG) 
      .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0).Resize(1, 2).Value = Array(Environ$("USERNAME"), Now) 
     End With 

     ThisWorkbook.Save 

    Else 
     Cancel = True 
    End If 
End Sub 

Private Sub Workbook_Open() 
    With Sheets(WB_LOG) 
     .Protect Password:="secret", UserInterfaceOnly:=True 
     .Range("A1:B1").Value = Array("USERNAME", "TIMESTAMP") 
    End With 
End Sub 

Dadurch wird die Notwendigkeit für den Benutzer manuell negieren würde, ihren Namen ein (ihr System Benutzernamen angenommen würde genügen *) und negieren die Notwendigkeit, das Arbeitsblatt jedes Mal zu deaktivieren, da ich die Option UserInterfaceOnly verwendet habe.


* Umgebungsvariablen wie %USERNAME% können gefälscht werden, wenn ein Benutzer dies wünscht und weiß, wie - aber jemand ihren Namen in ein Textfeld eingeben Sie noch einfacher zu fälschen ...

+0

Vielen Dank, funktioniert wie eine Schönheit! Ich weiß es zu schätzen, dass Sie sich dafür einsetzen! – Siroffinance

+0

keine Sorgen :) ... –

Verwandte Themen