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

Ereignis für viele Textfelder gesucht

Forumthread: Ereignis für viele Textfelder gesucht

Ereignis für viele Textfelder gesucht
26.12.2024 13:04:04
Klaus B aus D
Guten Tag,

in einer Schleifenfunktion leere ich 36 (9 x 4) Textfelder:
Private Sub cmdFelderLeeren_Click()

' Schleifenfunktion als Alternative (um weniger Code schreiben zu müssen)
Dim z As Integer ' "Zehner"
Dim e As Integer ' "Einer"
For z = 1 To 9
For e = 1 To 4
UserForm1.Controls("txt" & z & e).Value = ""
Next e
Next z
End Sub
Bei einer Falscheingabe soll der Anwender eine entsprechende Meldung erhalten:


Private Sub txt11_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If txt11 > 3 Then
MsgBox "Es sind nur Werte von 0 bis 3 zulässig."
txt11 = ""
Cancel = True
End If
End Sub
Für das 1. Textfeld wird die Meldung bisher so realisiert, doch wie bekomme ich es hin, dass ich - möglichst in einer Schleife - alle 36 Textfeldeingaben überwache, statt diesen Code für jedes einzelne Textfeld anzulegen?
Der Anwender ist nicht daran gehalten, Einträge in der UserForm in einer festgelegten Reihenfolge vorzunehmen.

Gruß Klaus

Anzeige

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ereignis für viele Textfelder gesucht
26.12.2024 13:10:05
schauan
Hallöchen,

dann solltest Du die Textfelder per Klassenprogrammierung verwalten ...
Mahlzeit erstmal ;-)
AW: Ereignis für viele Textfelder gesucht
26.12.2024 14:09:15
Klaus B aus D
Hallo schauan,

und was bitte ist eine "Klassenprogrammierung"?

Ich suche nach dem auslösenden Ereignis: Private Sub ... ().

Gruß Klaus
AW: Ereignis für viele Textfelder gesucht
26.12.2024 16:25:09
daniel
Klassenprogrammierung ist vereinfacht gesagt die Methode, die man verwendet um ein Eventmakro zu schreiben, welches man für mehrere gleichartige Steuerelemente verwenden kann, so dass man nicht für jedes Steuerelement ein eigenes Makro schreiben muss.

Gruß Daniel
AW: Ereignis für viele Textfelder gesucht
26.12.2024 13:11:42
snb
Alle Textboxen in einem Frame

For each it in Frame1.controls

it=""
Next
Anzeige
AW: Ereignis für viele Textfelder gesucht
26.12.2024 13:14:36
snb
Wenn nur 0-3 gultig ist wäre es besser comboboxen zu verwenden.

Combobox1.list=[transpose(row(1:4)-1)]
AW: Ereignis für viele Textfelder gesucht
27.12.2024 13:32:43
Klaus B aus D
@ snb: Danke für die Hinweise.
Das Löschen aller Textfeldinhalte innerhalb eines Rahmens ist nicht zielführend, da somit auch bereits korrekte Eingaben wieder verschwinden.
Kombinationsfelder anstatt der 36 Textfelder verlangsamen die Eingabegeschwindigkeit der Wertungspunkte, die während einer lfd. Veranstaltung kurz vor der Siegerehrung zügig einzutragen sind (Vorgabe des Anwenders).

@ Daniel: Wenn ich Deine Erklärung richtig verstanden habe, dann könnte die Ausführung so aussehen, wie ein Vorschlag auf der verlinkten Seite von schauan.
Leider kommt es dabei zu einem Laufzeitfehler ‚438‘: „Objekt unterstützt diese Eigenschaft oder Methode nicht“. Die Zeile „If Not IsNumeric …“ wird markiert.
' Hinweis aus HERBERS Forum

' Prüfung, ob bei der Eingabe nur die Ziffern 0, 1, 2 od. 3 verwendet wurden.
Private Sub checkValue()
With Me.ActiveControl
If Not IsNumeric(.Value) And .Value > 3 Or .Value 0 Then
MsgBox "Es sind nur Werte von 0 bis 3 zulässig."
.Value = vbNullString
End If
End With
End Sub

Private Sub txt11_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' If txt11 > 3 Then
' MsgBox "Es sind nur Werte von 0 bis 3 zulässig."
' txt11 = ""
' Cancel = True
' End If

Call checkValue ' Hinweis aus HERBERS Forum

