Ich versuche gerade beim Eintritt in eine Textbox auf einer Userform
ein Objekt der Application zu aktivieren, damit es offensichtlich wird
welches Objekt diese Textbox referenziert.
Im Prinzip eigentlich kein Problem, ich speichere im Textbox.Tag den
Namen des Objekts und wähle es darüber im Enter-Ereignis der Textbox
an.
Der Haken liegt darin das die Textboxen auf der Userform erst zur
Laufzeit erzeugt werden und hier gelingt es mir einfach nicht das
Enter-Ereignis zu übernehmen. MSForms.TextBox hat kein Enter-
Ereignis!?!!
Zum nachvollziehen hier exemplarischer Code, 4 Textboxen auf einer UF
die beim Eintritt in eine Textbox die jeweilige Zelle aktivieren
sollen.
--- Userform-Code schnipp ---
Option Explicit
Private MyControls As New Collection
Private Sub UserForm_Initialize()
Dim C As Control
Dim I As Integer
Dim Y As Single
Dim R As Range
Dim K As Klasse1
Y = 3
For I = 1 To 4
Select Case I
Case 1: Set R = Range("A4")
Case 2: Set R = Range("B1")
Case 3: Set R = Range("C3")
Case 4: Set R = Range("D6")
End Select
'Textbox hinzufügen
Set C = Me.Controls.Add("Forms.Textbox.1")
'Positionieren
C.Top = Y
Y = C.Top + C.Height + 3
'Werte zuweisen
C.Value = R.Address
C.Tag = R.Address
'Ereignisse etablieren
Set K = New Klasse1
Set K.MyControl = C '<--- RTE 459
MyControls.Add K
Next
End Sub
--- Userform-Code schnapp ---
Zum Funktionstest kann man in der Klasse1 UseControl auf False setzen
und dann nach Aufruf der Userform einfach eine Textbox ändern.
--- Klasse1-Code schnipp ---
Option Explicit
#Const UseControl = True
#If UseControl Then
Public WithEvents MyControl As MSForms.Control
Private Sub MyControl_Enter()
Range(MyControl.Tag).Activate
End Sub
#Else
Public WithEvents MyControl As MSForms.TextBox
Private Sub MyControl_Change()
Range(MyControl.Tag).Activate
End Sub
#End If
--- Klasse1-Code schnapp ---
Läßt sich das irgendwie machen oder geht das gar nicht?
Andreas.
Aber ein MouseDown-Ereignis. Kannst Du das nicht als Alternative nehmen?
Dann erübrigt sich das mit dem RTE 459.
Peter
Public WithEvents MyControl As MSForms.TextBox
Private Sub MyControl_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Range(MyControl.Tag).Activate
End Sub
> Aber ein MouseDown-Ereignis. Kannst Du das nicht als Alternative nehmen?
Jein.
Das alleine reicht nicht, ich müsste auch mind. das KeyUp-Ereignis
hinzuziehen um das Enter-Ereignis zu simulieren, man kann ja auch
durch die Felder TABen. Dann geht's theoretisch...
Der Haken dabei ist das ich auch für alle anderen Steuerelemente auch
diese Ereignisse übernehmen müsste um das ausgewähte Objekt wieder
abzuwählen, wenn ich z.B. mit TAB auf einen Commandbutton (oder eine
Textbox die kein Objekt repräsentiert) treffe.
Das würde bedeuten ich müsste für jeden Steuerelementyp die
Ereignisroutinen schreiben, alle TAG's der UF explizit setzen, usw.
usw.... puuh.... wenn ich ganz sauber arbeite geht's hinterher...
vielleicht... schön ist es in keinem Fall.
Andreas.
"Andreas Killer" schrieb:
> Das würde bedeuten ich müsste für jeden Steuerelementyp die
> Ereignisroutinen schreiben, alle TAG's der UF explizit setzen, usw.
> usw.... puuh.... wenn ich ganz sauber arbeite geht's hinterher...
> vielleicht... schön ist es in keinem Fall.
Ich hab mit Excel zwar noch nicht programmiert, muss ja Microsoft jetzt
wegen meiner Arbeit nehmen, hatte zuvor 12 Jahre nur Linux. Aber vielleicht
bin ich von dort verwöhnt, aber ich würde hier mit focusin und focusout oder
so arbeiten, wenn es das gibt. Oder auch mit onselection oder ähmlichem.
Das mit dem Enter alleine wäre mir schon zu wenig, weil ja wie du sagst mit
tab oder mit der mouse gearbeitet werden kann. onfocus wäre es egal woher der
fokus kommt.
> bin ich von dort verwöhnt, aber ich würde hier mit focusin und focusout oder
> so arbeiten, wenn es das gibt. Oder auch mit onselection oder ähmlichem.
Nun ja, eine TextBox hat im Prinzip ein GotFocus/LostFocus-Ereignis,
aber nur wenn man sie zur Entwicklungszeit in einer Tabelle plaziert.
Dafür fehlen dann Enter-/Exit-Ereignis.
Plaziert man Sie zur Entwicklungszeit in einer UserForm, dann ist das
Enter-/Exit-Ereignis verfügbar.
Plaziert man Sie zur Laufzeit in einer UserForm, dann fehlen Sie.
Bleibt die Frage ob man das irgendwie mit Trick17 drehen kann das es
trotzdem geht.
BTW, Dein Newsreader scheint ein Problem mit langen Betreff's zu haben!?!
Andreas.