Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1404to1408
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

Label in Frame ansprechen ohne Event

Label in Frame ansprechen ohne Event
08.02.2015 11:29:48
Steffen
Mahlzeit zusammen,
ich habe eine Userform in der ich 900 Labels mit Klick einzeln anwählen können soll. Bitte keine Hinweise zu der Umseztung - es ist aus optischen Gründen ausdrücklich so gewünscht.
Ich befürchte jedoch, dass es weitere Änderungswünsche geben wird und ich möchte danach nicht jedes einzelne der 900 Klickereignisse bearbeiten müssen.
Aus diesem Grund arbeite ich gerade das erste Mal mit Klassenmodulen und versuche folgenden sehr geilen Code an meine Bedürfnisse anzupassen:
Option Explicit
Private WithEvents mobjLabel As MSForms.Label

Private Sub Class_Terminate()
Set mobjLabel = Nothing
End Sub

Private Sub mobjLabel_Click()
If mobjLabel.ForeColor = vbBlack Then
mobjLabel.ForeColor = vbBlue
mobjLabel.Caption = "blau"
Exit Sub
End If
If mobjLabel.ForeColor = vbBlue Then
mobjLabel.ForeColor = vbBlack
mobjLabel.Caption = "schwarz"
Exit Sub
End If
End Sub

Friend Property Set prpobjLabel(ByVal objLabel As MSForms.Label)
Set mobjLabel = objLabel
End Property
Bei diesem spreche ich alle Labels auf der Userform an. Sie ändern in diesem Beispiel ihre Farbe also zu blau.
Frage hierzu: Wie müsste ich den Code abändern, damit er nur für Labels im Frame frm_main durchlaufen wird? Die anderen Labels ausserhalb des Frames sind Überschriften, Hinweistexte und ähnliches, die sich bei Klick auf sie nicht ändern sollen.
Hinweis vielleicht noch: der Frame frm_main wird dynamisch erstellt, ist also im Entwurfsmodus nicht vorhanden.
Habt ihr eine Idee zu dem konkreten Problem?
Und für was sind die Klassenmodule generell gedacht? Gerne weitere Infos.
VG Steffen

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Label in Frame ansprechen ohne Event
08.02.2015 12:59:50
Steffen
Achso - muss mich nochmal korrigieren. Auch nicht alle Labels in dem Frame sollen auf den Klick reagieren. Sondern nur Labels mit den Bezeichnungen "lbl_quali" & nr (Laufvariable), "lbl_wissen" & nr (Laufvariable) und andere.
Kann mir da jemand helfen?
Danke und VG Steffen

AW: Label in Frame ansprechen ohne Event
08.02.2015 13:03:34
Steffen
Achso :-)
im Initialize Event der Userform steht noch folgender Code für das Klassenmodul:
Private Sub UserForm_Initialize()
Dim ctrControl As Control
Dim lngIndex As Long
Dim F As MSForms.Frame
Dim CB As MSForms.ComboBox
Dim CMD As MSForms.CommandButton
Dim LAB As MSForms.Label
Set mcolLabels = New Collection
For Each ctrControl In Controls
If TypeOf ctrControl Is MSForms.Label Then
lngIndex = lngIndex + 1
ctrControl.Tag = CStr(lngIndex)
Set mobjLabel = New clsLabel
Set mobjLabel.prpobjLabel = ctrControl
prpcolLabels.Add mobjLabel
End If
Next
End Sub

So - das wars jetzt aber :-)
VG

Anzeige
AW: Label in Frame ansprechen ohne Event
08.02.2015 13:23:48
Daniel
Hi
baue in das Makro zum Umfärben folgende Abfrage am Anfang ein:
if ?.Name Like "lbl_quali*" oder ?.Name like "lbl_wissen*" Then
... hier der weitere Code
End if
für die ? bitte die Entsprechende Objektvariabele einsetzen.
ich kann hier leider deinen Code nicht mehr sehen und bin zu faul zurückzublättern, aber das Prinzip ist hoffentlich klar:
- über den Namen erkennen, ob der Code bei diesem Label ausgeführt werden soll oder nicht.
Gruß Daniel

Klassenmodul Labels in Frame
08.02.2015 13:39:50
Christian
hallo Steffen,
in einem Frame enthaltene Objekte haben das Frame als Parent.
Wenn ich dich richtig verstanden habe, werden die Labels zur Entwurfszeit erzeugt und das Frame zur Laufzeit - das macht aus meiner Sicht keinen Sinn.
Also entweder beides zur Entwurfszeit:
For Each ctrControl In Me.fraMain.Controls
...
oder beides zur Laufzeit (bsp s.u.)
oder das Frame zur Entwurfszeit und die Labels zur Laufzeit.
Bsp (Klassemodul des Userforms):
Option Explicit
Dim colLbl As New Collection
Private Sub UserForm_Initialize()
Dim objCls As clsLabel
Dim cntrFra As Control
Dim cntrLbl As Control
Dim i As Long
Set cntrFra = Me.Controls.Add("Forms.Frame.1", "fraMain")
With cntrFra
.Left = 12
.Top = 12
.Height = 105
.Width = 60
End With
For i = 1 To 5
Set cntrLbl = cntrFra.Controls.Add("Forms.Label.1")
With cntrLbl
.Left = 9
.Top = 15 * i
.Height = 12
.Width = 39
.BackColor = vbRed
End With
Set objCls = New clsLabel
Set objCls.cntrLabel = cntrLbl
colLbl.Add objCls
Next
End Sub
Klassenmodul clsLabel:
Option Explicit
Public WithEvents cntrLabel As MSForms.Label
Private Sub cntrLabel_Click()
With cntrLabel
If .BackColor  vbBlack Then
.BackColor = vbBlack
Else
.BackColor = vbRed
End If
End With
End Sub
Gruß
Christian

Anzeige
AW: Label in Frame ansprechen ohne Event
08.02.2015 14:08:10
Steffen
Hallo ihr beiden. Danke für eure Antworten.
Der Frame UND die Labels werden erst zur Laufzeit generiert. Vorher sind nur die Überschriftslabels da.
Der Ansatz mit der if-Schleife vor dem Ausführen in Verbindung mit dem Like-Befehl war perfekt für meine Zwecke.
Hatte mir schon nen Workaround über die Schriftfarbe reingebastelt. Aber deine Lösung gefällt mir deutlich besser. Danke für deine Zeit.
VG Steffen

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige