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

VBA-Überprüfung, ob gespeichert werden muß

VBA-Überprüfung, ob gespeichert werden muß
23.02.2007 21:07:25
Uwe
Shalom!
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

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-Überprüfung, ob gespeichert werden muß
23.02.2007 21:46:00
Josef
Hallo Uwe,
ohne jetzt alles verstanden zu haben.
Du kannst du Speicherstatus abfragen und auch die Ereignisüberwachung aus/ein-schalten.
Dann ersparst du dir die Abfrage, in welchem Blatt die Änderungen vorgenommen werden.
Gleichzeitig kannst du deinen Hinweis setzen.
Sub nn()
    Dim IsSaved As Boolean
    
    IsSaved = ThisWorkbook.Saved
    'Speicherstatus abfragen
    
    Application.EnableEvents = False
    'Erreignisüberwachung ausschalten
    
    '
    'dein Code zum erstellen der Tabelle
    '
    
    
    With Sheets("Übersicht").Range("A6")
        .Interior.ColorIndex = IIf(IsSaved, 4, 3)
        .Font.ColorIndex = IIf(IsSaved, xlAutomatic, 6)
        .Value = IIf(IsSaved, "Stand gespeichert", "Änderungen noch nicht gespeichert")
    End With
    'Hinweis zum Speicherstatus
    
    Application.EnableEvents = True
    'Ereignisüberwachung einschalten
    
    ThisWorkbook.Saved = IsSaved
    'Speicherstatus setzen
    
End Sub

Gruß Sepp
Anzeige
AW: VBA-Überprüfung, ob gespeichert werden muß
24.02.2007 03:56:00
Uwe
Oh!
Jooooo,... sieht doch in sich ganz stimmig aus!
Werde ich morgen gleich mal ausprobieren!
Herzlichsten Dank!

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige