VBA-Überprüfung, ob gespeichert werden muß
23.02.2007 21:07:25
Uwe
Eine etwas komplexere Excel-Mappe habe ich via VBA so eingerichtet, daß sie einerseits nur über eine bestimmte eigens dafür vorgesehene Schaltfläche beendet werden kann.
Eine weitere Schaltfläche zum Speichern erstellt bei jedem Speichervorgang auch ein Backup mit Timestamp in einem anderen Ordner.
Beim Klicken auf die Beenden-Schaltfläche erscheint noch eine Ja/Nein-DialogBox, die den Benutzer fragt, ob er auch gespeichert hat und wirklich beenden will.
Nun möchte ich auf der "Übersichtsseite", auf der sich auch die Schaltflächen zum Speichern und Beenden befinden, in einer Zelle o.ä. den "Gespeichert"-Status der Mappe anzeigen... wenn also Änderungen an der Mappe in Bezug auf den gespeicherten Stand vorliegen (sprich: wenn Änderungen vorgenommen wurden), soll z.B. eine Zelle leuchtend rot darauf hinweisen "Änderungen noch nicht gespeichert" oder andernfalls in beruhigendem Grün die Meldung "Stand gespeichert" erscheinen.
Meine Frage nun, gibt es irgendwo eine Eigenschaft, auf die ich via VBA direkt zugreifen kann, welche mir sagt soetwas wie "saved" oder "unsaved" zurückgibt?
Oder reicht es, wenn ich Workbook_SheetChange verwende?
Deckt das alle Änderungen in allen Tabellenblättern und das Erstellen neuer Blätter ab?
Und im 2. Schritt meines Vorhabens wird es dann etwas komplzierter...
Die oben bereits angesprochene "Übersichtsseite" (also die 1. Tabelle der Mappe) zeigt neben den o.a. Schaltflächen eine zeilenweise Auflistung der restlichen existierenden Tabellenblätter (Spalte A) mit ein paar Werten ebendieser Blätter in den Spalten B bis...
Diese Übersicht kann mit entsprechenden Schaltflächen nach unterschiedlichen Kriterien sortiert werden.
Jetzt möchte ich aber, daß ein solcher Sortier-Vorgang, der ja eine Änderung von Zellinhalten bewirkt, eben nicht als Kriterium für die oben angegebene Speichern-Aufforderung herangezogen wird.
Anders ausgedrückt: Die Aufforderung zum Speichern soll selektiv nur dann erscheinen, wenn Änderungen an einer der anderen Tabellen vorgenommen wurden.
Das könnte ich mir zunächst ganz gut vorstellen, indem ich in Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
(sofern jemand hier der Ansicht ist, daß ich denn dieses für meine Zwecke nutzen kann)
eine Abfrage mache, welches Sheet geändert wurde und eben das Übersichts-Sheet ausschließe...
Ja, aber...
Jetzt stoße ich nur noch auf das Problem, daß ich auf dem Übersichtsblatt eben nur bestimmte Spalten ab einer bestimmten Zeile nicht auf Veränderung überwachen will (nämlich sie Liste der Tabellenblätter)...
Vielleicht ist es Zeit, mal einen Screenshot zu zeigen, ich glaube es wird jetzt langsam schwierig...
Bei jedem Ansichts-Wechsel von einem Tabellenblatt zur Übersichts-Tabelle (was in einem normalen Arbeitsgang häufig vorkommt), wird diese (ab Zeile 8 abwärts) zellenweise neu aufgebaut/generiert... über Worksheet_Activate() wird das ausgelöst. Das dauert zwar nur etwa 1 Sekunde, aber ich stelle mir gerade vor, daß wenn ich mit Workbook_SheetChange und einer IF-Abfrage die Änderungsüberprüfung des Übersichts-Blattes ausschließe, Excel ja theoretisch (und praktisch wahrscheinlich auch), nach jeder geänderten Zelle (während des Generierens der Seite) diese IF-Überprüfung ausführt... im Screenshot-Beispiel sind das 30 Zeilen á 11 Spalten = 330 Zellen, also während des Generierens 330 Schleifen nach dem Schema
IF (Name des geänderten Sheets = "Übersichtsseite") dann (ignoriere Änderung)
Das gleiche jedes Mal, wenn ich auf einen der Sortieren-Buttons klicke.
Und aus meiner Aufbau-Zeit von ursprünglich 1 Sekunde wird dann wahrscheinlich ´ne kleine Kaffeepause.
Unterm Strich also irgendwie unbefriedigend.
Andererseits könnte ich mir vorstellen, die Änderungsüberwachung für den Zeitraum des Generierens nach Worksheet_Activate() zu deaktivieren und wenn fertig wieder zu aktivieren... ebenso zu Beginn und nach einem Sortieren-Klick.
Aber wie deaktiviere ich temporär eine Workbook_SheetChange, ohne das wieder über eine Variable abzufragen, die dann 330 mal überprüft wird?
Määäähhh,...
Wenn ich meine Ausführungen so lese und mir dabei immer bewusster werde, wie komplizert man sich das Leben machen kann... und dabei eine Funktionalität herbeiführen will, die sooo wahnsinnig toll nun auch nicht unbedingt ist... da hab ich schon fast keine Böcke mehr, das umzusetzen.
Aber das Vorhaben jetzt gänzlich in die Tonne zu treten widerstrebt meinem sportlichen Ergeiz.
Zumindest würde mich interessieren, ob und wie mein Hirngespinne effektiv und performant umzusetzen ist.
Falls sich tatsächlich irgendjemand nun diesen Sermon hier bis zum Ende durchgelesen hat und dabei den Faden desselben immernoch nicht vollends verloren hat, bin ich für einen Stubser mit der Nase auf einen Lösungsansatz, auf den ich möglicherweise noch nicht gekommen bin, dankbar und erfreut.
Schönes Wochenende alle miteinander,
Uwe