Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: mehrere Textboxen / Auswahlfelder - Code für alle

mehrere Textboxen / Auswahlfelder - Code für alle
Jonathan
Hey,
der Betreff ist evtl. etwas irreführend...
In einer UF habe ich zwanzig Reihen a 5 Textfelder und 3 Auswahlfelder. Diese sind im Stil
txt_betrag1, txt_kat1, ...
txt_betrag2, txt_kat2, ...
benannt.
Nun soll (hier erstmal nur für die Textfelder txt_betrag(Zahl 1-20)) beim Auswählen des Textfeldes ein bestimmter Code ausgeführt werden. Ob nun ausgewählt oder beim Druck auf die Enter-Taste ist mir erstmal egal (ich denke, dass kann individuell angepasst werden). Ich möchte nun nur nicht für jedes einzelne Feld (dies sind 20*8=160 Felder) das Ereignis separat abfangen. Gibt es eine Möglichkeit, dies zu vereinfachen?
Würde mich über Hilfe - wie immer - sehr freuen!
LG
Jonathan
Anzeige
AW: mehrere Textboxen / Auswahlfelder - Code für alle
06.09.2011 06:33:23
Hajo_Zi
Halllo Jonathan,
esx soll also nicht bei Eingabe (Klassenprogrammierung) erfolgen sondern vor Druck?
machen eine Schleife drüber mit
Controls("Txt_Betrag" &inI).....

AW: mehrere Textboxen / Auswahlfelder - Code für alle
06.09.2011 07:57:54
mischarichter
Hi Jonathan,
mit der Schleife hat Hajo recht. Dir muss aber klar sein, wann diese schleife gestartet wird:
beim Verlassen jedes einzelnen controls - dann klassenprogrammierung für alle betreffenden controls
beim verlassen der letzten textbox - dann dort ein ereignis programmieren, zB so.
dim txt as control
for each txt in me.controls
if left(txt.name,3) ="txt" then
...
endif
next txt
mischarichter
Anzeige
He, Mischa, dich gibt's noch?! ;-)) Gruß owT
07.09.2011 15:31:13
Luc:-?
:-?
AW: Code für alle Textboxen (Klasse)
06.09.2011 15:19:08
Jonathan
Hallo ,
danke für Eure Antworten! Ich glaube, meine Fragen sind damit schon geklärt; ich werde mal beide Variante (Schleife, Klassenmodul) testen!
Eine Frage habe ich noch (nicht direkt hierzu):
Mit drücken der Entertaste - sofern eine Textbox ausgewählt ist - soll sich eine InputBox öffnen. Dies klappt auch:

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Call Betrag_eingeben
End Sub


Private Sub Betrag_eingeben()
Dim Betrag As String
Betrag = InputBox(prompt:="Bitte geben Sie den Zahlenwert der Buchung ein; bei bereits  _
vorhandenden Beträgen werden diese summiert.", Title:="Betrag eingeben")
If IsNumeric(Me.TextBox3.Value) Then
Me.TextBox3.Value = WorksheetFunction.sum(CDbl(Me.TextBox3.Value), CDbl(Betrag))
Else
Me.TextBox3.Value = Betrag
End If
Me.TextBox3.SetFocus
End Sub
Was aber nicht funktioniert: Me.TextBox3.SetFocus. Irgendwie wird der Foyus nicht auf die Textbox gesetzt, sondern es wird ganz normal die nächste Form ausgewählt (z.B. ein Button).
Wie kann ich den Focus richtig setzen?
Danke euch!!
Anzeige
AW: Code für alle Textboxen (Klasse)
06.09.2011 18:06:53
fcs
Hallo Jonathan,
die Enter-Taste löst normalerweise auch das das Exit-Ereignis der Textboxen aus.
Indem man den Wert für Cancel auf True setzt kann man verhindern, dass die Box verlassen wird.
Nachfolgende Anpassungen muss du machen, damit es funktioniert.
In wie weit du das dann ggf. in die Klassenmodule für die Textboxen einbauen kannst weiss ich nicht genau (ist bisher nicht so mein Gebiet). Bei der großen Anzahl macht das auf jeden fall Sinn.
Wahrscheinlich muss du die Variable
"bBoxVerlassen" As Boolean 'Merker für Verlassen der Textbox
Dann in einem allgemeinen Modul als Public deklarieren.
Gruß
Franz

'Variablendeklaration am Beginn des Userform-Code-Moduls
Private bBoxVerlassen As Boolean 'Merker für Verlassen der Textbox
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = bBoxVerlassen
bBoxVerlassen = False
End Sub
Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then Call Betrag_eingeben '13 = Entertaste
End Sub
Private Sub Betrag_eingeben()
Dim Betrag As String
Eingabe:
Betrag = InputBox(prompt:="Bitte geben Sie den Zahlenwert der Buchung ein; " _
& "bei bereits  vorhandenden Beträgen werden diese summiert.", Title:="Betrag eingeben")
If IsNumeric(Betrag) Then
If IsNumeric(Me.TextBox3.Value) Then
Me.TextBox3.Value = WorksheetFunction.Sum(CDbl(Me.TextBox3.Value), CDbl(Betrag))
Else
Me.TextBox3.Value = Betrag
End If
Else
If Betrag  "" Then
MsgBox "Eingabe ist keine Zahl", vbInformation, "Betrag eingeben"
GoTo Eingabe
End If
End If
bBoxVerlassen = True
End Sub

Anzeige
AW: Code für alle Textboxen (Klasse)
06.09.2011 22:50:14
Jonathan
Super, vielen lieben Dank Euch allen!
Aber natürlich noch eine Rückfrage:
Ich konnte mit Hilfe der Beispieldatei eine entsprechende Klasse programmieren, allerdings regiert diese nur auf das Drücken der Enter-Taste; die anderen Ereignisse werden unberücksichtigt gelassen:
UserForm

Option Explicit
Public bBoxVerlassen As Boolean
Dim i As Integer
Dim TxTBoBetrag() As New Klasse1
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 0 To 19
ReDim Preserve TxTBoBetrag(i)
Set TxTBoBetrag(i).km_TxTBoBetrag = Me("txt_betrag" & i + 1)
Next i
End Sub
Private Sub UserForm_Terminate()
Erase TxTBoBetrag
End Sub
Klassenmodul

Option Explicit
Public WithEvents km_TxTBoBetrag As MSForms.TextBox
Public bBoxVerlassen As Boolean
Private Sub km_TxTBoBetrag_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = bBoxVerlassen
bBoxVerlassen = False
End Sub
Private Sub km_TxTBoBetrag_Enter()
Call Betrag_eingeben
End Sub
Private Sub km_TxTBoBetrag_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As  _
Integer)
If KeyCode = 13 Then Call Betrag_eingeben
End Sub
Private Sub Betrag_eingeben()
Dim Betrag As String
Eingabe:
Betrag = InputBox(prompt:="Bitte geben Sie den Zahlenwert der Buchung ein; bei bereits  _
vorhandenden Beträgen werden diese summiert.", Title:="Betrag eingeben")
If IsNumeric(Betrag) Then
If IsNumeric(km_TxTBoBetrag.Value) Then
km_TxTBoBetrag.Value = WorksheetFunction.sum(CDbl(km_TxTBoBetrag.Value), CDbl(Betrag))
Else
km_TxTBoBetrag.Value = Betrag
End If
Else
If Betrag  "" Then
MsgBox "Ihre Eingabe ist kein nummerischer Wert.", vbCritical, "Betrag eingeben"
GoTo Eingabe
End If
End If
bBoxVerlassen = True
End Sub
Ich würde mich sehr freuen, wenn Ihr mir noch helfen könntet! ;-)
VG
Anzeige
AW: Code für alle Textboxen (Klasse)
07.09.2011 01:42:12
fcs
Hallo Jonathan,
im Klassenmodul der MsForms-Textbox werden die Ereignisse Enter und Exit nicht unterstützt.
Das müsste man direkt im Userform realisieren.
Auf jeden Fall muss die Deklaration der Variablen "bBoxVerlassen" aus dem KlassenCode und aus dem Useform-Code verschwinden.
Die Deklaration
Public bBoxVerlassen as Boolean
muss in einem allgemeinen Modul erfolgen.
Ich schau am Morgen nochmal ob man das irgendwie noch in der Klasse umsetzen kann, aber ich denke es geht nicht. Erste Versuch mit MouseUp und MouseDown waren nicht zufriedenstellend.
Gruß
Franz
Anzeige
Userform - Code für alle Textboxen (Klasse)
07.09.2011 13:39:06
fcs
Hallo Jonathan,
1. Tastenkombination, um den Fokus auf ein bestimmtes Steuerelement im Userform zu setzen.
Mit beispielhaft
Application.OnKey "^f", "SetFokusAufUF_Textbox"
Das OnKey-Ereignis gilt für das Excel-Anwendungsfenster, funktioniert aber nicht wenn eines der Elemente im Userform den Fokus hat.
Man muss dann für alle Steuerelemente, die den Fokus bekommen können eine KeyDown-Ereignisprozedur anlegen bzw. im zugehörigen Klassenmodul. Mit Klassen geht das noch verhältnismäßig einfach, ist aber doch recht mühselig.
2. Exit-Ereignis für Betrags-Textboxen
Wie schon geschrieben, gibt es für Textboxen im Klassenmodul keine Exit-Ereignis-Prozedur. Ich hab auch keinen zufriedenstellenden Workaround gefunden.
Es bleibt also nichts anderes übrig, als die Exit-Ereignisprozeduren direkt im Userform-Code anzulegen.
In der hochgeladenen Beispieldatei hab ich mal alles umgesetzt
.https://www.herber.de/bbs/user/76507.xls
Gruß Franz
Anzeige
AW: Userform - Code für alle Textboxen (Klasse)
07.09.2011 18:14:56
Jonathan
Vielen vielen Dank für deine Hilfe und Mühe, Franz!
AW: Userform - Code für alle Textboxen (Klasse)
07.09.2011 18:48:14
Jonathan
Hallo Franz,
ich möchte mich noch einmal kurz rückmelden; ich habe deine Beispieldatei nun durchgearbeitet! Das ist echt Wahnsinn, vielen lieben Dank für die super Hilfe!!! Alle meine Fragen wurden von dir beantwortet!
Nochmals danke!!
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Code für mehrere Textboxen und Auswahlfelder in Excel


Schritt-für-Schritt-Anleitung

  1. Erstelle dein UserForm: Füge in Excel eine neue UserForm hinzu und füge die gewünschten Textboxen (txt_betrag1, txt_betrag2, ..., txt_betrag20) und Auswahlfelder hinzu.

  2. Deklariere ein Klassenmodul: Erstelle ein neues Klassenmodul (z.B. Klasse1) und füge den folgenden Code ein:

    Option Explicit
    Public WithEvents km_TxTBoBetrag As MSForms.TextBox
    Public bBoxVerlassen As Boolean
    
    Private Sub km_TxTBoBetrag_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Cancel = bBoxVerlassen
        bBoxVerlassen = False
    End Sub
    
    Private Sub km_TxTBoBetrag_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = 13 Then Call Betrag_eingeben ' 13 = Enter-Taste
    End Sub
    
    Private Sub Betrag_eingeben()
        Dim Betrag As String
        Eingabe:
        Betrag = InputBox(prompt:="Bitte geben Sie den Zahlenwert der Buchung ein; bei bereits vorhandenen Beträgen werden diese summiert.", Title:="Betrag eingeben")
        If IsNumeric(Betrag) Then
            If IsNumeric(km_TxTBoBetrag.Value) Then
                km_TxTBoBetrag.Value = WorksheetFunction.Sum(CDbl(km_TxTBoBetrag.Value), CDbl(Betrag))
            Else
                km_TxTBoBetrag.Value = Betrag
            End If
        Else
            If Betrag <> "" Then
                MsgBox "Ihre Eingabe ist kein nummerischer Wert.", vbCritical, "Betrag eingeben"
                GoTo Eingabe
            End If
        End If
        bBoxVerlassen = True
    End Sub
  3. Initialisiere die Klasseninstanzen im UserForm: Im UserForm-Code fügst du den folgenden Code hinzu, um die Textboxen dynamisch zu verknüpfen:

    Dim TxTBoBetrag() As New Klasse1
    
    Private Sub UserForm_Initialize()
        Dim i As Integer
        For i = 0 To 19
            ReDim Preserve TxTBoBetrag(i)
            Set TxTBoBetrag(i).km_TxTBoBetrag = Me("txt_betrag" & i + 1)
        Next i
    End Sub
  4. Verhindere das Verlassen der Textbox: Um zu verhindern, dass die Textbox beim Drücken der Enter-Taste verlassen wird, kannst du die Exit-Ereignisprozedur im UserForm implementieren:

    Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Cancel = bBoxVerlassen
        bBoxVerlassen = False
    End Sub

