Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
976to980
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
976to980
976to980
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Speicherabfrage verhindern

Speicherabfrage verhindern
09.05.2008 14:33:28
Daniel
Hallo,
folgende Problematik: mein workbook enthält einen Button, in dessen Click Ereignis wird das Workbook, nach vorheriger Abfrage ob gespeichert werden soll, geschlossen. So, nun will ich das beim Klicken auf das X in der rechten oberen Ecke entweder nichts passiert, oder auch eine Speicherabfrage kommt oder was auch immer... so weit hatte ich da schon einige Ansätze, Problem ist nur wenn ich das Ergebnis einer Messagebox über select abfrage (yesnocancel), hakt es immer irgendwo... entweder die Messagebox erscheint zweimal oder der Excel Dialog ob "Aenderungen gespeichert werden sollen erscheint"... Ich habe den Code bis dato immer in das Ereignis worksheet_beforeclose(cancel as boolean) geschrieben, weil ich sonst nicht weiss wie ich auf das Click Ereignisses vom X komme...
Hat jemand einen Ansatz wie ich das ganze sauber lösen kann?

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Dein vorhandener Code wäre hilfreich...
09.05.2008 14:44:09
NoNet
Hallo Daniel,
um diese Frage effektiv zu beantworten, wäre es hilfreich, wenn Du Deinen vorhandenen Code (Vor allem das "Private Sub Workbook_BeforeClose") posten würdest !
Gruß, NoNet

AW: Dein vorhandener Code wäre hilfreich...
09.05.2008 14:55:59
Daniel

Private Sub workbook_before_close(cancel as boolean)
dim auswahl
dim Dateiname as String
dim Savepath as String
on error resume next
mkdir("c:\temp")
savepath = (C.\temp)
Auswahl = Msgbox ("Wollen sie vor dem Schliessen speichern", vbyesnocancel,"Datei schliessen")
selcet case auswahl
case vbyes
dateiname= inputbox("blabla","blabla")
thisworkbook.saveas savepath & "\" & dateiname & ".xls"
msgbox (activeworkbook.fullname, "Datei gespeichert unter...")
alleseinblenden ('blendet sheet zur warnung ein, das erscheinen soll wenn makros nicht  _
aktiviert wurden)
thisworkbook.close
case vbno
alleseinblenden
thisworkbook.close false
case cancel
cancel = true
end select
End Sub


Problem, wenn ich es ändere erscheint entweder die Excel ABfrag ob "Änderungen gespeichert werden sollen", oder die Msgbox mit der Abfrage ja,nein, abbrechen kommt zweimal...
So beim click auf Schhliessen-Button meines Workbooks steht bis jetzt der gleiche code, aber es soll so sein, das wenn jemand es richtig macht und das workbook über den Button verlässt, die worbook_beforeclose noch einmal nach fragt ob vor dem verlassen gespeichert werden soll... dies soll nur geschehen, wenn jemand das workbook über das x verlassen will....
Hoof das hilft zur genaueren Analyse meines Problem,
Daniel

Anzeige
Funktioniert "Workbook_Before_Close" ?
09.05.2008 15:29:59
NoNet
Hallo Daniel,
ohne den Code näher zu betrachten :
Heisst dieses Sub tatsächlich "workbook_before_close" ? - funktioniert das ?
Standardmässig heisst dieses Sub "Workbook_BeforeClose" !
Gruss, NoNet

AW: Funktioniert "Workbook_Before_Close" ?
09.05.2008 16:04:19
Daniel
War ein Tippfehler, sorry... heisst Workbook_beforeclose!
Daniel

AW: Dein vorhandener Code wäre hilfreich...
09.05.2008 15:30:34
Reinhard
Hi Daniel,
kopiere bitte den Originalcode rein. Schreibe oberhalb des Codes in deinem Modul
Option Explicit
und teste mal den Code...
Z.B. was soll das sein: savepath = (C.\temp) ?
Gruß
Reinhard

AW: Dein vorhandener Code wäre hilfreich...
09.05.2008 16:11:00
Daniel
Also, folgender Code steht im "Diese Arbeitsmappe":
Option Explicit
Const Start = "Startmenu"
Const OhneMakros = "Warnung"

Private Sub workbook_activate()
Set_Zoom
Startmenue
LockWindow
End Sub



Private Sub workbook_deactivate()
UnlockWindow
End Sub



Private Sub Startmenue()
Dim wks As Worksheet
Sheets(Start).Visible = True
For Each wks In Worksheets
If wks.Name  Start Then wks.Visible = xlSheetVeryHidden
Next
End Sub



Private Sub workbook_before_close(cancel as boolean)
dim auswahl
dim Dateiname as String
dim Savepath as String
on error resume next
mkdir("c:\temp")
savepath = (C.\temp)
Auswahl = Msgbox ("Wollen sie vor dem Schliessen speichern", vbyesnocancel,"Datei schliessen")
selcet case auswahl
case vbyes
dateiname= inputbox("blabla","blabla")
thisworkbook.saveas savepath & "\" & dateiname & ".xls"
msgbox (activeworkbook.fullname, "Datei gespeichert unter...")
alleseinblenden ('blendet sheet zur warnung ein, das erscheinen soll wenn makros nicht  _
aktiviert wurden)
thisworkbook.close
case vbno
alleseinblenden
thisworkbook.close false
case cancel
cancel = true
end select
End Sub


Und folgender Code im Blatt, das den Schliessen Button enthält:
Option Explicit
Const Start = "Startmenu"
Const OhneMakros = "Warnung"


Private Sub worksheet_activate()
Set_Zoom
Worksheets(Start).scrollarea = "a1:j41"
End Sub



Private Sub CommandButton1_Click()       'Auswahl Checkliste Vorbereitung
Sheets("Vorbereitung1").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton2_Click()     'Auswahl Checkliste Verhandlungsziele
Sheets("Kostenziele").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton3_Click()   'Auswahl Checkliste Abgrafe allgemein
Sheets("abfrageallg").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton4_Click()   'Auswahl Protokoll
Sheets("Protokoll").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton5_Click()   'Auswahl Checkliste Giessereien
Sheets("Giessereien").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton6_Click()   'Auswahl Checkliste Schweissereien
Sheets("Schweissereien").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton7_Click()  'Auswahl Checkliste Bearbeiter
Sheets("Bearbeiter").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton8_Click()   'Schliessen Button
Dim auswahl
Dim Dateiname As String
Dim Savepath As String
On Error Resume Next
MkDir ("c:\temp")
Savepath = "c:\temp"
If ThisWorkbook.Saved = True Then
AllesAusblenden
UnlockWindow
ThisWorkbook.Close
Else
auswahl = MsgBox("Die Datei wurde noch nicht gespeichert!" & vbLf & vbLf _
& "Jetzt speichern?", vbQuestion + vbYesNoCancel, "Datei schliessen")
Application.DisplayAlerts = False
Select Case auswahl
Case vbYes
Dateiname = InputBox("Bitte geben Sie den gewünschten Dateinamen ein!", "Speichern unter... _
")
Application.ScreenUpdating = False
AllesAusblenden
ThisWorkbook.SaveAs Savepath & "\" & Dateiname & ".xls"
MsgBox ActiveWorkbook.FullName, vbOKOnly, "Datei gespeichert unter..."
UnlockWindow
ThisWorkbook.Close
Case vbNo
AllesAusblenden
UnlockWindow
ThisWorkbook.Close savechanges:=False
Case vbCancel
End Select
End If
End Sub



Private Sub AllesAusblenden()
Dim ws As Worksheet
Sheets(OhneMakros).Visible = True
For Each ws In ActiveWorkbook.Worksheets
If ws.Name  OhneMakros Then ws.Visible = xlSheetVeryHidden
Next ws
End Sub


Wenn ihr mehr Infos braucht, lasst es mich bitte wissen!
Daniel


Private Sub AllesAusblenden()
Dim ws As Worksheet
Sheets(OhneMakros).Visible = True
For Each ws In ActiveWorkbook.Worksheets
If ws.Name  OhneMakros Then ws.Visible = xlSheetVeryHidden
Next ws
End Sub


Anzeige
"workbook_before_close" kann doch nicht ....
09.05.2008 16:31:06
NoNet
...der ORIGINALCODE Deiner Mappe sein !?!?!
auf einige Fehler haben Reinhard und ich dich bereits hingewiesen !
Gruß, NoNet

AW: "workbook_before_close" kann doch nicht ....
09.05.2008 16:55:00
Daniel
Im Prinzip ist es der Originalcode, nur die workbook before_close hab ich jetzt reinkopiert aus einem Dokument, da ich in der zwischenzeit weiter am Original rumgebastelt habe, ich aber nicht meine experimente posten wollte,... also stört euch nicht an evtl. rechschreibfehlern, ist in der Datei alles sauber durch den Compiler gegangen, daran wird's also nicht hängen....
Daniel

AW: "workbook_before_close" kann doch nicht ....
09.05.2008 18:14:32
fcs
Hallo Daniel,
in des Case Zeile für Abbrechen ist ein Fehler.
Korrekt: Case vbCancel
Gruß
Franz

Private Sub workbook_beforeclose(cancel As Boolean)
Dim auswahl
Dim Dateiname As String
Dim Savepath As String
On Error Resume Next
MkDir ("c:\temp")
Savepath = ("C:\temp")
auswahl = MsgBox("Wollen sie vor dem Schliessen speichern", vbYesNoCancel, "Datei schliessen")
Select Case auswahl
Case vbYes
Dateiname = InputBox("blabla", "blabla")
ThisWorkbook.SaveAs Savepath & "\" & Dateiname & ".xls"
MsgBox (ActiveWorkbook.FullName & ", Datei gespeichert unter...")
alleseinblenden '('blendet sheet zur warnung ein, das erscheinen soll wenn makros nicht _
aktiviert wurden)
ThisWorkbook.Close
Case vbNo
alleseinblenden
ThisWorkbook.Close False
Case vbCancel   '############## Problemzeile
cancel = True
End Select
End Sub


Anzeige
AW: "workbook_before_close" kann doch nicht ....
09.05.2008 18:32:04
Daniel
Hmmm, auch nur ein Rechtschreibfehler, das hätte der Compiler auch gemerkt, es geht viel mehr um die prinzipielle Abfolge... nochmal, drücke ich den schliessen Button, kommt erst die dazugehörende Prozedur, danach geht aber auch noch die Worksheets_beforeclose los und macht das gleiche wie der speicherbutton...
das ist nicht erwünscht...
zweites Problem ist, das innerhalb der Worbook_beforeclose, je nachdem an welche stelle ich die Zeile auswahl= Msgbox... setze die Msgbox entweder zweimal kommt, oder eben die Excel interne Abfrage "Änderungen an dieser Datei speichern" prompted...
Ab jetzt bitte keine Hinweise mehr auf evtl. Rechtschreibfehler, es geht um das Prinzip, nicht das Detail (kann ja später noch kommen;) )
Gruß Daniel

Anzeige
AW: "workbook_before_close" kann doch nicht ....
09.05.2008 19:13:00
Daniel
So hier nochmal die Originale aus der Datei:
1. Diese Arbeitsmappe:
Option Explicit
Const Start = "Startmenu"
Const OhneMakros = "Warnung"

Private Sub workbook_activate()
Set_Zoom
Startmenue
LockWindow
End Sub



Private Sub workbook_deactivate()
UnlockWindow
End Sub



Private Sub Startmenue()
Dim wks As Worksheet
Sheets(Start).Visible = True
For Each wks In Worksheets
If wks.Name  Start Then wks.Visible = xlSheetVeryHidden
Next
End Sub



Private Sub workbook_beforeclose(Cancel As Boolean)
Dim auswahl
Dim Dateiname As String
Dim Savepath As String
On Error Resume Next
MkDir ("c:\temp")
Savepath = "c:\temp"
auswahl = MsgBox("Wollen Sie die Datei vor dem Schliessen speichern?", vbYesNoCancel, "Datei  _
speichern")
Select Case auswahl
Case vbCancel
Cancel = True
Case vbNo
ThisWorkbook.Close savechanges:=False
Exit Sub
End Select
End Sub



Private Sub AllesAusblenden()
Dim ws As Worksheet
Sheets(OhneMakros).Visible = True
For Each ws In ActiveWorkbook.Worksheets
If ws.Name  OhneMakros Then ws.Visible = xlSheetVeryHidden
Next ws
End Sub


2. Startsheet:
Option Explicit
Const Start = "Startmenu"
Const OhneMakros = "Warnung"


Private Sub worksheet_activate()
Set_Zoom
Worksheets(Start).scrollarea = "a1:j41"
End Sub



Private Sub CommandButton1_Click()       'Auswahl Checkliste Vorbereitung
Sheets("Vorbereitung1").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton2_Click()     'Auswahl Checkliste Verhandlungsziele
Sheets("Kostenziele").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton3_Click()   'Auswahl Checkliste Abgrafe allgemein
Sheets("abfrageallg").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton4_Click()   'Auswahl Protokoll
Sheets("Protokoll").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton5_Click()   'Auswahl Checkliste Giessereien
Sheets("Giessereien").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton6_Click()   'Auswahl Checkliste Schweissereien
Sheets("Schweissereien").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton7_Click()  'Auswahl Checkliste Bearbeiter
Sheets("Bearbeiter").Visible = True
Sheets(Start).Visible = False
End Sub



Private Sub CommandButton8_Click() 'Beenden Button
Dim auswahl
Dim Dateiname As String
Dim Savepath As String
On Error Resume Next
MkDir ("c:\temp")
Savepath = "c:\temp"
If ThisWorkbook.Saved = True Then
AllesAusblenden
UnlockWindow
ThisWorkbook.Close
Else
auswahl = MsgBox("Die Datei wurde noch nicht gespeichert!" & vbLf & vbLf _
& "Jetzt speichern?", vbQuestion + vbYesNoCancel, "Datei schliessen")
Application.DisplayAlerts = False
Select Case auswahl
Case vbYes
Dateiname = InputBox("Bitte geben Sie den gewünschten Dateinamen ein!", "Speichern unter... _
")
Application.ScreenUpdating = False
AllesAusblenden
ThisWorkbook.SaveAs Savepath & "\" & Dateiname & ".xls"
MsgBox ActiveWorkbook.FullName, vbOKOnly, "Datei gespeichert unter..."
UnlockWindow
ThisWorkbook.Close
Case vbNo
AllesAusblenden
UnlockWindow
ThisWorkbook.Close savechanges:=False
Case vbCancel
End Select
End If
End Sub



Private Sub AllesAusblenden()
Dim ws As Worksheet
Sheets(OhneMakros).Visible = True
For Each ws In ActiveWorkbook.Worksheets
If ws.Name  OhneMakros Then ws.Visible = xlSheetVeryHidden
Next ws
End Sub


Ziel ist es vor dem Beenden über den "Beenden-Button" nochmal zu fragen, ob die Datei gespeichert werden soll (die Datei ist in dem Fall die Kopie die sich beim Doppelklick einer xlt-Vorlage öffnet), falls nein dann soll das WB ohne zu speichern geschlossen werden, falls cancel dann passiert nichts und falls ja kommt ne Inputbox geprompted, die nach dem gewünschten Namen fragt und das WB unter diesem dann im Ordner C:\Temp speichert. So, das klappt alles soweit, nur kommt beim Beenden des WB nochmal die Abfrage von Excel, auch wenn ich displayalerts auf false setze... dies ist unerwünscht...
weiterhin kommt in der Worbook_beforeclose wie oben geposted die Msgbox beim Klick auf "Abbrechen" nur einmal, beim drücken auf "Nein" aber zweimal ?!? ebenfalls unerwünscht... (die "case vbyes" Zeilen habe ich jetzt nochmal rausgelassen, bis das ganze prinzipiell funktioniert...).
Danke für jeden Denkanstoss,
Daniel

Anzeige
Frage noch offen!
09.05.2008 19:14:33
Daniel
.

AW: Frage noch offen!
09.05.2008 19:44:00
Original
Hi,
die ganze before_Close Prozedur muss nur durchlaufen werden, wenn die Mappe seit Öffnen
verändert und zwischendurch nicht gespeichert wurde, richtig?
Also Abfrage:
If Not Me.Saved then
blaah, blaah...
End If
mfg Kurt

AW: "workbook_before_close" kann doch nicht ....
10.05.2008 04:01:21
fcs
Hallo Daniel,
eins vorweg:
Cancel oder vbCancel ist kein Rechtschreibfehler und wird vom Compiler auch nicht unbedingt als Fehler erkannt!!!!
Dies sind zwei verschiedene Werte
Cancel ist Boolean und True oder False
vbCancel = 2
Ganz ohne Grund ist das in eurer neuesten Version ja wohl nicht geändert worden.
Die Sicherheitsabfrage bei nicht gespeicherter Datei ist ja nicht ohne Grund von Microsoft so eingebaut, dass sie nur mit einigem Aufwand umgangen werden kann.
Jede Anweisung ThisWorkbook.Close führt zum erneuten Aufruf der der BeforeClose-Prozedur. Also ist der Aufruf rekursiv, wenn er in der BeforeClose-Prozedur steht. Dadurch wird der Abfrage-Dialog dann mehrfach angezeigt. Umgehen kann man die Ausführung der Anweisungen nur indem man entsprechende Variablen setzt und in der BeforeClose-Prozedur prüft.
Diese Variablen müssen in einem allgemeinen Modul deklariert werden!.
Mit den folgenden Anpassungen sollte es funktionieren.
Gruß
Franz

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim auswahl
Dim Dateiname As String
Dim Savepath As String
On Error Resume Next
If ThisWorkbook.Saved = True Or bolSchliessenOhneSpeichern = True _
Then Exit Sub  '#### modifiziert fcs
auswahl = MsgBox("Wollen Sie die Datei vor dem Schliessen speichern?", _
vbYesNoCancel, "Datei speichern ")
Select Case auswahl
Case vbYes
'Für testzwecke eingefügt
MkDir ("c:\temp") '### fcs Zeile verschoben
Savepath = "c:\temp" '### fcs Zeile verschoben
Dateiname = InputBox("Bitte geben Sie den gewünschten Dateinamen ein!", _
"Speichern unter... ")
Application.ScreenUpdating = False
AllesAusblenden
Application.ScreenUpdating = True
ThisWorkbook.SaveAs Savepath & "\" & Dateiname & ".xls"
MsgBox ActiveWorkbook.FullName, vbOKOnly, "Datei gespeichert unter..."
Case vbCancel
Cancel = True
Case vbNo
'Tastenkombi Alt+n and Sicherheitsabfrage senden
Application.SendKeys "%n" ' #### fcs
'    ThisWorkbook.Close savechanges:=False ' ### fcs
'    Exit Sub ### fcs modifiziert
End Select
End Sub
'Deklaration in einem allgeneinen Modul
Public bolSchliessenOhneSpeichern As Boolean '#### fcs
Private Sub CommandButton8_Click() 'Beenden Button
Dim auswahl
Dim Dateiname As String
Dim Savepath As String
On Error Resume Next
MkDir ("c:\temp")
Savepath = "c:\temp"
If ThisWorkbook.Saved = True Then
AllesAusblenden
'   unlockwindow  '#### fcs nicht notwendig, wird vom Workbook deactivate erledigt
', ohne das nachfolgende Save kommt in Workbook_BeforeClose automatisch _
die Speichernabfrage
ThisWorkbook.Save '####### modifizierte Zeile fcs
ThisWorkbook.Close
Else
auswahl = MsgBox("Die Datei wurde noch nicht gespeichert!" & vbLf & vbLf _
& "Jetzt speichern?", vbQuestion + vbYesNoCancel, "Datei schliessen")
'   Application.DisplayAlerts = False '#####m odifiziert fcs
Select Case auswahl
Case vbYes
Dateiname = InputBox("Bitte geben Sie den gewünschten Dateinamen ein!", _
"Speichern unter... ")
Application.ScreenUpdating = False
AllesAusblenden
ThisWorkbook.SaveAs Savepath & "\" & Dateiname & ".xls"
Application.ScreenUpdating = True
MsgBox ActiveWorkbook.FullName, vbOKOnly, "Datei gespeichert unter..."
'         unlockwindow '#### fcs nicht notwendig, wird vom Workbook deactivate erledigt
ThisWorkbook.Close
Case vbNo
AllesAusblenden
'     unlockwindow '#### fcs nicht notwendig, wird vom Workbook deactivate erledigt
bolSchliessenOhneSpeichern = True '### fcs Variable muss in allgemeinem Modul _
deklariert sein!!
ThisWorkbook.Close savechanges:=False
Case vbCancel
End Select
End If
End Sub


Anzeige
AW: "workbook_before_close" kann doch nicht ....
12.05.2008 17:06:48
Daniel
Klasse Franz,
so hat es genau entsprechend meinen Vorstellungen geklappt, vielen Dank !
Beste Grüße aus Mannheim,
Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige