Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1068to1072
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Prozedur-Fehler bei Auruf über BeforeClose/Save

Prozedur-Fehler bei Auruf über BeforeClose/Save
14.04.2009 16:46:11
Rainer
Hi @ all!
Habe da gerade ein mir nicht wirklich erklärbares Problem:
Eine Sub innerhalb derer ein Workbook geöffnet wird, funktioniert einwandfrei.
Nun soll diese Sub aber auch bei entsprechendem Flag ausgeführt werden, wenn der Nutzer die aktuelle Mappe schliesst.
Hab das Ganze über das Ereignis Workbook_BeforeClose gesteuert und läuft soweit auch problemlos durch unter Excel 2003. Bei Excel 2007 gibt es aber folgendes Problem:
Die Anweisung der Sub ein spezielles Workbook zu öffnen, wird unter Excel 2007 völlig ignoriert (also alles wird normal abgearbeitet, auch die Zeile mit Workbook.open nur das das Workbook nicht geöffnet wird o_O) ... aber nur wenn ich die Sub über das Ereignis Workbook_Close ansteuere. Rufe ich sie normal auf (man kann die Sub auch durch einen Button ablaufen lassen), dann funktioniert sie wiederum einwandfrei.
Hatte dieses Problem schon an einer anderen Stelle, konnte da aber durch einen anderen - genauso guten - Ablauf ausweichen. Hier muß die Sub in Verbindung mit dem Schliessen der Mappe und einem speziellen Flag ausgeführt werden.
Hat jemand eine Idee woran das liegen kann, bzw. wie man das Problem umgeht?
Habe hier auch schon im Forum gesucht aber nichts passendes gefunden (okay, vielleicht auch unter den falschen Begriffen dafür gesucht ^^).
Danke im vorhinein für Eure Hilfe.
Gruß
Rainer (ein neuer hier im Forum ;) )

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
14.04.2009 19:50:25
Gerd
Hi Rainer,
die Anzahl qualifizierter Antworter ist in diesem Forum recht groß.
Aber ohne deine(n) Code(s) zu sehen, wird es wohl nichts werden.
Manche bemühen so ihre Glaskugel u. äußern der Fehler liegt in Codzeile fünf :-)
Gruß Gerd
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
14.04.2009 20:18:36
Rainer
Hi Gerd!
Dank Dir erstmal für die Antwort. Okay, hast sicherlich recht, war irgendwie davon ausgegangen das es eher ein generelles Problem ist als ein Codefehler ... aber natürlich, Hochmut kommt vor dem Fall. ^^
Hier ist der erste Teil:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Range("Data!AF1").Value = "JA"
ActiveWorkbook.Save
If Range("Data!AF3").Value  "JA" Then GoTo Nichtmöglich
Dim Mappe As Workbook
Dim Name As String
For Each Mappe In Application.Workbooks
Name = Mappe.Name
If Not Name Like "Zentral.xls" Then
GoTo NichtSchliessen
End If
Next Mappe
' Abfrage für Schnellspeicherung ohne BU
frage = MsgBox _
("Schnellspeicherung ohne AutoBackup?" & vbLf & _
"(Wenn Sie auf einem mobilen Gerät unterwegs arbeiten, " & vbLf & _
"könnten die Speicherpfade für das Backup nicht vorhanden sein!)", vbYesNo + vbQuestion, " _
AutoBackup?")
If frage = vbYes Then GoTo Schluss ' wenn Ja als Antwort dann zum Ende ohne AutoBU
' und bei Nein normal weiter
If Range("Data!E29") = 2 Then BackupArbeitspfaderstellen Else GoTo Normal ' Abfang ob nur  _
Kunden BU oder auch Arbeitsdateien BU gesetzt ist
Normal:
If Range("Data!E44") = 2 Then BackupKundenerstellen
If Range("data!G56")  "" Then GoTo Warnung Else Cancel = False ' Abfang ob AutoBu für  _
KundenZentral gesetzt
GoTo Schluss
Warnung:
frage = MsgBox _
("AutoBackup aktiv! Wenn Sie Excel schliessen, wird das AutoBackup nicht ausgeführt!" & vbLf &   _
_
_
_
" " & vbLf & _
"Wollen Sie Excel wirklich verlassen?" & vbLf & _
" " & vbLf & _
"(ACHTUNG! Backup erfolgt nicht wenn Sie Excel jetzt verlassen!)", _
4 + vbCritical, "AutoBackup Aktiv!")
If frage = 7 Then Cancel = True Else Cancel = False
Schluss:
' Zurücksetzuung der Ausblendung die beim Öffnen aktiviert wurde
Application.CommandBars("Standard").Visible = True
Application.DisplayFormulaBar = True
Application.DisplayStatusBar = True
Exit Sub
Nichtmöglich:
Cancel = True
MsgBox "Schliessen nur über die interne Funktion möglich!", vbInformation
NichtSchliessen:
Cancel = True
MsgBox "Es sind noch Mappen offen, schliessen Sie diese bitte erst bevor Sie Zentral.xls  _
schliessen!", vbCritical
End Sub


Und hier die Sub nicht normal problemlos läuft, ausser sie wird aus dem obigen Code heraus aufgerufen:


Sub BackupArbeitspfaderstellen()
ActiveWorkbook.Save
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
qpfad = Range("Data!C13").Value
zpfad = Range("Data!C22").Value
oname = Range("Data!C34").Value
neuname = Range("Data!C35").Value
lpfad = Range("Data!C24").Value
üpfad = Range("Data!D13").Value
laufwerk = Range("Data!C21").Value
On Error GoTo Fehler3
If Len(Dir(laufwerk, vbDirectory)) > 0 Then ChDir laufwerk Else _
GoTo Fehler3
On Error GoTo Anlegen
ChDir zpfad
GoTo BereitsAngelegt
Anlegen:
zpfad1 = Range("data!c21") & Range("data!c23")
If Len(Dir(zpfad1, vbDirectory)) > 0 Then ChDir zpfad1 Else GoTo ErstAnlegen
GoTo WeiterAnlegen
ErstAnlegen:
MkDir zpfad1
WeiterAnlegen:
On Error GoTo Fehler3
MkDir zpfad
BereitsAngelegt:
On Error GoTo Fehler
fso.CopyFolder qpfad, zpfad
Dim i As Integer
i = Range("data!d22").Value
i = i + 1
Range("Data!d22").Value = i
Range("data!C26").Value = zpfad
On Error GoTo ErrorHandler
Workbooks.Open Filename:=oname
oname = ActiveWorkbook.Name
Range("FB!C1").Value = üpfad
Set NewBook = ActiveSheet
NewBook.SaveAs Filename:=neuname
ActiveWorkbook.Close SaveChanges:=False
On Error GoTo Fehler2
If Range("data!d24")  0 Then fso.deletefolder lpfad Else GoTo Normal
MsgBox "Backup erfolgreich beendet, Ordner " & zpfad & " erstellt!" & vbLf & _
" " & vbLf & _
"Altes Backup " & lpfad & " wurde gelöscht."
Exit Sub
Normal:
MsgBox "Backup erfolgreich beendet, Ordner " & zpfad & " erstellt!" & vbLf & _
" " & vbLf & _
"Alte Backupdatei " & lpfad & " konnte nicht gelöscht werden."
Exit Sub
Fehler2:
MsgBox "Backup erfolgreich beendet, Ordner " & zpfad & " erstellt!" & vbLf & _
vbLf & _
"Aber Löschung altes Backup schlug fehl!"
Exit Sub
Fehler:
MsgBox "Backup ist fehlgeschlagen! Prüfen Sie bitte ob LW überhaupt existiert"
Exit Sub
Ende:
MsgBox "Backup erfolgreich beendet, Ordner " & zpfad & " erstellt!"
Exit Sub
Fehler3:
MsgBox "Auf Laufwerk/Verzeichnis für Backup Arbeitsdateien" & vbLf & _
"kann nicht zugegriffen werden!"
Exit Sub
ErrorHandler:
MsgBox "Für diese Prozedur ist das automatische Backup nicht verfügbar!"
End Sub


Hoffe ihr könnt nun besser was draus erkennen.
Gruß
Rainer

Anzeige
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
14.04.2009 22:15:38
Gerd
Hallo Rainer,
testen kann ich deinen Code leider nicht, da ich das FSO in meiner Version nicht habe.
Vermutlich liegt dein Problem zumindest mit daran, dass aus dem Before_Close eine
zweite Prozedur aufgerufen wird, in der "ActiveWorkbook.Close steht.
Mache es auf auf diese Tour.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
if .... then cccy (False)
End Sub


Sub normalstart()
cccy
End Sub



Public Function cccy(Optional blnSchließen = True)
MsgBox blnSchließen
If blnSchließen Then ActiveWorkbook.Close
End Function


P.S.: Das Workbook_BeforeClose hat das integrierte Argument "Cancel".
Falls darin die Speicherung abgebrochen werden soll,
If ..... then Cancel=true
Gruß Gerd

Anzeige
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
14.04.2009 23:14:58
Rainer
Hallo Gerd!
Nochmals Danke für die Mühen.
Aber mit Deinem Lösungsansatz habe ich erstmal ein kleines Problem, liegt aber vielleicht auch nur an der Uhrzeit. ^^
Bloß bevor ich komplett umschreibe, wäre ich mir gerne sicher was da passiert. ;)
Zumindest verstehe ich Deinen Ansatz so:
Ereignis Close ... wenn Bedingung dann Ausführung Function cccy mit der Übergabe False
Function schliesst Workbook nicht da Übergabe False
Soweit so gut, aber gleiches Ergebnis erreich ich auch wenn ich gleich zu Beginn des Ereignisses Workbook_Close die Zeile Cancel = True einfüge.
Unklar ist mir jetzt gerade wo Du gedenkst den Aufruf der Sub Normalstart einzubauen und wenn ich Deinen Vorschlag so umsetze, dann muß ich irgendwo wiederum die Function cccy mit dem Wert True ansteuern und laufe wieder in das Ereignis Workbook_Close rein dass wiederum erkennt das die Bedingung Wahr ist damit die Function cccy mit dem Wert False ansteuert etc., etc. ...
Gut in das Ereignis Workbook_Close ein zweites Mal reinzulaufen könnte man mit Application.EnableEvents = False abfangen.
Aber letztendlich wäre es identisch wenn ich gleich zu Beginn Cancel = True einbaue auf die Sub überspringen lasse und am Ende der Sub das Workbook schliesse und das Ereignis Close mit Application.EnableEvents = False abfange.
Oder wo hänge ich?
Gruß
Rainer
Anzeige
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
14.04.2009 23:28:33
Gerd
Hallo Rainer,
wenn Du "innerhalb" des Workbook_BeforeClose eine andere Prozedur aufrufst,
läuft der Code anschließend darin weiter.
Das mit "Cancel" war nur ein Hinweis. Deinen Code im Workbook_BeforeClose habe ich mir
nicht genau angesehen.
"Bevor ich alles ändere...." ist doch kein Problem.
Einfach die Datei kopieren u. in der Kopie lustig ausprobieren. :-)
Gruß Gerd
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
14.04.2009 23:42:46
Rainer
Hi Gerd!
Auch ein Nachtschwärmer ... schön. ;)
Gebe Dir völlig Recht ... ich muss aus dem Ereignis Workbook_Close rauskommen, damit der Rest sauber läuft.
Aber gut ... dann helf mir noch kurz auf die Sprünge: Wie lasse ich denn aus Deinem Vorschlag heraus die Sub ausführen?
Springe ich in die Function und aus der Function in die Sub herein, bin ich ja immer noch nicht aus Workbook_Close draussen. Oder sehe ich da was falsch?
Gruß
Rainer
Anzeige
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
15.04.2009 00:07:13
Gerd
Hallo Rainer!
Im Workbook_BeforeClose
.............................................
'Normal:
'If Range("Data!E44") = 2 Then Schließarbeiten (False)
...............................................
Sub BackupKundenerstellen()
Call Schließarbeiten
End Sub