Häufige Fehler und Lösungen

  • Ereignisse nicht erkannt: Wenn die Enter- oder Exit-Ereignisse nicht ausgelöst werden, stelle sicher, dass die Variablen korrekt deklariert sind und dass der Code im richtigen Modul platziert ist.

  • Fokus wird nicht gesetzt: Wenn der Fokus nach dem Eingeben nicht zurück zur Textbox wechselt, prüfe, ob das Cancel-Argument im Exit-Ereignis korrekt gesetzt ist.

  • Eingabe ist kein nummerischer Wert: Achte darauf, dass du die Eingabewerte im Betrag_eingeben-Prozess korrekt prüfst. Verwende IsNumeric, um sicherzustellen, dass die Eingaben gültig sind.


Alternative Methoden

  1. Verwendung von Schleifen: Statt für jede Textbox einen eigenen Code zu schreiben, kannst du eine Schleife verwenden, um alle Textboxen zu durchlaufen und eine gemeinsame Logik anzuwenden.

  2. Klassenmodule für weitere Steuerelemente: Du kannst ähnliche Klassenmodule für andere Steuerelemente, wie Auswahlfelder, erstellen, um ihre Ereignisse zu verwalten.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um die Eingabe in einer Textbox zu summieren:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then ' Enter-Taste
        Call Betrag_eingeben
    End If
End Sub

In diesem Beispiel wird die Betrag_eingeben-Funktion aufgerufen, wenn die Enter-Taste gedrückt wird.


Tipps für Profis

  • Verwende Application.OnKey: Mit Application.OnKey kannst du Tastenkombinationen definieren, um schnell auf bestimmte Funktionen zuzugreifen. Dies kann die Benutzerfreundlichkeit erhöhen.

  • Optimierung der UserForm: Halte die UserForm übersichtlich und nutze Gruppierungen für verwandte Eingabefelder, um die Bedienbarkeit zu verbessern.

  • Debugging: Nutze Debug.Print oder MsgBox, um Variablenwerte während der Laufzeit zu überprüfen und Probleme schnell zu identifizieren.


FAQ: Häufige Fragen

1. Wie kann ich mehrere Textboxen in einem UserForm verwalten? Du kannst ein Klassenmodul erstellen, das die Ereignisse für jede Textbox behandelt, und dann eine Schleife im UserForm verwenden, um diese zu initialisieren.

2. Warum funktioniert die Enter-Taste nicht wie erwartet? Überprüfe, ob das Cancel-Argument in der Exit-Ereignisprozedur korrekt gesetzt ist. Dies verhindert, dass die Textbox beim Drücken der Enter-Taste verlassen wird.

3. Kann ich den Code für mehrere UserForms wiederverwenden? Ja, indem du allgemeine Module oder Klassenmodule verwendest, kannst du Code wiederverwendbar gestalten und in verschiedenen UserForms nutzen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige