Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1380to1384
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

Steuerelement in Klasse übergeben

Steuerelement in Klasse übergeben
16.09.2014 10:45:04
Erik
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

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

Betreff
Datum
Anwender
Anzeige
AW: Steuerelement in Klasse übergeben
16.09.2014 14:10:35
fcs
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

Anzeige
AW: Steuerelement in Klasse übergeben
16.09.2014 17:36:22
Luschi
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

Anzeige
AW: Steuerelement in Klasse übergeben
18.09.2014 20:37:58
Erik
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

Anzeige
AW: Steuerelement in Klasse übergeben
22.09.2014 07:18:01
Luschi
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
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige