Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Frame
BildScreenshot zu Frame Frame-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema MultiPage
BildScreenshot zu MultiPage MultiPage-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

TextBox_BeforeUpdate in Klassenmodul / Alternative | Herbers Excel-Forum


Betrifft: TextBox_BeforeUpdate in Klassenmodul / Alternative von: JogyB
Geschrieben am: 15.10.2008 12:06:26

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

  

Betrifft: AW: TextBox_BeforeUpdate in Klassenmodul / Alternative von: Nepumuk
Geschrieben am: 15.10.2008 12:48:15

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


  

Betrifft: AW: TextBox_BeforeUpdate in Klassenmodul / Alternative von: JogyB
Geschrieben am: 15.10.2008 13:57:29

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


  

Betrifft: AW: TextBox_BeforeUpdate in Klassenmodul / Alternative von: Nepumuk
Geschrieben am: 15.10.2008 17:40:35

Hi,

dann benutze doch einfach das Exit - Ereignis.

Gruß
Nepumuk


  

Betrifft: AW: TextBox_BeforeUpdate in Klassenmodul / Alternative von: JogyB
Geschrieben am: 15.10.2008 20:16:58

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


Beiträge aus den Excel-Beispielen zum Thema "TextBox_BeforeUpdate in Klassenmodul / Alternative"