Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1016to1020
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

TextBox_BeforeUpdate in Klassenmodul / Alternative

TextBox_BeforeUpdate in Klassenmodul / Alternative
15.10.2008 12:06:00
JogyB
Hallo zusammen,
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

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: TextBox_BeforeUpdate in Klassenmodul / Alternative
15.10.2008 12:48:15
Nepumuk
Hallo,
Beispiel:
' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = Test(Me.ActiveControl)
End Sub

Private Function Test(objTextbox As MSForms.TextBox) As Boolean
    With objTextbox
        If .Text = "OK" Then
            Test = False
        Else
            Test = True
        End If
    End With
End Function

Gruß
Nepumuk
Anzeige
AW: TextBox_BeforeUpdate in Klassenmodul / Alternative
15.10.2008 13:57:00
JogyB
Sorry, habe in der Beschreibung etwas vergessen... und auch den Grund des verlorenen Fokus falsch im Kopf gehabt.
Im Formular befindet sich eine Multipage und die Textboxen sind in Frames auf dieser Multipage.
Prinzipiell könnte man die Textbox dann mit
Me.ActiveControl.SelectedItem.ActiveControl.ActiveControl
bzw. besser mit
Me.MultiPage1.Pages(Me.MultiPage1.Value).ActiveControl.ActiveControl
abfragen - das hatte ich ursprünglich auch mal so.
Das funktioniert jedoch nur, wenn man das Ereignis weder durch Klicken in einen anderen Frame noch das Wechseln der Seite der Multipage noch das Anwählen des Elements außerhalb der Multipage auslöst und auch der Frame nicht wechselt, wenn man die Textbox mit Tab verläßt.
Denn dadurch wechselt spätestens das Vorletzte ActiveControl auf einen anderen Wert und ich erreiche somit das gewünschte Control nicht mehr - das Problem war also nicht, dass die TextBox den Fokus verliert sondern das übergeordnete Element.
Gruss, Jogy
Anzeige
AW: TextBox_BeforeUpdate in Klassenmodul / Alternative
15.10.2008 17:40:35
Nepumuk
Hi,
dann benutze doch einfach das Exit - Ereignis.
Gruß
Nepumuk
AW: TextBox_BeforeUpdate in Klassenmodul / Alternative
15.10.2008 20:16:58
JogyB
Hi.
Das löst dann zwar das Problem, dass es das falsche Control anzeigt, allerdings ist Exit etwas unberechenbar, wann es denn jetzt ausgelöst wird. Wenn ich beispielsweise die Seite der Multipage wechsle, dann passiert gar nichts, erst wenn ich wieder auf die Seite zurückgehe kommt das Ereignis. Dasselbe gilt, wenn ich einen Button außerhalb der Multipage drücke.
Und damit könnte es passieren, dass bei der Weiterverarbeitung der Daten noch der falsche Wert im Feld steht... und da in Zukunft auf Basis dieser Daten auch eine Kostenberechnung erfolgen soll, sollte ich das dann doch vermeiden ;).
Naja, muss ich doch in den sauren Apfel beissen und für jedes Textfeld den Übergabewert in BeforeUpdate anpassen. Bzw. habe ich ja sowieso schon gemacht, nur wollte ich es gerne noch eleganter lösen und da wäre das Klassenmodul der Idealfall gewesen, da ich damit den Code hätte ordentlich entrümpeln können.
Trotzdem danke, Jogy
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige