TextBox_BeforeUpdate in Klassenmodul / Alternative
15.10.2008 12:06:00
JogyB
ich habe das Problem, dass ich ca. 50 Textboxen habe, bei denen die Eingabe in gleicher Form überprüft werden muss.
Grundstzlich wird überprüft, dass der Wert nicht null und die Box nicht leer ist (über KeyPress wird alles außer Zahlen abgefangen).
Zusätzlich geht es bei einem Teil der Textboxen darum, dass die dort eingegebene Zahl einen bestimmten Wert nicht übersteigen darf (dieser wird in einer anderen TextBox eingegeben) und gegebenenfalls auf diesen Maximalwert zurückgesetzt wird.
Momantan löse ich das über eine kleine Prozedur, ich muss aber für jede TextBox ein BeforeUpdate Ereignis erzeugen. Zusätzlich muss ich in diesem noch den Namen der TextBox übergeben, damit die korrekte TextBox bearbeitet wird.
Nun zu den Fragen:
1. Läßt sich BeforeUpdate mir den im Klassenmodul zur Verfügung stehenden Ereignissen simulieren?
2. Falls nicht, wie kann ich den Namen des Controls bzw. das Control selbst aus BeforeUpdate an die Unterprozedur übergeben, ohne dies jedesmal hinschreiben zu müssen?
Oder anderes gefragt, kann ich innerhalb von BeforeUpdate irgendwie auslesen, welche TextBox das Ereignis ausgelöst hat?
Mit dem Klassenmodul wäre es einfach, da ich in diesem ja das enstprechende Objekt habe, aber bei Ereignissen im Code des Forms ist das ja nicht der Fall... und den Fokus hat die TextBox zu dem Zeitpunkt auch nicht mehr, also kann ich damit auch nichts erreichen.
Beispielcode:
' Typische BeforeUpdate Prozedur, alle Textboxen haben übrigens einen Namen der Form data_i_j_k
Private Sub data_2_2_2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Call checkValue("data_2_2_2")
End Sub
' Überprüft, ob ein eingegebener Wert sinnvoll ist (d.h. kleiner als Gesamtzahl und nicht 0)
Sub checkValue(feldName As String)
Dim actCtl As Control
Dim i As Byte
Dim temp As String
' Fehlerbehandlung (vor allem, falls übergebener Name falsch)
On Error GoTo checkErr
' Wenn noinit gesetzt, dann nichts tun
If noInit = True Then GoTo checkErr
' Control zuweisen
Set actCtl = frm_LA.Controls(feldName)
' Falls Eingabe bspw 010, dann wird das auf 10 geändert
If IsNumeric(actCtl.Value) Then actCtl.Value = Int(actCtl.Value)
' Wenn nicht Feld 2 oder 3, dann hier beenden
If Right(feldName, 1) 2 And Right(feldName, 1) 3 Then GoTo checkErr
' Wenn leer oder null
If actCtl.Value = "" Or actCtl.Value = 0 Then
' Im Stücke-Feld, Gesamtanzahl verwenden
If Right(actCtl.naMe, 1) = 2 Then
noInit = True
actCtl.Value = frm_LA.txt_AnzMust.Value
noInit = False
' In sonstigen Feldern, dann Defaultwert
Else
' i kann ein- oder zweistellig sein, das wird hier abgefangen
temp = Mid(actCtl.naMe, 8, 2)
If Not IsNumeric(temp) Then
i = Left(temp, 1)
Else
i = temp
End If
noInit = True
actCtl.Value = defaultMessNr(Mid(actCtl.naMe, 6, 1), i)
noInit = False
End If
' Wenn größer Gesamtanzahl und im Stücke-Feld
ElseIf Int(actCtl.Value) > Int(frm_LA.txt_AnzMust.Value) And Right(actCtl.naMe, 1) = 2 Then
noInit = True
actCtl.Value = frm_LA.txt_AnzMust
noInit = False
End If
checkErr:
On Error GoTo 0
End Sub
Danke und Gruss,
Jogy