End Sub

@ schauan: die geringsten Programmzeilen habe ich versucht, zu nutzen – leider mit erwähnter Fehlermeldung.
Anzeige
AW: Ereignis für viele Textfelder gesucht
27.12.2024 13:52:47
schauan
Hallöchen,

ich habe den code mal hier eingearbeitet. Die Prüfung auf numerisch und 0 bis 3 erfolgt schon bei der Eingabe.

https://www.herber.de/bbs/user/174577.xlsm
AW: Ereignis für viele Textfelder gesucht
28.12.2024 14:39:54
Klaus B aus D
Hallo schauan,

leider zeigt der Code aus deinem Beispiel, den ich in ein Klassenmodul in meiner Anwendung eingefügt habe, keinerlei Reaktion bei einer Falscheingabe in der UserForm.
Ich habe gestern Stunden daran gesessen, weitere Hinweise aus dem Internet zu nutzen, kam aber keinen einzigen Schritt weiter.
Ich scheue mich davor, den gleichen Code für 36 Textfeld-Überwachungen zu erstellen, denn das sieht dann wirklich nicht "professionell" aus.

Laut Netz habe ich verstanden, dass man für diesen Code keine Parameter übergeben muss:
Sub TextBox_AfterUpdate(ByVal Target As Range)

If TypeOf Target Is MSForms.TextBox Then
If Target.Name Like "txt*" Then ' Überprüfe, ob es sich um ein Textfeld handelt
If Target.Value > 3 Or Target.Value 0 Then
MsgBox "Bitte geben Sie eine Zahl zwischen 0 und 3 ein."
Target.Value = ""
End If
End If
End If
End Sub
Es findet bei der Eingabe einer Zahl in ein beliebiges Textfeld keine Kontrolle statt, so dass die falschen Ziffern nicht bemängelt werden.
Eine Beispieldatei habe ich mal angehängt.
https://www.herber.de/bbs/user/174582.xlsm
Gruß Klaus
Anzeige
AW: Ereignis für viele Textfelder gesucht
28.12.2024 15:50:58
Uduuh
Hallo,
du hast die Klasse nicht initialisiert.
Siehe Userform_Initialize in schauans Mappe.

Gruß aus'm Pott
Udo
AW: Ereignis für viele Textfelder gesucht
28.12.2024 16:34:11
Klaus B aus D
Hallo Udo,
meine Kenntnisse reichen nicht so weit, dass ich den Code vollständig verstehe, aber nachdem ich deinem Hinweis gefolgt bin, zeigt sich zum 1. Mal ein Erfolg.
Danke dafür.
Durch eine eingefügte Codezeile werden falsche Eintrag wieder gelöscht:
        If .Value  0 Or .Value > 3 Then

MsgBox "Sorry, only numbers between 0 and 3 allowed"
.Value = ""
End If
Jetzt fehlt mir noch eine Einschränkung der Textfelder-Überwachung in der gesamten UserForm auf Felder, die nur dem Muster "txt??" entsprechen, damit die Fehlermeldung nicht bei allen Textfeldern erscheint.
Könntest du mir bitte behilflich sein, wie und wo ich diese Bedingung einfügen kann?

Gruß Klaus B aus D(orsten) - auch aus'm Pott
Anzeige
AW: Ereignis für viele Textfelder gesucht
28.12.2024 16:57:53
Uduuh
Hallo,
nutze den LIKE-Operator.
z.B.
Private Sub UserForm_Initialize()

Dim ctl As MSForms.Control
Dim oHandler As NumericTextbox
Set colTBs = New Collection

For Each ctl In Me.Controls
If TypeOf ctl Is MSForms.TextBox Then
If ctl.Name Like "txt##" Then
Set oHandler = New NumericTextbox
Set oHandler.myTextBox = ctl
colTBs.Add oHandler
End If
End If
Next ctl
End Sub

Gruß aus'm Pott
Udo
Anzeige
AW: Ereignis für viele Textfelder gesucht
28.12.2024 18:23:30
Klaus B aus D
Hallo Udo,
die Anpassung habe ich erfolgreich eingefügt.
Durch das Leeren des Textfelds (.Value = ""), in welches eine unerlaubte Zahl eingegeben wurde, erscheint die Warnmeldung jetzt 2 x hintereinander.
Ließe sich diese "Zwillingswarnung" irgendwie vermeiden?

Gruß Klaus
AW: Ereignis für viele Textfelder gesucht
28.12.2024 20:05:22
Uduuh
Hallo,
z.B.
Private Sub tb_Change()

Dim bolCODE As Boolean
If Not bolCODE Then
bolCODE = True
With tb
If Not IsNumeric(.Value) And .Value > vbNullString Then
MsgBox "Sorry, only numbers allowed"
.Value = vbNullString
Else
If .Value 0 Or .Value > 3 Then
MsgBox "Sorry, only numbers between 0 and 3 allowed"
.Value = vbNullString
End If
End If
End With
bolCODE = False
End If
End Sub

Gruß aus'm Pott
Udo
Anzeige
AW: Ereignis für viele Textfelder gesucht
28.12.2024 20:49:34
Klaus B aus D
Hallo Udo,

ich habe die Codezeilen in meinem Klassenmodul durch deinen Programmcode ersetzt.
Bei einer Falscheingabe in ein UserForm-Textfeld erscheint die Warnmeldung leider immer noch zweimal hintereinander.

Gruß Klaus
AW: Ereignis für viele Textfelder gesucht
28.12.2024 22:35:54
Piet
Hallo

kann es sein das durch das löschen der Code nochmal aufgerufen wird??? - Bin mir nicht sicher??
Falls ja --> nach With xxx bitte Application.EnableEvents = False setzen
und VOR End With bitte Application.EnableEvents = True setzen
Einfach mal probieren, mal schauen ob sich was ändert?

mfg Piet
Anzeige
AW: Ereignis für viele Textfelder gesucht
29.12.2024 00:35:04
emkaes
Hallo,

habe von deinem Code Teile unverändert übernommen und Teile abgeändert und Code ergänzt.
Deinen kompletten Code habe ich auskommentiert, so dass er dir nicht verloren geht.
Das Auslesen/zurückschreiben von Daten habe ich ausgegliedert in die Sub Readdata(....).
Hier verlasse ich mich auf die erkannte Systematik und "berechne" die entsprechenden Spalten/Textboxen ( finde ich übersichtlicher )

https://www.herber.de/bbs/user/174588.xlsm
Anzeige
AW: Ereignis für viele Textfelder gesucht
29.12.2024 14:27:40
Klaus B aus D
@ Uwe: Ich habe DIM durch STATIC ersetzt (ohne zu wissen, was es bedeutet). Tatsächlich erscheint die Warnung bei falscher Eingabe nur noch ein einziges Mal. Dann fiel mir aber auf, dass die Fehlermeldung bereits erscheint, wenn ein eingelesener Eintrag einfach nur gelöscht wird. Im Code müsste also noch berücksichtigt werden, dass beim Zelleninhalt NULL keine Meldung erscheint.

@ Piet: die beiden vorgeschlagenen Codezeilen konnten das Problem „Doppelmeldung“ nicht eliminieren. Der Vorschlag von Uwe half allerdings weiter (DIM durch STATIC ersetzen), ist aber noch nicht ganz sauber, weil die Meldung auch beim Leeren eines Formularfelds erscheint (hatte ich vorher nie getestet).
Die letzte Verbesserung an der „Maske für schnelle Eingaben auf Zuruf“ wäre noch, den Focus auf das betroffene Feld zu legen, in dem die falsche Eingabe erfolgt ist. Meine SetFocus-Versuche waren bisher erfolglos.

@emkaes: Verblüffend, wie du den Code gestrafft hast, was mir mit meinen geringen Kenntnissen nie gelungen wäre.
Um den Eintrag „Ergebnis“ mit ein Tausender-Trennzeichen (Punkt) zu versehen, habe ich noch diese Zeile eingefügt:
txtErgebnis = Format(wks.Cells(retval, 3), "0,0")

Darf ich „retval“ mit „Return Value“ übersetzen, um ein bisschen mehr zu verstehen, was hinter dem Formular so vor sich geht?

Deine Lösung hat eine Tatsache aus diesem Thread nicht berücksichtigt. Du schreibst: „Ich verlasse mich auf die erkannte Systematik und ‚berechne‘ die entsprechenden Spalten …“.
In meiner Lösung habe ich mich beim Laden der Daten aus der Tabelle in die UserForm an den Überschriften orientiert – genauso, wie beim Übertagen der Punkte aus der Maske zurück in die Tabelle.
Bei deiner Lösung geraten die Einträge durcheinander, wenn ich z. B. vor die Spalte C eine weitere Spalte hinzufüge.

Ein Dankeschön an alle Mitdenker!
Gruß Klaus

Anzeige
AW: Ereignis für viele Textfelder gesucht
29.12.2024 14:49:32
Kuwer
Hallo Klaus,

Private Sub tb_Change()

Static bolCODE As Boolean
If Not bolCODE Then
bolCODE = True
With tb
Select Case .Value
Case 1, 2, 3
Case Else
MsgBox "Sorry, only numbers between 0 and 3 allowed"
.Value = ""
.SetFocus
End Select
End With
bolCODE = False
End If
End Sub

Gruß, Uwe
Anzeige
AW: Ereignis für viele Textfelder gesucht
29.12.2024 20:06:10
Klaus B aus D
Danke, Uwe, doch die Eingabe ist noch nicht zu Ende gedacht.

Erstens habe ich die "0" für die Select Case Zeile eingefügt, da als erreichte Punkte auch eine "0" erscheinen soll, falls es auf eine Frage keine richtige Antwort gab. Außerdem sieht der Anwender, dass er das Feld bearbeitet hat (in der Excel-Vorlage sollen die Nullen erscheinen).

Zweitens wird direkt nach der Eingabe einer StartNr. die Fehlermeldung zweimal ausgelöst für Felder, die nicht dem Format "txt??" entsprechen (z. B. Strafzeit).

Drittens funktioniert die Zeile "SetFocus" nicht. Das klappte auch bei meinen Programmierversuchen nicht.

Gruß Klaus
Anzeige
AW: Ereignis für viele Textfelder gesucht
29.12.2024 22:37:52
emkaes
Hallo,

ich kenne deinen Workflow ja nicht, aber nach dem Aufruf der Userform wirst du wohl keine Spalten umbenennen, löschen oder einfügen.

Daher wird bei jedem Aufruf der Userform ein Array erstellt, das die "Verknüpfung" der "txt##" Textboxen mit den entsprechenden Spalten enthält.
Ich habe zusätzlich noch ein Textbox_Change_Ereignis eingefügt, da über das Keypress nicht verhindert wird, dass man 1023 eingeben kann.


Was machst du eigentlich, wenn die Suche nach Startnummern, sowohl in Tabelle Teilnehmer als auch in Tabelle Wertungspunkte nicht erfolgreich ist?
Oder in Teilnehmer ja, aber in Wertungspunkte nicht et vice versa?

btw. die SetFocus Methode für die Textboxen:
nach meiner trüben Erinnerung kann das was mit dem FRAME und der Aktivierungsreihenfolge im FRAME zu tun haben und dem jeweiligen Ereignis.
Aber nix genaues habe ich da als Begründung. Ich verzichte daher immer auf FRAMES, die sind mir zu vigiliensch ( sind mMn entbehrlich wie verbundene Zellen oder ein Kropf).

https://www.herber.de/bbs/user/174598.xlsm
Anzeige
AW: Ereignis für viele Textfelder gesucht
30.12.2024 18:59:23
Klaus B aus D
Hallo emkaes,

danke für deine Antwort.

Zum Thema "Workflow" weiß ich so viel, dass mein "Auftraggeber" von Zeit zu Zeit Anpassungen an seiner Arbeitsmappe vornimmt. Es handelt sich dabei um Tabellen, in denen Daten erfasst oder berechnet werden, die mit allen Facetten einer - ich drücke es mal so aus - "Motorrad-Schnitzeljagd" zu tun hat, die über mehrere Tage dauert.
Es existieren also Tabellen über Stationen, die anzufahren sind (HKs = Hauptkontrollen) und NKs (Nebenkontrollen), die mit ihren Koordinaten angegeben sind.
Es existieren Tabellen mit Fragen zu Aufgaben, die von den Teilnehmern (Einzelfahrer, Fahrer mit Sozius, Fahrergruppen) beantwortet werden sollen.
Beispiel: In dem Torbogen der Nachbarstadt des Ziels hängt ein Wappen. Wie lautet die Jahreszahl darauf?
Es existieren Tabellen mit den Namen der Personen, die für die einzelnen Kontrollpunkte eingeteilt wurden.
Es existieren Tabellen ...

Ich habe keinen - und möchte auch keinen - Einfluss auf die Gestaltung der Tabellenblätter und ich kann nicht davon ausgehen, dass das betroffene Tabellenblatt "Wertungspunkte" nicht wieder einmal von einer bis zur nächsten Veranstaltung modifiziert wird, so, wie es 2024 passiert ist (eingefügte Spalte).
Ich habe lediglich zugesagt zu versuchen, ein Formular für die zügige Eingabe von Punkten zu erstellen, weil das Excel-interne Formular nicht alle Spalten "in einem Rutsch" zwecks Bearbeitung darstellen kann. Für eine Punktevergabe bei der kommenden Tour werden die Tabellenfelder bereits geleert sein, bevor mit der Eintragung der aktuellen Punkte begonnen wird. Die Befehlsschaltfläche "Punkte einlesen" dient einfach nur dazu, schnell mal eine Korrektur zu ermöglichen.

In die erhaltene Arbeitsmappe von dir habe ich also versuchsweise mal zwei Spalten zwischen "Name" und "Ereignis" eingefügt (als wäre ich Anwender) und die Datei wieder abgespeichert. Würde der Anwender irgendwann danach seine nächste Auswertung vornehmen, gäbe es keine Einträge in die Felder "Strafzeit" und "Ergebnis". Recht hast du natürlich mit der Aussage, dass die Zellen, für welche Punkte vergeben werden sollen, korrekt eingelesen und die Inhalte zurück in die Tabelle geladen werden.

Zur Frage "Was machst du eigentlich, wenn die Suche nach Startnummern, sowohl in Tabelle Teilnehmer als auch in Tabelle Wertungspunkte nicht erfolgreich ist?"
Dann erscheint neben der Eingabemaske die Meldung ""Es wurde KEINE entsprechende Startnummer gefunden." Das dürfte kaum denkbar sein. Ein Kontroll-Teilnehmer diktiert aus seinen Papierunterlagen die Punkte, die ein anderer TN in das Formular (um das es hier geht) eingibt. Die Papierunterlagen sind Ausdrucke aus dem Arbeitsblatt.
Was bedeutet "et vice versa"? Bis zu meinem zarten Alter von 77 Jahren hatte ich nie Latein-Unterricht ;-)

Zur "SetFocus" Anmerkung: die Rahmen sind nur deshalb entstanden, weil ich kein anderes Zeichenelement in der Toolbox sehe. In Access sieht es für die Formulargestaltung ein wenig anders aus.

Gruß Klaus




Anzeige
AW: Ereignis für viele Textfelder gesucht
31.12.2024 13:22:45
Emkaes
Hallo,

entferne die Frames und ziehe stattdessen ein Label in gleicher Grösse auf, mache den backstyle transparent und setze die Bordereigenschaft. Dann hast du denselben visuellen Effekt ohne die Nachteile wie ein Frame.
Dann funzt auch die Setfocus - Methode
AW: Ereignis für viele Textfelder gesucht
30.12.2024 16:25:03
Uduuh
Hallo,
du solltest statt _Change das _KeyPress-Event verwenden.
Option Explicit

Private WithEvents tb As MSForms.TextBox

Public Property Set TextControl(t As MSForms.TextBox)
Set tb = t
End Property

Private Sub tb_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 51 '0 bis 3
Case Else
MsgBox "Nur Zahlen von 0 bis 3 erlaubt", vbInformation, "Gebe bekannt..."
KeyAscii = 0
End Select
End Sub

Zusätzlich noch die MaxLength-Eigenschaft der Textfelder auf 1 setzen.
Private Sub UserForm_Initialize()

Dim ctl As MSForms.Control
Dim oHandler As NumericTextbox
Set colTBs = New Collection

For Each ctl In Me.Controls
If TypeOf ctl Is MSForms.TextBox Then
If ctl.Name Like "txt##" Then
Set oHandler = New NumericTextbox
Set oHandler.TextControl = ctl
colTBs.Add oHandler
ctl.MaxLength = 1
End If
End If
Next ctl
End Sub

Gruß aus'm Pott
Udo
Anzeige
AW: Ereignis für viele Textfelder gesucht
28.12.2024 22:22:08
Uduuh
Dann lade mal deinen aktuellen Stand hoch
AW: Ereignis für viele Textfelder gesucht
29.12.2024 00:50:59
Kuwer
Hallo Klaus,

ersetze
Dim bolCODE As Boolean
durch
Static bolCODE As Boolean

Gruß, Uwe
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18