2017-01-04 3 views
1

Ich habe den folgenden Code in einer Excel 2010-Arbeitsmappe:VBA-Code in Workbook_BeforeClose läuft, hat aber keine Wirkung

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    Dim FileName As String 

    FileName = ActiveWorkbook.Name 

    If FileName = "False" Then Exit Sub 

    If FileName <> "Shipping Manifest SaveAS Update.xlsm" Then 
     Application.DisplayAlerts = False 
     ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 
     Application.DisplayAlerts = True 
    End If 

End Sub 

Der Code wird ausgeführt, wenn ich einen Haltepunkt einfügen und Zeile-für-Zeile laufen, aber wenn ich Öffnen Sie die Arbeitsmappe erneut. Sie fordert nicht zur Eingabe des Passworts "abc123" auf, um es nicht im schreibgeschützten Modus zu öffnen. Es wird nur geöffnet. Was mache ich falsch? Ich habe sichergestellt, dass Makros aktiviert sind.

+1

Nicht in der unhöflich aber es hat mich schon mal erwischt, öffnest du den richtigen zu überprüfen? Wenn Sie in Ihrem Ordner Dokumente suchen (normalerweise C: \ Benutzer \ [BENUTZERNAME] \ Dokumente \ [DateiN \ me] .xlsm), kann es sein, dass Sie keinen vollständigen Pfad angegeben haben, damit er in Ihre Dokumente eingefügt werden kann 'Ordner standardmäßig. –

+0

Guter Punkt, aber es spart den erwarteten Standort. – JeffK627

Antwort

1

Sie haben Warnungen mit Application.DisplayAlerts = False unterdrückt. Entfernen Sie diese Zeile und Sie werden sehen, was das Problem ist.

Wenn Warnungen deaktiviert sind, verwendet Excel die Standardoption. In diesem Fall werden Sie gewarnt, dass eine Datei bereits existiert, und Excel möchte, dass Sie bestätigen, dass das Überschreiben in Ordnung ist. Die Standardoption für diese Ja/Nein/Abbrechen ist "Nein", so scheint es, dass die Datei nicht gespeichert wird.

Das andere mögliche Problem ist, dass Sie ThisWorkbook und ActiveWorkbook verwirren können. Das Ereignis _BeforeClose wird nur von der Arbeitsmappe ausgeführt, in der es sich befindet. Daher gibt es wohl keinen Grund für eine Namensüberprüfung, vorausgesetzt, Sie möchten die Arbeitsmappe immer dort speichern, wo sich dieser Code befindet, wenn Sie ihn schließen.

Stattdessen versuchen:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    With ThisWorkbook 
     .WritePassword = "abc123" 
     .ReadOnlyRecommended = True 
     .Save 
    End With 
End Sub 

Die obige Annahme halten kann nicht, wenn die Arbeitsmappe programmatisch geschlossen wird, in welchem ​​Fall Sie eine Unterscheidung zwischen ThisWorkbook benötigen und ActiveWorkbook, aber es ist schwer, sich vorzustellen, warum Wenn Sie diese Arbeitsmappe schließen, möchten Sie eine andere (aktive) Arbeitsmappe speichern.

Auch zu Garys Kommentar oben (und ich habe es getestet), wenn Sie nicht einen vollständigen Pfad angeben, wird die Datei in Ihrem Ordner Dokumente gespeichert (zumindest ist es für mich in Excel 2013).

Möglicherweise müssen Sie tun:

ActiveWorkbook.SaveAs FileName:=ActiveWorkbook.FullName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 

in Ihrem Code wie:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If ActiveWorkbook.Name <> "Shipping Manifest SaveAS Update.xlsm" Then 
     Application.DisplayAlerts = False 
     ActiveWorkbook.SaveAs FileName:=ActiveWorkbook.FullName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 
     Application.DisplayAlerts = True 
    End If 

End Sub 
+0

Ihre Lösung funktioniert teilweise. Es wendet das ReadOnlyRecommended aber nicht das WritePassword an. Ich kann WriteResPasswords nicht verwenden, es ist keine Methode des BeforeClose-Ereignisses. – JeffK627

+0

OK, dann mit minimaler Änderung machen Sie Ihren Code tun: 'ActiveWorkbook.SaveAs Dateiname: = ActiveWorkbook.FullName, FileFormat: = xlOpenXMLWorkbookMacroEnabled, WriteResPassword: =" abc123 ", ReadOnlyRecommended: = True' –

+1

Mit FullName gearbeitet. Dies wird von einer Anwendung ausgeführt, die eine Vorlage öffnet und unter einem neuen Namen speichert. Eine der Voraussetzungen ist, dass die neue Datei nur von Personen geöffnet werden kann, die das Passwort kennen. für alle anderen wird es als Read Only geöffnet. Wir können die Vorlage nicht als schreibgeschützt öffnen, daher der Namensvergleich. – JeffK627

-1

ich die "cancel als Boolean" entfernt und es funktionierte perfekt

Private Sub Workbook_BeforeClose() 
Dim FileName As String 



FileName = ActiveWorkbook.Name 

If FileName = "False" Then Exit Sub 


If FileName <> "Shipping Manifest SaveAS Update.xlsm" Then 
    Application.DisplayAlerts = False 
    ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 
    Application.DisplayAlerts = True 
End If 

End Sub 
+0

Nein, hat es nicht :) Wenn dieser Code tatsächlich funktioniert, haben Sie eine Ereignisprozedur in einem Standardmodul platziert und es wird nicht als Ereignis ausgelöst. Sie können das Argument 'Cancel' nicht aus dem BeforeClose-Ereignis entfernen, das ist erforderlich. Wenn Sie also diesen Code im Arbeitsmappenmodul haben, erhalten Sie einen Kompilierungsfehler. –

+0

Ich werde zugeben, dass ich viel weniger darüber weiß, als Sie gezeigt haben. das sagte: meins ist gelaufen. es hat gerettet. und beim erneuten Öffnen habe ich mich für das angegebene Passwort geäußert. ¯ \ _ (ツ) _/¯ – Stoploss

+0

Ja, wenn Sie den Booleschen Abbruch als Boolescher Fehler aus dem Ereignis entfernen, wird der Fehler ausgegeben. – JeffK627

Verwandte Themen