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 Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

Steuerelement in Klasse übergeben

Betrifft: Steuerelement in Klasse übergeben von: Erik Kaubitzsch
Geschrieben am: 16.09.2014 10:45:04

Liebe Gemeinde,

ich benötige einen Tritt in den Hintern, ich habe ein Problem und ich fürchte, dass die Lösung vor mir liegt, jedoch: ich bin zu blind.

Vorbetrachtung

Ich habe ein Userform, in dem ich mehrere Textboxen zur Laufzeit erzeuge. Einige davon dienen der Eingabe von Daten (Pl. von Datum).

Um die Eingabe für die/den Anwender/-in zu erleichtern, gibt das Userform während der Eingabe ein visuelles Feedback, ob das Datum im richtigen Format eingegeben wird/wurde (Textbox-Hintergrund wird rot, ControlTipText enthält einen entsprechenden Hinweis).

Das ganze realisiere ich mit mit einer Ereignisklasse.

So sieht's aus

Option Explicit
'Documentation: http://www. _
online-excel.de/excel/singsel_vba.php?f=57

Public WithEvents thisValidate As MSForms.TextBox
Private Sub thisValidate_Change()
    If thisValidate.Tag = "date" Then Call IsDate(thisValidate)
End Sub
Private Sub IsDate(oControl As MSForms.TextBox)
    Dim IsADate As Boolean
    Dim thisUserform As UserForm
   
    Set thisUserform = get_CurrentUserform
    
    IsADate = RegExValidate(oControl.Value, "^\d{2}\.\d{2}\.\d{4}$")
    If IsADate = False And oControl.Value <> "" Then
        thisUserform.oControl.BackColor = RGB(255, 64, 64)
        thisUserform.oControl.ControlTipText = "Bitte geben Sie das Datum im Format tt.mm.jjjj  _
ein. Beispiel: 01.01.2014"
    Else
        thisUserform.oControl.BackColor = RGB(255, 255, 255)
        thisUserform.oControl.ControlTipText = ""
    End If
End Sub
Das Problem

"thisValidate", das eigentlich ein Steuerelement sein müsste, wird an die Prozedur "IsDate" mit dem Value übergeben und es erscheint eine entsprechende Fehlermeldung (Laufzeitfehler 438), dass das Steuerelement nicht existiert.

Wenn ich in die Textbox einen Buchstaben eingebe, wird thisValidate mit dem Buchstaben übergeben - was natürlich nicht sinnvoll ist.

Was will ich realisieren

Ich würde gern das Steuerelement an die Validierungsprozeduren übergeben, um ein bisschen Code zu sparen und weil in den verschiedenen Eigenschaften (.value, .caption, .tag) für die Verarbeitung wichtige Infos stehen.

Ich freue mich über Unterstützung und Aufklärung, bin dankbar für jeden Hinweis.

Gruß
Erik

  

Betrifft: AW: Steuerelement in Klasse übergeben von: fcs
Geschrieben am: 16.09.2014 14:10:35

Hallo Erik,

man kann hier mit der Objekt-Eigenschaft arbeiten, um das Steuerelement an die Sub zu übergeben. Allerdings gehen dabei betimmte Eigenschaften verloren, die dann nicht zugewiesen werden können, u.a. der ControlTipText.
Hier kann man mit einer Function arbeiten, um den Wert der Eigenschaft der Textbox anzupassen.
Zum testen hab ich einige Prüfungen umgebaut, damit ich nicht zu viwl nachbauen muss. Dass musst du ggf. wie in deienr Fassung aufbauen.

'Bearbeitet/Erstellt unter Excel 2010
Option Explicit
'Documentation: http://www. _
online-excel.de/excel/singsel_vba.php?f=57


Public WithEvents thisValidate As MSForms.TextBox

Private Sub thisValidate_Change()
    If thisValidate.Tag = "date" Then
      thisValidate.ControlTipText = fncDate(thisValidate.Object)
    End If
End Sub

