Gelöst : Userform : ESC abschalten

  • Excel

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von keksi1970.

    Gelöst : Userform : ESC abschalten

    hallo zusammen,

    nach ESC suchen bringt nicht viel im Forum ( ich habe es getan und lauter Sachen wie gESChrieben usw. gefunden ;) ),

    daher die Frage, wie kann ich beim Aufrufen einer Userform verhindern, dass diese mit ESC wieder geschlossen wird, sondern ausschliesslich über den enthalteten Beenden-Button ?



    Danke für die Hilfe im voraus



    LG

    Andreas

    Edit by der_Kurt:
    Thema betrifft offensichtlich VBA in Excel. Für VBA gibt es hier ein eigenes Unterforum. Bitte darauf achten.
    * Topic verschoben *

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „keksi1970“ ()

    Ein kleiner simpler Trick ist es im FormClosing-Ereignis eine private Varibale zu prüfen, z.B. m_blnCloseAllowed.

    Solange die False ist wird das Event abgebrochen. Nur durch klicken auf den dafür vorgesehenen Button wird die Variable auf True gesetzt und dann die Prüfung sauber durchlaufen.

    Ob es dafür in NET eine elegantere Methode gibt weiss ich nicht.

    Gruß

    Rainer

    keksi1970 schrieb:

    OK,

    ich bin Anfänger :)

    Wenn du also so nett wärst mir ein Makro dementsprechend zu erklären . . . :)


    Öhem ... Makro? Nix da ... selber proggen. *g*

    Aber gut, hier das Grobbrinzip:

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Private m_blnClosingAllowed As Boolean
    3. Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    4. '// Cancel auf True setzen wenn Variable m_blnClosingAllowed False ist
    5. e.Cancel = (Not m_blnClosingAllowed)
    6. End Sub
    7. Private Sub ButtonClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonClose.Click
    8. '// Schliessen erlauben
    9. m_blnClosingAllowed = True
    10. '// nun Form schliessen
    11. Me.Close()
    12. End Sub
    13. End Class


    Das ist das Prinzip des Vorschlages. ;)

    Schreibfehler können vorkommen, da ich hier den Code aus dem Bauch raus direkt hier geschrieben habe und daher keine Compiler-Prüfung was korrigiert hat. ^^

    Gruß

    Rainer
    hmm,

    sieht so aus, als wäre ich im falschen Forum.

    Dies sollte eigentlich in VBA für Excel 2010

    Ich habe mir die Anleitung zur Klassenerstellung durchgelesen, konnte diese aber nicht umsetzen unter Excel ( Warum bloss ? :D )

    Durch die ganzen Events bin ich auch noch nicht ganz durchgestiegen. Wenn diese in Klartext vor mir liegen ( but_Ende_Click() kann ich mir etwas drunter vorstellen, also wenn ich den Button Ende klicke, wird das Makro ausgeführt. Das KeyPress in einer Userform nur auf das Element mit aktivem Focus funktioniert habe ich auch begriffen. Standards ( zellen Arbeitsblätter etc) ist auch kein Problem, ebensowenig wie Datenbankverbindungen ( funktioniert, ist aber Luft nach oben )



    Jetzt habe ich dir meinen Kenntnisstand mitgeteilt :)

    ich kann keine Klasse erstellen, die erste Fehlermeldung kommt bei Public class Test1 ( ja, ich schreibe nicht ab ) in einem Klassenmodul.

    Das mit dem FormclosingEvent ist auch klar, entweder 1 ( nicht beenden) oder 0



    Tja, das war es auch schon :)



    Wenn ich jetzt wüsste, wie ich eine eigene Klasse erstelle ( unter Excel 2010 VBA kann ich mi9t Klick auf das Projekt nur Module erstellen, bzw Einfügen ) würde mir das schon helfen, unter dem Gesichtspunkt, dass die Datei auch weitergegeben werden muss.



    :) Andreas

    keksi1970 schrieb:

    die erste Fehlermeldung kommt bei Public class Test1
    In Excel wird eine Klasse definiert, indem du in der IDE einen rechten Mausklick auf die Arbeitsmappe machst und dann "Einfügen ... Klassenmodul" klickst.

    Jedes Klasse wird in einem eigenen Modul erzeugt, weshalb die Class-Anweisung nicht notwendig ist (und deshalb auch nicht funktioniert).
    Lass die Anweisung einfach weg.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Sekunde mal ....
    Wenn du wie du schreibst Anfänger bist, warum setzt du dich dann nicht hin und befasst dich erst mal mit den Grundlagen ??

    @ keksi

    In Excel werden Forms bereits automatisch in einem Klassen-Container verwaltet. D.h. da wo Du den Code für eine Excel-From reinschreibst das ist bereits ein Klassenmodul.

    Wie petaod schon richtig sagte, lass einfach die Definition "Public Class Form1" und natürlich den Abschluß der Definition "End Class" weg.

    Das Problem ist nur das mir kein Event in einer Excel-Form bekannt ist das bei Form-Close ausgeführt wird und das über eine Cancel-Variable abgebrochen werden kann. Aber liegt vllt auch daran das ich mich mit Excel nicht so absolut pralle auskenne. ;)

    Gruß

    Rainer
    @raist : ich werde es einfach ausprobieren, ich glaube auch nicht, dass es das gibt, google hat hier nichts zu gebracht 8 da turne ich schon seit Tagen rum )

    @Patrick : weil es evtl. Grundlagen gibt, die verschiedener Natur sind. Ich brauche nur eine Taste ausstellen, und muss mich danach nur noch mit Datenbanksystemen befassen. Welche Grundlagen ( und damit grosser Zeitaufwand ) sind nun relevant, die Sicherheit und Pflege und Abfrage und Aufbereitung der Datenbank, oder diese eine Taste ? Zur Not sperre ich die komplette Tastatur ( ja das geht ) und gebe einzelne Buchstaben frei, wäre aber unschön, ebenso die Meldung : Du hast beim letzten Mal die ESC-Taste gedrückt, wende dich an den Vorgesetzten um wieder arbeiten zu dürfen ( das hab ich auch hingekriegt.)

    Zu einem späteren Zeitpunkt sind diese Grundlagen wichtig, aber zur Zeit liegt der Schwerpunkt ganz woanders.

    raist10 schrieb:

    Event in einer Excel-Form bekannt ist das bei Form-Close ausgeführt wird

    support.microsoft.com/kb/829070
    Abschnitt "Verwendung von UserForm-Ereignissen" / "Auffangen von UserForm-Ereignissen".
    Interessant ist das QueryClose-Event.

    Im Prinzp kannst du in Excel jedes Event abfangen, das irgendwo gefeuert wird, selbst wenn es keine Bult-In-Eventprozedur dafür gibt.
    Auf die Art habe ich schon alles mögliche realisiert, z.B. Tooltip-Labels für CommandButtons.
    Auch die Abhandlung, wie man mit einem Eventhandler mehrere Events abfängt, ist eine Erwähnung wert:
    de.wikibooks.org/wiki/VBA_in_E…Cr_mehrere_CommandButtons
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    raist10 schrieb:

    Event in einer Excel-Form bekannt ist das bei Form-Close ausgeführt wird

    support.microsoft.com/kb/829070
    Abschnitt "Verwendung von UserForm-Ereignissen" / "Auffangen von UserForm-Ereignissen".
    Interessant ist das QueryClose-Event.


    Ehrlich ... das QueryClose das Ereignis welches ist, wäre ich wohl nie von alleine drauf gekommen ... was vermutlich daran liegt das ich Query mit Abfrage gleich setze aber nicht mit Form_Unload o.ä.. ^^

    Gruß

    Rainer
    Hallo zusammen,

    leider habe ich es nicht hingekriegt

    Mein 1. Makro für die Beenden Taste :

    Visual Basic-Quellcode

    1. Public sBool As Boolean
    2. Private Sub but_Ende_Click()
    3. sBool = 1
    4. Unload Me
    5. End Sub


    das 2. für die Überprüfung vorm Schliessen :



    Visual Basic-Quellcode

    1. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    2. If sBool = 0 Then
    3. Cancel = 1
    4. End If
    5. End Sub


    Das Kreuz zum Schliessen habe ich zu Testzwecken rausgenommen ( If CloseMode = 0 then cancel = 1 )

    Leider verhält sich Escape wie meine Beenden Taste und ignoriert die Abfrage nach sBool



    LG

    Andreas
    Ich habe es grad versucht nachzubauen. Meine UserForm reagiert gar nicht auf ESC. Bleibt also einfach sichtbar.

    Versuch doch mal testweise folgendes:

    Visual Basic-Quellcode

    1. Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    2. If KeyAscii = 27 Then
    3. If MsgBox("Wollen Sie wirklich beenden?", vbYesNo + vbQuestion) = vbNo Then
    4. KeyAscii = 0
    5. End If
    6. End If
    7. End Sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    keksi1970 schrieb:



    Das Kreuz zum Schliessen habe ich zu Testzwecken rausgenommen ( If CloseMode = 0 then cancel = 1 )

    Leider verhält sich Escape wie meine Beenden Taste und ignoriert die Abfrage nach sBool


    Hat das Schliessen per ESC auch einen eigenen CloseMode, bzw. Unterscheiden sich die CloseModes von Schliessen per ESC zu schliessen durch Unload Me?

    Gruß

    Rainer
    Lösung :

    Die Userform wird nicht durch ESC geschlossen. DIes muss man programmieren.

    Leider habe ich dies unbewusst getan ( Cancel = true ), um das Schliessen-Kreuz auszuschalten.

    Durch die Programmierung cancel = true wird die ESC direkt auf den Beenden-Button umgeleitet und die dort hinterlegten Makros ausgeführt.

    Konnte ich nicht wissen, da ich die ESC-Taste erst nach Abschalten des Kreuzes getestet habe :D



    Sorry für die Umstände