2013-01-07 8 views
5

Ich habe ein Add-in mit einem Anwendungsobjekt. Das Objekt wird mit WithEvents deklariert. Dadurch kann ich jedes Mal, wenn der Benutzer die Datei speichert, einige Datenpunkte in eine zentrale Datenbank übertragen. Dies funktioniert die meiste Zeit. Jedoch gibt es einen Benutzer, der die Excel-Anwendung beendet, die das Dialogfeld Speichern aufruft. Es scheint, dass das Beenden von Excel mit einer nicht gespeicherten Datei bedeutet, dass das WorkbookBeforeSave-Ereignis nicht ausgelöst wird.Excel VBA - WorkbookBeforeSave Ereignis funktioniert

Nur um zu betonen, habe ich bestätigt, dass das Ereignis ausgelöst wird, wenn der Benutzer STRG-S drückt, oder drückt auf die Schaltfläche Speichern. Ich habe auch bestätigt, dass das Ereignis nicht ausgelöst wird, wenn ich die Anwendung beende.

Ich kann mir ein paar Problemumgehungen vorstellen (zum Beispiel automatisch alle 10 Sekunden speichern), aber ich bin nicht verrückt danach. Kann jemand dieses Verhalten bestätigen und/oder hat jemand eine Abhilfe?

Option Explicit 

Private WithEvents mapp As Excel.Application 

Private Sub mapp_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) 

    ' Sanity preservation device 
    Msgbox "WorkbookBeforeSave event fired." 
    SaveSomeData Wb 

End Sub 
+0

also wird das Ereignis überhaupt ausgelöst? Vielleicht möchten Sie sicherstellen, dass 'Application.enableEvents = True' ist. – Larry

+0

Ja, das Ereignis wird ausgelöst, wenn ich die Arbeitsmappe mit STRG-S oder durch Drücken der Speichern-Schaltfläche in der Multifunktionsleiste speichern. Wenn ich jedoch Excel (ALT-F4) beende, werde ich aufgefordert, die Datei zu speichern, aber das WorkbookBeforeSave-Ereignis wird nicht ausgelöst. Wenn es so etwas wie OnQuit oder etwas für das Application-Objekt gäbe, würde ich das verwenden. So etwas sehe ich jedoch nicht. – PirateGrunt

Antwort

2

Haben Sie in Betracht gezogen, vor BeforeClose zu verwenden? Dies könnte eine bessere Alternative sein.

5

Sie könnten die Workbook_BeforeClose Routine und die Saved Eigenschaft des Arbeitsbuchobjekts verwenden.

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If ThisWorkbook.Saved = False Then 
     'Call save function 
    End If 

End Sub 
+0

Leider kann ich das BeforeClose-Ereignis nicht verwenden. Hier ist ein bisschen mehr Hintergrund: als ich hier ankam, gab es Hunderte von Excel-Dateien, die mehr oder weniger die gleiche Codierung hatten, aber es gab eine separate Datei für jeden Kunden. Beim Versuch, diese Dateien nach Informationen zu durchsuchen, erstellte ich ein Add-In, das Daten in eine Access-Datenbank schreiben würde. Um BeforeClose zu verwenden, müsste ich dieses Ereignis zu Hunderten von Arbeitsmappen hinzufügen. Pfui. Ein zusätzliches Problem ist, dass die Arbeitsmappen alle ziemlich groß sind, jeweils etwa 15 MB. Wenn ich zehn davon öffne, läuft mir der Speicher aus. Wir werden das in Zukunft anders machen und Legacy jetzt bereinigen. – PirateGrunt

+0

Klingt wie eine ziemlich klebrige Situation, die du dort hast! Stellen Sie sicher, dass Sie alles zu der Frage hinzufügen, ich persönlich kann nicht an eine saubere Lösung denken, aber andere können dazu in der Lage sein. Viel Glück. –