Private Function fncDate(oControl As Object) As String 'MSForms.TextBox
    Dim IsADate As Boolean
    
    IsADate = False
    If IsDate(oControl.Value) Then 'RegExValidate(oControl.Value, "^\d{2}\.\d{2}\.\d{4}$")
      If Format(CDate(oControl), "DD.MM.YYYY") = oControl.Text Then IsADate = True
    End If
    
    If IsADate = False And oControl.Value <> "" Then
        oControl.BackColor = RGB(255, 64, 64)
        fncDate = _
          "Bitte geben Sie das Datum im Format tt.mm.jjjj ein. Beispiel: 01.01.2014"
    Else
        oControl.BackColor = RGB(255, 255, 255)
        fncDate = ""
    End If
End Function
Da der Code der Sub relativ kurz ist, ist es ggf. einfacher ohne Function zu arbeiten.
'Alternative
Private Sub thisValidate_Change()
    Dim bolCheck As Boolean
    If thisValidate.Tag = "date" Then
      With thisValidate
        bolCheck = False
        If IsDate(.Value) Then 'RegExValidate(oControl.Value, "^\d{2}\.\d{2}\.\d{4}$")
          If Format(CDate(.Value), "DD.MM.YYYY") = .Text Then bolCheck = True
        End If
        
        If bolCheck = False And .Value <> "" Then
            .BackColor = RGB(255, 64, 64)
            .ControlTipText = _
              "Bitte geben Sie das Datum im Format tt.mm.jjjj ein. Beispiel: 01.01.2014"
        Else
            .BackColor = RGB(255, 255, 255)
            .ControlTipText = ""
        End If
      End With
    End If
End Sub


Gruß
Franz


  

Betrifft: AW: Steuerelement in Klasse übergeben von: Luschi
Geschrieben am: 16.09.2014 17:36:22

Hallo Erik,

diese Art der Datumseingabe durch den Anwender in eine UF-Textbox ist doch sehr fehleranfällig & bei den neuen Touchscreens auch nicht viel besser. Ich verwende Labels, die nur angeklickt werden müccen und eine neue Datums-Userform erscheint.
Zudem haben die Textboxen in der Klassenprogrammierung den Nachteil, daß es das Enter-Ereignis komischweise nicht gibt und man so nicht weiß, in welcher Textbox gerade die Eingaben gemacht werden.

https://www.herber.de/bbs/user/92667.xlsm

Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: Steuerelement in Klasse übergeben von: Erik Kaubitzsch
Geschrieben am: 18.09.2014 20:37:58

Hallo Franz, hallo Luschi,

vielen Dank für eure schnellen Antworten. Ich habe mich dazu entschieden meine Lösung weiterzuverfolgen, da der Verzicht auf bestimmte Eigenschaften mir einfach zu groß wäre (wie von Franz vorgeschlagen).

@Luschi: Ich validiere die Eingaben schon während der Eingabe, da ich mit den Eingaben Berechnungen anstelle und diese somit exakt sein müssen. Darüber hinaus habe ich die Enabled-Eigenschaft des "Speichern"-Buttons mit der Validierung gekoppelt, so dass nur gespeichert wenn kann, wenn alle Eingabe korrekt formatiert sind.

Ich verstehe deinen Einwand nicht, dass die Formatierung fehleranfällig sei. Kannst du mir bei Gelegenheit erklären, wie du das meinst?

Auf jeden Fall: Danke euch zweien.

Gruß
Erik


  

Betrifft: AW: Steuerelement in Klasse übergeben von: Luschi
Geschrieben am: 22.09.2014 07:18:01

Hallo Erik,

Dein Ziel in der Eingangsfrage war ja, möglichst Klassenprogrammierung für die Eingabe in Textboxen zu benutzen. und da gibt es eben für diese TB's ein großen Nachteil: man kann nicht Abfragen, in welche Textbox (falls es mehrere gibt), hat denn der User geklickt und macht darin die Eingabe. Also wieder weg von der Kl.-Programmierung und hin zu den normalen UserForm-Ereignissen.
Sicher ist die Validierung der Eingabe sinnvoll und vorallem notwendig. Aber was würde der Smartphone-User sagen, wenn keine Kalender-App aufpoppt, sondern per Tastatur das Datum eingegeben werden müßte. Das Wörtchen mit 'sch' würde wohl öfters fallen, nur weil er den Punkt an der falschen Stelle versuchte einzugeben.

Also nix für ungut und einen schönen Wochenbeginn wünscht

Luschi
aus klein-Paris


 

Beiträge aus den Excel-Beispielen zum Thema "Steuerelement in Klasse übergeben"