Betätigung eines Makrobuttons während man noch Zel

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Betätigung eines Makrobuttons während man noch Zel
von: Peter Trawinski
Geschrieben am: 26.09.2015 15:20:56

Hallo Leute,
habe dies bereits in zwei anderen Foren gepostet aber leider keine Antworten erhalten ...
Ich habe da diese Excel xlsm Arbeitsmappe, die mit mehreren Makros versehen ist.
Unter anderem frage ich bei einem Sheet 'X' ab, ob es gerade verändert wurde:

Private Sub Worksheet_Change(ByVal Target As Range)
...

Auf diesem Sheet 'X' wiederum gibt es einen Formularsteuerelementebutton 'Exit'.
Wenn gedrückt und etwas auf der Seite verändert worden ist (ich setze ein internes Flag bei jeder erkannten Änderung), frage ich nach, ob die Änderungen gespeichert werden sollen, speichere dementsprechend ggf., lösche die Eingabefelder wieder, springe auf eine andere Seite und verstecke dieses Sheet 'X' (wieder) (xlSheetVeryHidden).
Klappt soweit so gut.
Mein Problem beginnt dann, wenn jemand gerade etwas in eine Zelle auf Sheet 'X' schreibt und - ohne eine andere Zelle anzuklicken - quasi live aus dem Editiermodus in dem er noch ist auf den Exit-Button klickt.
1. wird >jetzt< die Worksheet_Change - Prozedur noch >nicht< durchlaufen - die Änderungen also in der Exitprozedur nicht bemerkt (und damit mein internes Flag zur Abfrage beim Verlassen nicht gesetzt) und dadurch ggf. nicht gespeichert und - schlimmer noch -
2. >nach< vollständiger Abarbeitung des Exit-Codes dieses Change-Ereignis aber dann ausgelöst.
Da die Seite jetzt versteckt ist (und alle Felder dort von mir bei Exit gelöscht wurden) kommt es zu einer Fehlermeldung, weil mein Worksheet_Change - Code nichts mehr findet (alle Felder leer).
Meine Fragen sind:
- Kann man irgendwie in VBA erkennen, dass gerade eine Zelle bearbeitet wird?
- Kann man per VBA diesen Modus ggf. verlassen (und damit auch das Change-Ereignis gleich auslösen)?
- Wenn nicht, was sonst könnte ich tun?
Ist ein seltsames Problem. Kommt selten vor, da die Bediener meistens vor dem Verlassen woanders hinklicken..
Aber wenn, könnte ich zwar den Fehler unterdrücken, die Eingabe in dieser Zelle wäre aber verloren gegangen.
Weiß jemand Rat?
Eine Beispieldatei findet ihr hier: https://www.herber.de/bbs/user/100407.xlsm

Bild

Betrifft: ActiveX
von: RPP63
Geschrieben am: 26.09.2015 16:04:51
Hi!
Nimm statt einem FormSteuerelement einen ActiveX-Button und weise ihm folgenden Code zu:

Private Sub CommandButton1_Click()
Call btnExitForm_Click
End Sub
Durch Anklicken wird der Editiermodus zwangsweise beendet.
Gruß Ralf

Bild

Betrifft: AW: ActiveX
von: Peter Trawinski
Geschrieben am: 26.09.2015 17:58:56
Hallo Ralf,
wow! Ist das so?
Das erklärt auch, warum ich das Auftreten dieses Problems vorher nie bemerkt hatte! Ich hatte früher NUR ActiveX-Elemente verwendet - u. a. weil die viel vielfältiger zu formatieren sind.
BIS im Dezember Microsoft diese unsäglichen ActiveX Security-Updates verteilt hatte.
Ich konnte dieses Workbook nicht mehr zum Laufen bringen, bis ich alle Elemente in den Sheets durch Formularelemente ersetzt hatte UND alle Verknüpfungen von Feldern in Userforms mit Zellen in Sheets entfernt hatte. Ein major Aufwand!!
Jetzt bin ich in einer Zwickmühle. Vielleicht funktioniert ja meine Mappe noch, wenn ich wieder (nur) dieses eine Element in ActiveX ausführe - wohl ist mir dabei aber nicht!
Office-Profis unserer Firma rieten mir vehement ab, jemals wieder ActiveX-Elemente zu verwenden! MS unterstütze das nicht wirklich und richtig ...
Aber ich werde mir das zumindest mal ansehen!
Danke für den Tipp,
Peter

Bild

Betrifft: AW: ActiveX
von: Daniel
Geschrieben am: 26.09.2015 18:45:24
HI
wenn du beim Formularsteuerelement bleiben willst, dann könntest du folgenden Workaround verwenden, um festzustellen, ob der Anwender eine Änderung gemacht hat oder nicht:
1. setze die Eigenschaft: ThisWorkbook.Saved = True bevor der Anwender im Feld die Eingaben machen kann.
2. prüfe im Makro des Buttons dann, ob diese Eigenschaft immer noch den Wert WAHR oder wieder FALSCH hat.
die .Saved-Eigenschaft ist dafür verantwortlich, ob beim Schliessen der Datei die automatische Rückfrage zum Speichern erfolgt.
das .Saved schon auf False gesetzt sobald er Anwender in die Zelle zum Bearbeiten klickt und somit kannst du diese Eigenschaft verwenden.
Gruss Daniel

Bild

Betrifft: AW: ActiveX
von: Peter Trawinski
Geschrieben am: 27.09.2015 10:58:11
Hey Daniel,
du bist echt kreativ - DAS hätte ich nicht erwartet / versucht!
Klingt für mich eigentlich auch unlogisch, dass, weil die Bearbeitung einer Zelle noch nicht 'abgeschickt' ist zwar das Change-Event noch nicht ausgelöst wird ABER die ThisWorkbook.Saved-Eigenschaft trotzdem bereits auf FALSE gesetzt wird - ABER SO IST ES!
Genau was ich suche - dies löst mein Problem!!
Muchas Gracias!

Bild

Betrifft: AW: ActiveX
von: Peter Trawinski
Geschrieben am: 27.09.2015 11:10:20
Hey Daniel,
OK kleine Korrektur - löst 90%.
Leider setzt Excel das ThisWorkbook.Saved Flag auch, wenn man nur mit F2 in den Editiermodus wechselt - also auch ohne etwas geändert zu haben.
Trotzdem - ich kann damit leben, dass das Programm nun in diesen seltenen Fällen (überflüssiger Weise) fragt, ob die Daten zurückgeschrieben werden sollen...
Gruss, Peter

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Betätigung eines Makrobuttons während man noch Zel"