Public Function Schließarbeiten(Optional blnSchließen = True)
'Da den bisherigen Code von BackupKundenerstellen, dann müssen weitere Prozeduren nicht  _
angepasst
'werden.
If blnSchließen Then ActiveWorkbook.Close
End Function


Nee, wer zuhause ist, "schwärmt nicht ....." u. falls doch, ich jetzt dann nicht mehr.
Gruß Gerd

Anzeige
AW: Prozedur-Fehler bei Auruf über BeforeClose/Save
15.04.2009 00:49:26
Rainer
Hi Gerd!
Kann man so oder so sehen ... wer um die Uhrzeit noch in Foren unterwegs ist, schwärmt ja auch irgendwie. ;)
Ich denke ich habe Dich schon, bzw. verstehe schon was Du meinst. Aber es bringt nix, da ich dadurch das Ereignis Workbook_Close nie verlasse.
Wenn ich von Workbook_Close in die Function springe, von dort aus meinen Code ausführe oder von Workbook_Close in die Sub und von dort aus in die Function springe und den code ausführe oder wie auch immer geartet ist völlig Banane ... es funzt nicht.
Was ich ja überhaupt nicht verstehe. o_O
Bin jetzt einen relativ grossen Umweg gegangen, in dem ich Workbook_Close völlig aussen vor lasse, bzw. nur soweit nutze um dem User zu verbieten per Excel-Menü das Schliessen der Mappe durchzuführen. Einfach in dem ich auf dem Datenblatt ein Flag abfrage, wenn nicht gesetzt dann nix schliessen.
Dadurch wird der Nutzer gezwungen die Schliessenfunktion per Button vor zu nehmen. Der verweist dann direkt auf den Code der ehemals in Workbook_Close stand und nun eine eigene Sub bekommen hat und am Ende setze ich das Flag im Datenblatt und damit schliesst sich die Mappe, bzw. spricht dann erst das Ereignis Workbook_Close an und das prüft nur noch Flag gesetzt und wenn ja dann Cancel = False, wenn nicht gesetzt dann eben Cancel = True.
Und gucke mal da, dass Ganze läuft einwandfrei durch ohne Änderungen am ursprünglichen Code vorgenommen zu haben.
Allerdings lasse ich den Thread noch offen einfach weil ich es schlicht nicht verstehe, bzw. sicherlich an anderen Stellen auf ähnliche Probleme stosse und gerne wüsste a.) woran liegt es und b.) gibt es dafür eine grundsätzliche Lösung.
Derzeit bleibt mir schlicht nur übrig einen üblen Bug in Excel 2007 zu vermuten. Der eben dafür sorgt das Ereignisse die mit Excel 2003 geschrieben sind und dort Methoden wie .Open und .Close ausführen nicht funktionieren und dieser Bug wird mit abgespeichert und sorgt dafür das es dann auch unter Excel 2003 nicht mehr läuft.
Wäre allerdings dankbar für Hinweise, Erklärungen und Tips/Tricks zur Umgehung der Problematik. Ist schließlich schon ein gewisser Akt jedesmal krampfhaft die Ereignisse Workbook_BeforClose/Before_Save (juup, tritt da genauso auf) umständlich zum umgehen.
Gruß
Rainer
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige