Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1544to1548
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

Ereignismakros "kollidieren"

Ereignismakros "kollidieren"
07.03.2017 09:38:15
Florian

Guten Morgen
Meine Ereignismakros scheinen zu kollidieren, oder ein Makro funktioniert nicht sauber.
Da der Upload relativ schwierig ist, weil z.B. 7zip als Backup Programm benötigt wird, versuche ich das ganze erstmal ohne - wenn es nicht ohne Datei geht, kann ich versuchen die betroffenen Makros aus meinem Programm in eine Beispieldatei zu packen.
Es gibt eine Seite "Einstellungen" welche ich über eine Userform bediene und dann Werte in True und False ändere - hierauf greife ich dann mit anderen Makros zu.
So auch E4 für Autosave True oder False.
Nun gibt es ein Makro im Workbook_BeforeClose:
With ThisWorkbook.Worksheets("Einstellungen")
MsgBox ("läufT")
.Range("A1") = Year(Date)
If .Range("E4") = True Then ActiveWorkbook.Save
If .Range("G7") = True Then Call DelDatensicherung
End With
Wenn also E4 Wahr ist, wird meine Datei beim schließen gespeichert, die Meldung "wollen sie speichern vorm beenden" wird unterdrückt.
Das funktioniert soweit, jedoch nicht, wenn meine Datensicherung läuft.
Dann soll die Datei beendet werden (was auch klappt) - es erscheint aber die Meldung ob gespeichert werden soll.
Diese kommt sowohl, wenn ich die Datensicherung manuell starte, als auch wenn sie automatisch startet.
Ich kann mir jedoch nicht erklären, warum das so ist.
Hier die Makros die ich dafür für relevant erachte:
Ereignismakros:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With ThisWorkbook.Worksheets("Einstellungen")
MsgBox ("läufT")
.Range("A1") = Year(Date)
If .Range("E4") = True Then ActiveWorkbook.Save
If .Range("G7") = True Then Call DelDatensicherung
End With
End Sub

Sub Workbook_Activate()
Application.Caption = Worksheets("Einstellungen").Range("B2").Value & " offene Lieferungen   _
/  " & Worksheets("Einstellungen").Range("B4").Value & " offene Kundenbestellungen"
ActiveWindow.Caption = "Bestellwesen"
If Worksheets("Einstellungen").Range("E10") = False Then Application.DisplayFormulaBar =  _
False
End Sub

Private Sub Workbook_Open()
With ThisWorkbook.Worksheets("Einstellungen")
If Year(Date) = .Range("A1") + 1 Then
Call Jahreswechselmakro
ElseIf .Range("E5") = True Then
Application.OnTime Now, "letzteDatensicherung"
End If
End With
End Sub
und die Makros welche aufgerufen werden:
Jahreswechselmakro wird nur gestartet, wenn das Jahr eins größer wird.
'Makro für Zeitdifferenz der letzten Datensicherung
Sub letzteDatensicherung()
Dim strVerzeichnis As String
Dim StrDatei As String
Dim i As Integer
Dim strTyp As String
Dim Dateiname As String
Dim zeit As Date
Dim Difzeit As Long
strVerzeichnis = ThisWorkbook.Path & "\zbackup\"
strTyp = "*.zip"
Dateiname = Dir(strVerzeichnis & strTyp)
If Dateiname = "" Then
If MsgBox("Es gibt keine Datensicherung" & _
Chr(10) & "Soll diese nun erzeugt werden?", vbYesNo) = vbNo Then Exit Sub
Call Datensicherung
Exit Sub
End If
zeit = FileDateTime(strVerzeichnis & Dateiname)
Do While Dateiname  ""
If zeit = Worksheets("Einstellungen").Range("E6").Value Then
If MsgBox("Die letzte Datensicherung ist " & Difzeit & " Tage alt." & _
Chr(10) & "Soll jetzt eine Datensicherung erzeugt werden?", vbYesNo) = vbNo Then Exit  _
Sub
Call Datensicherung
End If
End Sub

'Makro zum erstellen der Datensicherung
Sub Datensicherung()
Dim Pfad7z As String
Dim PfadBackup As String
Dim PfadDateien As String
Dim datum As String
datum = Format(Now, "YYYY.MM.DD HH.MM")
Pfad7z = ThisWorkbook.Path & "\Programme\7zip\"
PfadBackup = ThisWorkbook.Path & "\zbackup\"
PfadDateien = ThisWorkbook.Path
TBbeendet = True
FFbeendet = True
ActiveWorkbook.Save
'Prüfem ob Thunderbird läuft
TBbeenden
If TBbeendet = False Then Exit Sub
'Prüfen ob Firefox läuft
FFbeenden
If FFbeendet = False Then Exit Sub
'Datensicherung von allem
Shell (Pfad7z & "7za a -tzip " & Chr(34) & PfadBackup & datum & ".zip" & Chr(34) & " " &  _
Chr(34) & PfadDateien & Chr(34) & " -xr!*.zip"), vbNormalFocus
ThisWorkbook.Close
End Sub

'Makro zum löschen der Datensicherungen
Public Sub DelDatensicherung()
Dim strVerzeichnis As String
Dim strTyp As String
Dim Dateiname As String
Dim lngbehalten As Long
Dim i As Integer
Dim arrDateiname() As String
Dim j As Long
strVerzeichnis = ThisWorkbook.Path & "\zbackup\"
strTyp = "*.*"
Dateiname = Dir(strVerzeichnis & strTyp)
lngbehalten = ThisWorkbook.Worksheets("Einstellungen").Range("E7").Value
Do While Dateiname  ""
i = i + 1
ReDim Preserve arrDateiname(1 To i)
arrDateiname(i) = Dateiname
Dateiname = Dir
Loop
BubbleSort arrDateiname(), False
For j = 1 To i
If j > lngbehalten Then
Kill strVerzeichnis & arrDateiname(j)
End If
Next
End Sub

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ereignismakros "kollidieren"
07.03.2017 10:18:54
onur
Hi,
Du könntest z.B.messen, wie lange die datensicherung braucht und eine warteschleife vor
ThisWorkbook.Close

einbauen (+ sicherheitsreserve)
oder vor dem schliessen prüfen lassen, ob die zip-datei bereits existiert (sonst warteschleife bis sie existiert) -
ich weiss nur nicht ob 7zip die datei als dummy schon mal hineinschreibt, wenn er anfängt oder erst wenn er fertig ist.
AW: Ereignismakros "kollidieren"
07.03.2017 13:49:20
Florian
Hmm.
Ne das haut nicht hin.
Die Datei kommt (glaube ich als Dummy hinein).
Jedoch muss meine Exceldatei geschlossen sein, BEVOR die Datensicherung anfängt.
Das hat bisher auch immer anstandslos funktioniert.
Mein Datensicherungsmakro führt den beenden Befehl aus.
Das Ereignis before Close tritt in Kraft - die Datei wird gespeichert und ohne gemecker beendet.
Durch das "wollen sie speichern vor dem schließen" schaffe ich es aber nicht mehr meine Exceldatei rechtzeitig zu beenden und 7zip meckert, dass die Datei noch offen ist.
Aber wenn ich mir meinen Code anschaue, dürfte eben doch diese speichern Meldung garnicht erscheinen?
Anzeige
AW: Ereignismakros "kollidieren"
07.03.2017 14:24:51
onur
Application.DisplayAlerts = false
vor dem schliessen der datei müsste das beheben
AW: Ereignismakros "kollidieren"
07.03.2017 16:24:37
Florian
Ja nein.
Das unterdrücken der Meldung löst ja mein Problem nicht.
Wenn beim schließen meiner Datei, trotz des Save in der Before Close eine Meldung kommt, ob vor dem schließen gespeichert werden soll, dann läuft ja mein Makro nicht sauber.
Warum auch immer wird das Before Close garnicht erst gestartet.
Die Frage hier ist ja warum das so ist, nicht wie ich die Meldung unterdrücke.
Mit DisplayAlerts auf False wird dann einfach beendet - ohne speichern...
AW: Ereignismakros "kollidieren"
07.03.2017 16:38:09
onur
Du löst zweimal workbook.close aus:
Beim schliessen wird Workbook_BeforeClose aufgerufen, springt zu datensicherung und am ende davon steht wieder workbook_close.
Wenn das workbook beim nächsten mal nicht schon geschlossen wäre, hättest du eine endloschleife.
Anzeige
AW: Ereignismakros "kollidieren"
07.03.2017 17:07:47
Florian
Hmm.
Jetzt kann ich dir nicht mehr folgen.
Warum löse ich das Close zwei mal aus? (also das könnte ja ein Grund sein)
Ich schließe entweder mein Excel "normal" dann kommt das save und wenn G7 auch true ist DELDatensicherung (nicht datensicherung) DelDatensicherung löscht alle Backups die mehr sind als 10 von alt nach neu.
Oder ich schließe mein Excel über das Datensicherungsmakro.
Aber in beiden Fällen kommt doch das Close Ereignis nur einmal, oder habe ich da jetzt einen Denkfehler?
AW: Ereignismakros "kollidieren"
07.03.2017 17:13:46
onur
Nein nicht DU, ich habe mich verlesen - sorry.
Ich suche weiter.
Kannst du die datei posten?
Anzeige
AW: Ereignismakros "kollidieren"
07.03.2017 17:20:45
Florian
Aber da könnte man ja drauf aufbauen.
Private Sub Workbook_Open()
With ThisWorkbook.Worksheets("Einstellungen")
If Year(Date) = .Range("A1") + 1 Then
Call Jahreswechselmakro
ElseIf .Range("E5") = True Then
Application.OnTime Now, "letzteDatensicherung"
End If
End With
End Sub

Das ist mein Open.
Die Prüfung kann ich ja lassen wie sie ist, weil in A1 steht ja nunmal 2017 - das muss ich ja nicht bei jedem schließen neu da rein schreiben.
Nachdem mein Jahreswechselmakro durch ist (dieses schreibt meine Formeln neu und kopiert die Umsätze aus dem vergangenen Jahr in eine Übersichtsseite um "Platz" zu machen für das nun aktuelle Jahr)
kann ich ja innerhalb des Jahreswechselmakros (am ende halt) die neue Jahreszahl in a1 schreiben.
Das sollte doch ebenfalls funktionieren?
Nun bleibt aber meine Frage noch offen.
Warum funtioniert das Save im before close nicht, wenn ich im gleichen Makro noch änderungen durchführe?
Anzeige
AW: Ereignismakros "kollidieren"
07.03.2017 17:39:54
onur
Wenn du die datei postest, kann ich mal reinschauen und richtig debuggen, so ohne datei und testmöglichkeit ist das wie blindschach, man wird ganz gaga dabei (du siehst ja, ich rede manchmal blödsinn).
AW: Ereignismakros "kollidieren"
07.03.2017 18:01:16
Florian
hmm, ok mache ich.
Nicht wundern, ich anonymisiere die Datei - also lösche nur den Inhalt der Tabellenblätter die betrieblich relevant sind.
Nimmst du einen Rapidshare (oder so seiten halt) download an?
Dann lade ich dir den ganzen Ordner (inklusive eben dem Konsolen 7zip - welches die Datensicherung macht und der Ordnerstruktur, damit die Datensicherungen auch geschrieben werden können.
Wenn du das nicht möchtest (was natürlich vollkommen ok wäre), lade ich hier eine xls hoch und kommentiere die "eigentliche" Datensicherung aus, damits läuft.
Anzeige
AW: Ereignismakros "kollidieren"
07.03.2017 18:04:32
onur
Beides ist ok, glaube ich.
rapidshre kenn ich nicht, kennst du dropbox?
AW: Ereignismakros "kollidieren"
08.03.2017 08:44:10
Florian
Ok,
dann werde ich gleich mal anonymisieren und dir das ganze hochladen.
ABER BITTE ACHTUNG!
Ich hab natürlich nichts dagegen, dass du dir meinen Code reinziehst - wenn du magst findest du dort mit Sicherheit einige Gründe mir Tipps zu geben (nett ausgedrückt) :)
Das eigentliche Problem ist ja aber behoben (hab ich schonmal in einem Beitrag früher geschrieben) wollte nur sichergehen, dass du das weißt, bevor du dir die Arbeit machst.
(Warum dieser Fehler aufgetreten ist, würde mich aber dennoch interessieren)
Anzeige
AW: Ereignismakros "kollidieren"
08.03.2017 09:18:23
Florian
So
Leider hat die anonymisierung nicht hingehauen - die Datei funktioniert dann nicht mehr sauber.
Da viele Makros auf Datensätze zugreifen, die ich entfernt habe.
Ich habe die ganze Situation jedoch in einer Datei nachgestellt und die entsprechenden Originalmakros eingefügt und auskommentiert.
https://www.herber.de/bbs/user/112024.xlsm
Problem ist hier jetzt auch das gleiche - wenn die Datei über das Datensicherungsmakro beendet wird erscheint die "wollen Sie wirklich speichern" Meldung.
Wird die Datei "normal" beendet, werden Änderungen gespeichert und die Datei ohne meckern beenet.
Anzeige
AW: Ereignismakros "kollidieren"
08.03.2017 12:02:34
onur
1)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.Caption = Worksheets("Einstellungen").Range("B2").Value & " offene Lieferungen   _
/  " & Worksheets("Einstellungen").Range("B4").Value & " offene Kundenbestellungen"
End Sub

musst du unbedingt "Filtern", denn das wird bei JEDER änderung aufgerufen und ändert bei JEDER Änderung
den titel.Du musst schon festlegen, bei welchen änderungen (welche zellen).
sowas kann zu endlosschleifen führen.
2) DAS WICHTIGSTE
With ThisWorkbook.Worksheets("Einstellungen")
.Range("A1") = Year(Date)
If .Range("E4") = True Then ActiveWorkbook.Save
If .Range("G7") = True Then Call deldatensicherung
End With

.Range("A1")=Year(Date) muss hier weg und in Workbook_Open hinein, denn es löst ein Workbook_Change-Ereignis aus, wodurch die datei nochmal gespeichert wird, und schon kommt die Abfrage (weil "geändert")
3)
Private Sub Workbook_Deactivate()
If Worksheets("Einstellungen").Range("E10") = False Then Application.DisplayFormulaBar = True
Application.Caption = ""
End Sub

Das kannst du auch am Ende von Workbook_BeforeClose hineinschreiben, da Deactivate sowieso von BeforeClose ausgelöst wird.
Anzeige
AW: Ereignismakros "kollidieren"
08.03.2017 17:00:58
Florian
Möpmöp
Danke für die Kritik :)
Zu 1. damit meinst du, dass ich hier einbauen soll, dass geprüft wird ob sich auf den Blättern in der Range A1:B10 was ändert?
Für mich war SheetChange, das Ereignis welches auftritt, wenn ich in meiner Excel Datei ein anderes Blatt aufrufe, nicht wenn ich auf einem Blatt etwas ändere :)
2.
Jetzt habe ich verstanden, was du mir vor ein paar Threads erklären wolltest :)
Das Problem ist jedoch bereits behoben - das Datum wird am Ende des Jahreswechselmakros geschrieben.
Ist ja eigentlich eh viel sinnvoller (weil es ändert sich ja eh nur einmal pro Jahr)
3.
Aber: Workbook Deactivate greift doch auch, wenn ich in eine andere geöffente Excel Datei wechsel?
Ich wollte auf diese Art die "FormularBar" nur für meine Datei deaktiveren, nicht wie sonst global
Anzeige
AW: Ereignismakros "kollidieren"
08.03.2017 17:24:03
onur
Hi,
Keine kritik, nur Tipps.
Mit Worksheets_change hast du recht.
Wenn du Datensicherung startest, passiert das hier:
Datei wird gespeichert
Dadurch sprung zu WorkBeforeClose
DAS löst WorkbookSheetChange aus, weil du ein Sheet namentlich ansprichst und ändert Blattnamen
Gruß
Onur
AW: Ereignismakros "kollidieren"
08.03.2017 12:21:07
onur
Wie schon einmal gesagt,wenn E4=true, wird durch datensicherung 2x gespeichert, einmal durch die datensicherung selbst und dann durch BeforeClose.
AW: Ereignismakros "kollidieren"
07.03.2017 17:14:42
Florian
Ich habe den Übeltäter gefunden.
Jedoch verstehe ich nicht, warum diese Problem auftritt.
Hier nochmal mein BeforeClose:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With ThisWorkbook.Worksheets("Einstellungen")
'''''''''''        .Range("A1") = Year(Date)
If .Range("E4") = True Then ActiveWorkbook.Save
If .Range("G7") = True Then Call DelDatensicherung
End With
End Sub

Ich schreibe in A1 das Datum.
Wenn ich diese Zeile auskommentiere läuft es einwandfrei.
Datei wird gespeichert und geschlossen ohne gemecker.
Aber ich brauche diese Zeile ja, damit mein JahreswechselMakro läuft.
Beim Start wird geprüft ob das Jahr des aktuellen Datums um 1 größer ist, als das gespeicherte Datum.
AW: Ereignismakros "kollidieren"
07.03.2017 17:32:21
onur
Diese Zeile führt zu einer Änderung deines Workbooks, und es kommt, wie bei jeder änderung, die meldung "wollen sie ..... speichern?"
Dies kannst du, wie gesagt abschalten mit (sowohl in Workbook_BeforeClose als auch in Datensicherung.
Application.DisplayAlerts = false
aber direkt nach dem speichern wieder zurückstellen lassen.
denk dran, wenn G7=true und Datensicherung gestartet wird, wird trotzdem 2x gespeichert dank Workbook_BeforeClose.
Das workbook.Close am ende der Datensicherung muss auf jeden fall weg.
AW: Ereignismakros "kollidieren"
07.03.2017 16:54:59
onur
Abgesehen davon:
sollte in E4 nicht immer true stehen, weil sonst kein speichern beim verlassen?
Wenn da true drin steht UND in G7 auch, wird 2x gespeichert.
wenn in E4 = false und in G7 auch, dann wird überhaupt nicht gespeichert.
AW: Ereignismakros "kollidieren"
07.03.2017 17:48:06
ChrisL
Hi Florian
Ich hätte da mal eine Theorie zur besagten Zeile, die das Problem auslöst.
.Range("A1") = Year(Date)
Ohne die Zeile wurde die Datei evtl. gar nicht verändert, Excel merkt das und führt ein Speichern-Light aus (evtl. wird letztes Bearbeitungsdatum angepasst, aber kein eigentliches Speichern). Dadurch viel schneller und es kommt nicht zum Konflikt.
Und normalerweise würde dagegen eine Zeitverzögerung helfen, aber du hast ja schon erklärt warum es so nicht geht. Darum folgende Ideen für Umgehungslösung:
Warum die Zeile nicht ins Open-Ereignis verschieben und gleich schon beim Öffnen das Datum setzen und speichern. Das Speichern erzwingst du im Before-Close sowieso noch einmal.
Oder eine Krücke könnte sein, die gleiche Datei nochmals im SafeMode/Schreibgeschützt zu starten, dort ein Makro auslösen und die Ursprungsdatei schliessen.
cu
Chris
AW: Ereignismakros "kollidieren"
07.03.2017 17:58:34
Florian
Ja, das war eben (ich glaube nach deinem Post) auch schon meeine Idee.
Ich lösch die Zeile aus dem before close (dann funktioniert mein speichern ja sauber)
und schreibe das Datum dann nicht beim Öffnen - was natürlich auch gehen würde - weils ja ein Jahr lang jedes mal das gleiche ist), sondern im Makro welches läuft, wenn es einen Jahreswechsel gab.
AW: Ereignismakros "kollidieren"
07.03.2017 18:08:40
ChrisL
Ja stimmt natürlich. Das Datum muss nur einmal im Jahr geschrieben werden.
Aber ist es denn so, dass sonst gar keine Dateiveränderungen zum Speichern vorliegen, weil du vielleicht laufend speicherst (Userform und so...)?

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige