Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1520to1524
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 beim Beenden der Mappe

Prozedur beim Beenden der Mappe
03.11.2016 08:08:55
EasyD
Hallo zusammen
wer kann helfen?
Ich möchte eine Prozedur ausführen beim Schließen der Arbeitsmappe. Vor dem schließen Frage ich mit einer MsgBox ab, ob die Prozedur ausgefürt werden soll oder nicht.
(die Prozedur an sich dürfte für meine Begriffe egal sein, es geht lediglich darum vom Blatt Erfassung einen Bereich auf das Blatt Historie zu kopieren).
Leider hat die MsgBox keine Auswirkung, die Prozedur wird IMMER ausgefürt. Bei Abbruch durch die MsgBox will ich aus der Prozedur raus, deshalb End.
Was ist mein Fehler?
Der Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
MsgBox "Erfassung festschreiben?" & Chr(13) & "Die Erfassung wird geleert!", vbOKCancel
'xxxxxxxxxxxxxxxxxx das funktioniert noch nicht, der Code wird immer ausgeführt  _
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
If vbOKCancel = vbOK Then
Application.ScreenUpdating = False
Sheets("Historie").Unprotect Password:="123"
Sheets("Erfassung").Select
Rows("4:9").Select
Selection.Copy
Sheets("Historie").Select
Range("A100000").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("A100000").End(xlUp).Offset(-1, 1).Select
ActiveCell.SpecialCells(xlCellTypeSameValidation).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
:=xlBetween
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Sheets("Historie").Protect Password:="123"
Sheets("Erfassung").Select
Sheets("Erfassung").Unprotect Password:="123"
Range("B4:AZ9").Select
Selection.ClearContents
Selection.ClearComments
Sheets("Erfassung").Protect Password:="123"
Application.ScreenUpdating = True
Else
End
End If
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Prozedur beim Beenden der Mappe
03.11.2016 08:29:36
Luschi
Hallo EasyD,
in der Online-Vba-Hilfe:
https://msdn.microsoft.com/de-de/library/office/gg251821(v=office.15).aspx
steht ein passendes Beispiel dazu (ganz unten)
Gruß von Luschi
aus kleinh-Paris
AW: Prozedur beim Beenden der Mappe
03.11.2016 12:42:00
EasyD
Hallo Luschi
Dieter hat mir weiter geholfen, klappt jetzt.
nur kurz zu deinem Verweis auf die Hilfe - meine persönliche Meinung - die Hilfe ist nur was für die Cracks, die einwandfrei mit VBA umgehen können.
Ich selbst habe immer schon Schwierigkeiten überhaupt eine passende Lösung für mein Problem in der Hilfe zu finden und selbst wenn ich eine Lösung finde, habe ich mit der Umsetzung Schwierigkeiten weil die Hilfe halt nunmal für Leute geschrieben ist, die wirklich tiefe VBA-Kenntnisse bereits haben.
Ich bin immer noch absolut im Lernprozess...
Dein Link gibt sicherlich alles wieder was man in Sachen MsgBox wissen sollte, aber bei mir scheitert es schon daran, dass ich nicht erkenne welche Rolle die Wiedergabe der Werte spielt.
Konkret:
warum klappt es wenn ich vbYesNo auswähle und die MsgBox bei vbNo eine 7 wiedergibt und
wieso klappt es bei vbOkCancel nicht wenn die MsgBox bei VbCancel eine 2 wiedergibt?
(PS: die gleiche Frage habe ich im Grunde schon Dieter weiter unten nochmal gestellt...)
Anzeige
AW: Prozedur beim Beenden der Mappe
03.11.2016 11:44:49
Dieter(Drummer)
Hallo EasyD,
probier mal (fette Zeilen. mit "'", kannst du löschen):
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'MsgBox "Erfassung festschreiben?" & Chr(13) & "Die Erfassung wird geleert!", vbOKCancel
'xxxxxxxxxxxxxxxxxx das funktioniert noch nicht, der Code wird immer ausgeführt _
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
'If vbOKCancel = vbOK Then
If MsgBox("Erfassung festschreiben?" & Chr(13) & "Die Erfassung wird geleert!", vbOKCancel) =  _
vbCancel Then
Exit Sub
End If
Application.ScreenUpdating = False
Sheets("Historie").Unprotect Password:="123"
Sheets("Erfassung").Select
Rows("4:9").Select
Selection.Copy
Sheets("Historie").Select
Range("A100000").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("A100000").End(xlUp).Offset(-1, 1).Select
ActiveCell.SpecialCells(xlCellTypeSameValidation).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
:=xlBetween
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Sheets("Historie").Protect Password:="123"
Sheets("Erfassung").Select
Sheets("Erfassung").Unprotect Password:="123"
Range("B4:AZ9").Select
Selection.ClearContents
Selection.ClearComments
Sheets("Erfassung").Protect Password:="123"
Application.ScreenUpdating = True
'Else
End
 'End If
End Sub

Anzeige
AW: Kleines VBA Beispiel, zu Ja oder Nein...
03.11.2016 12:00:52
Dieter(Drummer)
Hallo EasyD,
Beispiel:
Sub JaNein()
If MsgBox("Ja, oder nein", vbYesNo) = vbYes Then
MsgBox ("Ja, gedrückt.")
Else
MsgBox "Nein, gedrückt"
End If
End Sub

Gruß, Dieter(Drummer)
AW: Kleines VBA Beispiel, zu Ja oder Nein...
03.11.2016 12:31:01
EasyD
Danke Dieter
mit vbYesNo funktioniert es, ich habe "no" abgefragt und gehe mit Exit Sub raus. Im Else-Fall dann der Code.
Vielen Dank
Was macht den Unterschied zwischen vbOkCancel und vbYesNo aus (außer "Nein" statt "Abbruch")?
Das Ergebnis ist doch eigentlich das gleiche. klick auf "Abbruch" müsste für meine Begriffe die gleiche Funktion haben oder nicht?
Anzeige
Eben, die unterschiedl Werte (vgl oben!) der ...
03.11.2016 15:19:54
Luc:-?
…Konstanten, Easy;
ansonsten ist natürlich beides dual und du siehst 2 Tasten, die aber unterschiedl beschriftet sind. Stellst du in der MsgBox eine Frage, ist wohl vbYesNo die richtige Wahl. Willst du ggf noch eine folgenlose 3.Möglichkeit vorsehen, wählst du vbYesNoCancel. Cancel suggeriert dem Nutzer stets ein folgenloses Beenden, eben einen Abbruch der Aktion, und das ist so auch richtig! Deshalb wurde wohl bei einer anderen Trialität eine andere Konstante für einen Quasi-Abbruch gewählt.
vbYesNo signalisiert ein striktes Entweder-Oder. Wie du das ausgestaltest, ist dann natürlich deine Sache. Viele Nutzer hätten gern noch mehr verschiedene, im Grunde aber redundante Tasten­Beschriftungen. Du bist der Erste, der das Angebot reduzieren will… ;-]
🙈 🙉 🙊 Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Eben, die unterschiedl Werte (vgl oben!) der ...
04.11.2016 11:03:56
EasyD
ah, ok
ich glaube da kommt wieder etwas Licht ins Dunkel.
Sicher habe ich eine Frage in der MsgBox gestellt auf die es nur 2 mögliche Antworten gibt, nämlich ja oder nein. Das erklärt ja eigentlich schon die Notwendigkeit von vbYesNo.
Klick auf Nein (bzw Abbruch in der nicht funktionierenden Version) soll ja aber auch noch eine Aktion auslösen, nämlich das Ende der Prozedur. In gewisser Weise und aus Sicht des Nutzers ist das ja folgenlos, aber ich glaube ich habe verstanden was du meinst wenn du sagt "folgenloses Beenden".
Sprich - wirklich nichts machen (auch nicht die Prozedur beenden)....
Und genau DAS müsste in der Online-Hilfe auch mal an irgendeiner Stelle auch für Einsteiger erklärt werden finde ich.
Sehr schön! Vielen Dank!
Fragen lohnt sich hier im Forum - das stelle ich immer wieder fest!
Ein schönes Wochenende!
Anzeige
Dito WE! Aber nochmal zu 'folgenlos', ...
04.11.2016 15:07:16
Luc:-?
…Easy;
man sollte dem Nutzer immer Alternativen bieten, damit er sich schon mal informieren kann, was kommen würde. Jede gute Dialog-Software ist so aufgebaut. Nur, wenn's um eine reine Info geht, reicht hier vbOKOnly. Anderenfalls sollte ein Cancel das Pgm beenden ohne das etwas passiert. Ein vbOKCancel ließe dann die Alternativen Ausführen oder nichts tun zu, ein vbYesNo ggf auch, könnte aber auch 2 alternative Ausführungen ohne AbbruchMöglichkeit bedeuten. Also wäre es besser, hier ebenso wie bei vbOKCancel zu verfahren und für den Fall, dass wirklich 2 alternative Ausführungswege vorgesehen sind, lieber vbYesNoCancel zu verwenden. Im Cancel-Fall wird das Pgm dann folgenlos beendet, d.h., keine der beiden Alternativen wird ausgeführt.
Gruß, Luc :-?
Anzeige
AW: Danke für Rückmeldung. owT
03.11.2016 16:16:26
Dieter(Drummer)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige