Office: UserForm Textbox - Cursor rückt immer einen TabSprung ein

Helfe beim Thema UserForm Textbox - Cursor rückt immer einen TabSprung ein in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, in einer UserForm habe ich die TextBox2_Bemerkung. Innerhalb der UF springe ich mit dem TabKey von Box zu Box, schließlich auf einen... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von fette Elfe, 29. Oktober 2010.

  1. fette Elfe Erfahrener User

    UserForm Textbox - Cursor rückt immer einen TabSprung ein


    Hallo,

    in einer UserForm habe ich die TextBox2_Bemerkung.
    Innerhalb der UF springe ich mit dem TabKey von Box zu Box, schließlich auf einen CommandButton, und von dem wieder in die erste Box.

    Allerdings, jedesmal wenn ich mit dem TabKey in die TextBox2_Bemerkung springe, sitzt der Cursor innerhalb der Box nicht "auf Anfang" (oben links in der Ecke), sonder rückt einen TabSprung nach links ein.
    Sprich, beim ersten Aufruf ist es ein TabSprung, durchlaufe ich die Boxen und komme wieder in die TextBox2_Bemerkung, so rückt der Cursor jedesmal einen weiteren TabSprung ein.

    Die Navigation mit dem TabKey habe ich schon mehrfach benutzt, aber noch nie dieses (nervige) Phänomen gehabt.

    Am Code kann es meiner Meinung nach nicht liegen (s.u.), und bei den Einstellungen habe ich keine Idee was ich ändern sollte. (Screenshot s.u.)


    Die TextBox2_Bemerkungen habe ich so eingestellt, dass ich mit der Enter-Taste einen Zeilenumbruch einfügen kann (das benötige ich so auch).


    Wenn jemand weiß ob (und wie) ich dieses Einrücken weg bekomme, wäre ich für Tipps sehr dankbar.


    Code:
    Private Sub TextBox2_Bemerkung_Change()
        
        'TextBox auf 4 Zeilen begrenzen
            If TextBox2_Bemerkung.LineCount > 4 Then
                MsgBox "Nur 4 Zeilen in der Textbox erlaubt !", , "Zeilenanzahl überschritten"
                Exit Sub
            End If
        
    End Sub
    
    Private Sub TextBox2_Bemerkung_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        
        'mit TAB-Taste zur ComboBox2_WeDatum springen
        If KeyCode = 9 Then
            ComboBox2_WeDatum.SetFocus
            Call ComboBox2_WeDatum_List
        End If
        
    End Sub
     
    fette Elfe, 29. Oktober 2010
    #1
  2. Exl121150 Erfahrener User
    Hallo Achim,

    Code:
    Private Sub TextBox2_Bemerkung_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 
        
        'mit TAB-Taste zur ComboBox2_WeDatum springen 
        If KeyCode = 9 Then 
            KeyCode = 0
            ComboBox2_WeDatum.SetFocus   '???
            Call ComboBox2_WeDatum_List    '???
        End If 
        
    End Sub
    Meiner Meinung nach müsstest Du im IF-Block die Variable KeyCode auf 0 setzen, denn sonst wird dieser Wert ans nächste Feld weitergereicht.
    KeyCode ist zwar mit ByVal deklariert, aber da hinter dem AS "MSForms.ReturnInteger" steht, bezieht sich das BYVAL nur auf den Zeiger auf das Objekt RETURNINTEGER in MSFORMS: es wird also kein Objekt-Zeiger an das aufrufende Programm zurückgegeben.
    Wenn der Wert des KeyCode-Objektes (und nicht bloß der Zeiger darauf) beim Betreten des nächsten Feldes ungültig sein soll (weil in der Bermerkungs-Textbox abgearbeitet), muss er auf 0 gesetzt werden (was quasi 'keiner Taste' entspricht).
    Der 2.Parameter "Shift" ist dagegen als ganz normale Variable deklariert und zwar auch als BYVAL: dort bewirkt das BYVAL (ebenso), dass in dieser Variablen an die KEYDOWN-Sub ein Wert übergeben wird, aber kein Wert über sie an das aufrufende Programm zurückgegeben wird (=Wert-Parameter im Gegensatz zu BYREF).

    Aber abgesehen von dieser Heimtücke der objektorient.Programmierung verstehe ich nicht ganz, warum Du in diesem Fall explizit die SETFOCUS-Methode aufs nächste bearbeitbare Feld verwendest. Das Ganze kann man einfach auch über die TABINDEX-Eigenschaft steuern. Man nummeriert die mit TAB besuchbaren Steuerelemente (einschließlich der LABELS) durch, beginnend bei 0: das Label "Artikelnummer" bekommt TabIndex=0, die Combo Artikelnummer erhält TabIndex=1, das Label "Bemerkung" TabIndex=2, das Textfeld Bemerkung TabIndex=3, das Label "WE Datum" TabIndex=4, die Combo WEDatum TabIndex=5 und der Button TabIndex=6. Diese Reihenfolge bewirkt, dass auch die Maus weiß, welcher Label zu welchem bearbeitbaren (=mit Tastaturfokus) Steuerelement gehört. Ferner kann man so in den Labels jeweils ein Zeichen festlegen, das als Kurzwahl für das dazugehörige bearbeitbare Steuerelement gilt (Alt+Zeichen).
     
    Exl121150, 29. Oktober 2010
    #2
  3. fette Elfe Erfahrener User
    Lieben Dank Exl121150.

    Dein Tipp den KeyCode auf 0 zu setzen hat voll ins schwarze getroffen.
    Das hätte ich im Leben nie selber gefunden.


    Deine Erklärung dazu, wieso und warum, ist echt klasse. Genau soetwas vermisse ich oft, denn nur wenn man versteht kann man auch lernen...
    Auch wenn ich in diesem Falle im Moment fast nur Bahnhof verstehe.
    *lach*
    Das muss ich mir am WE mal ganz in Ruhe durch die Birne ziehen.


    Zu Deinen Fragen:

    - mit "Call ComboBox2_WeDatum_List" rufe ich das Sub auf, in dem die Range für die Liste bestimmt, der Listindex gesetzt und das DropDown auch direkt aufgeklappt wird.

    - SetFocus benutze ich, weil sonst das drücken der Tab-Taste rein garnichts bewirkt, obwohl ich im UserForm.Activate-Ereignis die TabStopps der Steuerelemente festlege.
    Mir scheint aber, ich kann hier gerade etwas lernen, und obendrein scheint mir auch das ich mit den TabStopps noch nicht optimal arbeite (sonst würdest Du ja wohl nicht fragen).


    Was ich aber nicht verstehe, warum soll ich den Labels auch TabStopps zuweisen? Die sollen doch garnicht klickbar sein und haben außer Beschriftung auch keinen Zweck.

    Und was meinst Du mit: "Diese Reihenfolge bewirkt, dass auch die Maus weiß, welcher Label zu welchem bearbeitbaren (=mit Tastaturfokus) Steuerelement gehört."
    Welchen Unterschied macht dies denn?

    Im Moment kann ich mit der TabTaste durch die Elemente wandern, oder ich klicke mit der Maus wohin ich möchte.
    In beiden Fällen werden die Subs aufgerufen, so wie ich es möchte.
     
    fette Elfe, 29. Oktober 2010
    #3
  4. Exl121150 Erfahrener User

    UserForm Textbox - Cursor rückt immer einen TabSprung ein

    Hallo Achim,

    Genau das hatte ich mir auch gedacht aufgrund der Bezeichnung der Sub. - Nur sollte man das so nicht machen in der objektorient. Programmierung.

    1) Da gibt es eigentlich eine genaue Zuständigkeit dafür, welches Objekt was machen soll, und davon sollte man nur in Ausnahmefällen abweichen. Der Grundsatz ist ganz einfach: Jedes Objekt ist für sich selbst zuständig. Konkret angewandt: das Textfeld Textbox2_Bermerkung ist nicht zuständig für die Combo ComboBox2_WeDatum, sondern dafür ist sie allein für sich selbst zuständig (und zwar für alle Darstellungs- und Bearbeitungsvarianten).

    2) Zu diesem Zweck kann jedes Steuerelement und auch das Formular selbst eine Reihe von Ereignissen auslösen, die man mit einer Ereignisbehandlungsroutine im Codemodul der Formularklasse behandeln kann:
    2a) Jedes Steuerelement, das den Fokus haben kann, kennt 2 Ereignisse: Enter bzw. Exit (=Fokuserhalt bzw. Fokusverlust). Diese funktionieren, wenn man mit der TAB-Taste hinnavigiert bzw. davon wegnavigiert, aber auch mit der Maus: klickt man mit der Maus in ein solches Steuerelement, wird das Enter-Event ausgelöst, klickt man in weiterer Folge auf ein anderes Steuerelement, wird zuerst das Exit-Event des alten und dann das Enter-Event des neuen Steuerelementes ausgelöst.
    2b) In einer Combo wird das DropDownClick-Event ausgelöst, wenn sie aktiviert (=fokusiert) ist und entweder F4 gedrückt wird oder der DropDown-Pfeil angeklickt wird bzw. auch dann, wenn die DD-Liste ausdrücklich geschlossen wird.
    2c) Das alles kannst Du ganz einfach ausprobieren, wenn Du diese Event-Behandlungsroutinen in den Code einfügst zusammen mit einer MsgBox "Enter" bzw. MsgBox "Exit" etc.
    2d) Mit dem Enter-Event bei einer Combo kann man zB:
    - die Range für DD-Liste festlegen (falls diese dynamisch bestimmt werden muss)
    - die Wert-Anzeige in der Combo festlegen
    2e) Mit dem DropDownClick-Event kann man die Befüllung der DD-Liste steuern, falls dafür eine Spezialbefüllung nötig ist.
    2f) Mit dem Exit-Event kann man abschließende Arbeiten das Feld betreffend durchführen, zB. den Feldwert in eine Variable des Codemoduls speichern etc.
    Durch die TAB-Taste werden die Enter- bzw. Exit-Ereignisse der Steuerelemente ausgelöst. Mit den entsprechenden Behandlungsroutinen kann festgelegt werden, wenn da etwas Spezielles passieren soll.
    Für die Labels soll die Eigenschaft 'TabStop=False' gesetzt werden (bzw. bleiben), die Eigenschaft TabIndex soll jedoch eine Nummer erhalten, die um 1 kleiner ist als die TabIndex-Nummer des Steuerelements, zu dem es gehört. Dadurch weiß das Formular, welcher Label zu welchem fokusierbaren Steuerelement gehört. Ein LABEL hat auch die Eigenschaft Accelerator: dort kannst Du ein einzelnes Zeichen speichern. Ist dieses im Label-Text (=Caption) enthalten, wird es im Formular unterstrichen angezeigt. Die Tastenkombination Alt+Zeichen bewirkt einen Sprung im Formular zum dazugehörigen Steuerelement. (In den Formularen anderer Anwendungen zB. ACCESS kann man zusätzlich auch noch auf den Labeltext klicken und das dazugehörige Steuerelement wird fokusiert).

    Du solltest noch einen weiteren Button ins Formular aufnehmen: "Abbrechen". Bei diesem solltest Du die Eigenschaft "Cancel=True" einstellen. Die Click-Event-Behandlungsroutine bekommt als Code die Hide-Methode des Formulars (also "Me.Hide") zugewiesen.

    Beim Button-Steuerelement "Drucken" solltest Du die Eigenschaft "Default=True" einstellen.
    Du kannst ja in der Hilfe nachschauen, was "Default" bzw. "Cancel" bewirken.
     
    Exl121150, 30. Oktober 2010
    #4
  5. fette Elfe Erfahrener User
    Hallo Exl121150,

    nochmal ganz lieben Dank für Deine ausführliche Erklärung.
    Ich hoffe ich über-strapaziere Deine Geduld nicht *blinkerblinker*
    aber natürlich habe ich noch Fragen:


    ... manchmal ist man doch echt wie ein Kotelett > von beiden Seiten beklopft ...
    Genau so habe ich es vor knapp einem Jahr bei meinem ersten "großen" Projekt auch gemacht.
    Diesmal hab ich aber mit ActiveX-Steuerelementen auf dem Titelblatt angefangen (die haben ja etwas andere Ereignisse), beim Erstellen der UFs später dann das Ereignis "gotFocus" vermisst, und aufgrund Zeitdruck und meist später Uhrzeit den "schnellen" anderen Weg gewählt.
    Schön blöd... naja, wenigstens hab ich das gleich schnell umgebaut.
    Danke für den Zaunpfahl.


    Okay, habe mir das durchgelesen und, so denke ich, auch verstanden.
    Wenn ich nach allgemein gültigen regeln, vollständig und in "gutem" Stil programmieren möchte, ich die "Accelerator-Eigenschaft", den Klick auf das Label oder andere Anwendungen (wie Access) benötige, so sollte ich auch die Labels in die TabIndex-Nummerierung einbeziehen.
    Wenn ich aber auf all das auch mal verzichten kann, so ist das auch kein Problem, oder?
    Übersehe ich da etwas?
    (nicht das es viel Arbeit wäre die paar TabIndex-Nummern zu setzen...)


    Die Hilfe klappt auf meinem PC leider nicht (irgendwas bei der Installation schief gegangen, oder so), aber ich habe dies hier im Netz gefunden:



    Geht es bei dem "Abbrechen-Button" nur um die Möglichkeit der ESC-Taste?
    Oder macht es einen Unterschied ob ich das rote X der UF benutze oder eben jenen Button?
    ("sanftes" oder "hartes" terminieren, abarbeiten von Schritten (Variablen entwerten o.ä., die beim roten X nicht mehr abgearbeitet werden?)
     
    fette Elfe, 31. Oktober 2010
    #5
  6. Exl121150 Erfahrener User
    Hallo Achim,

    Wie Du siehst, wird jedem Objekt im Formular ein TabIndex-Wert zugewiesen. Wenn Du's nicht tust, so geschieht es automatisch - jedoch sind stets 2 Dinge zu beachten:
    1) Bei fokusierbaren Elementen wird durch diese Nummerierung die TAB-Reihenfolge bestimmt.
    2) Bei fokusierbaren Steuerelementen mit dazugehörigem LABEL muss die Nummerierungsreihenfolge eingehalten werden, wenn man mittels Alt+Zeichen die Accelerator-Steuerung über die Tastatur im Formular implementieren will.
    (Die verbesserte Label-Steuererung aus zB. Access, die es in Excel nicht gibt, habe ich nur beiläufig als weiteres Beispiel angeführt).

    Deine gefundenen Hilfeinformationen sind ok. Wenn Du keine Hilfe zur Verfügung hast, dann fehlt Dir im Programmalltag sicherlich etwas ganz Wesentliches - auch wenn manchmal die Microsoft-Hilfe zu wünschen übrig lässt.

    1) Es stimmt, wenn man auf die Schnelle das Formular bloß schließen will, dann genügt auch der X-Button in der Kopfzeile des Formulars.
    2) Will man jedoch noch etwas Zusätzliches beim abbrechenden Schließen des Formulars ausführen, dann benötigt man zwingend diesen Button.
    3) Man findet den Abbrechen-Button in den meisten Formularen (auch wenn ein X-Button vorhanden ist), weil es zum "guten Ton" beim Formularentwurf gehört - aber das kannst Du natürlich halten, wie Du willst, insbesondere bei Formularen, die nur für Dich bestimmt sind. Bei Formularen, die von anderen Leuten bedient werden (müssen), kann es schon vorkommen, dass sie nach diesem (zusätzlichen) Button fragen, wenn er nicht vorhanden ist.
     
    Exl121150, 31. Oktober 2010
    #6
  7. fette Elfe Erfahrener User
    Hallo Exl121150,

    Das erklärt mir so manches...
    Okay, werde ich zukünftig beachten.


    Auch wenn ich zwischenzeitlich mit Problemen zu kämpfen hatte, die Steuerelemente laufen inzwischen alle über die Events, und die Labels habe ich auch indiziert.
    (nur mal so am Rande als Rückmeldung)


    Auch wenn ich mich wiederhole:
    Ganz lieben Dank für deine Zeit, Deine Mühe, Deine Erklärungen.
    Du hast Mich damit einen großen Schritt weiter gebracht und ich habe so einiges gelernt/besser verstanden.

    Ich würde mich sehr freuen bei meiner nächsten frage wieder von Dir zu lesen.
    *breitgrinsundunschuldigausderwäscheguck*
     
    fette Elfe, 31. Oktober 2010
    #7
Thema:

UserForm Textbox - Cursor rückt immer einen TabSprung ein

Die Seite wird geladen...
  1. UserForm Textbox - Cursor rückt immer einen TabSprung ein - Similar Threads - UserForm Textbox Cursor

  2. Textboxen im Userform mit Textmarkeninnhalt füllen

    in Microsoft Word Hilfe
    Textboxen im Userform mit Textmarkeninnhalt füllen: Hallo, ich bearbeite zurzeit ein Word-Dokument mit 60 Textmarken. Die Textmarken fülle ich mit einem Userform. Die Bezeichnung der Textboxen und Textmarken ist gleich. Jetzt möchte ich den Spieß...
  3. Userform Textfeld füllen abhängig von Wert aus Combobox

    in Microsoft Excel Hilfe
    Userform Textfeld füllen abhängig von Wert aus Combobox: Hallo zusammen, weiter geht es mit Problemen. Ich Filter die Daten für die Combobox mit diesem Code Private Sub UserForm_Initialize() Dim tbl As ListObject Dim rng As Range Dim cell As Range Dim...
  4. TextBoxen in UserForm füllen

    in Microsoft Excel Hilfe
    TextBoxen in UserForm füllen: Erst einmal ein freundliches Hallo, da ich hier neu bin*:D* Jetzt zu meinem Problem. Aus einer Accesdatenbank werden Werte mit ID Nummer abgefragt und an einen Excelsheet Temp übergeben. Ich...
  5. Cursor in Textbox in Userform

    in Microsoft Excel Hilfe
    Cursor in Textbox in Userform: Hallo, ich habe eine Userform erstellt, die sofort bei Aufruf der Excel-Datei erscheint. In einer darin enthaltenen Textbox1 soll automatisch bei Auftauchen der Userform der Cursor vor sich hin...
  6. weitere Tabellendaten von Kunden in eine Userform mit Textboxen laden

    in Microsoft Excel Hilfe
    weitere Tabellendaten von Kunden in eine Userform mit Textboxen laden: Guten Morgen, zu so früher Stunde noch ein Anliegen, wo ich echt Hilfe brauche. Werde dann gleich auch meine Codes dazu mitsenden. Ich habe eine Datenmaske, wo ich Teilnehmer*innen und...
  7. Excel VBA Userform Textbox Inhalt variabel

    in Microsoft Excel Hilfe
    Excel VBA Userform Textbox Inhalt variabel: Ich habe ein kleines Userform, dass mit mit folgendem Code in TextBox1 den Inhalt von Zelle D3, und in Textbox2 den Inhalt von Zelle E3 anzeigt. If [B3] = "X" Then UserForm1.CheckBox1.Value =...
  8. userform textbox mit vba belegen

    in Microsoft Excel Hilfe
    userform textbox mit vba belegen: Hallo Gemeinde. Ich habe eine Tabelle mit Verbrauchsmaterialien. In dieser habe ich eine Useroform mit zwei Eingabefeldern erstellt. Beim Klicken auf die Schaltfläche 7 erscheint die...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden