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

OOP: Addr. von Objekten auf UF mit mehreren Frames

OOP: Addr. von Objekten auf UF mit mehreren Frames
01.08.2017 12:36:07
Objekten
Hallo VBA-Spezialisten,
ich komme nicht mehr weiter und benötige nochmals eure Unterstützung :-(
Was möchte ich machen?
Ich habe eine UserForm, mit mehreren Zeilen und Zahlen, die ich für eine Auswertung benötige. Organisiert ist das Ganze in Frames. In der ersten Reihe eines jeden Frames stehen die Grenzwerte drin (z. B. 1400). Die Grenzwerte sind editierbar, die Anzeigefelder nur in Sonderfällen (Entscheidung zur Laufzeit). Dies aber nur nebenbei, spielt für meinen konkreten Fall keine Rolle. Zu Testzwecken habe ich hier in einem ersten Schritt einen Grenzwert (1400) hart codiert.
Aktueller Status:
Ich habe ein Objekt auf Basis einer TextBox erstellt (Display_panel). Alle Anzeigefelder haben spezifische, fortlaufende TabIndexe, so dass ich sie jederzeit zuordnen und auswerten kann. Das Ganze wiederholt sich in der gleichen UF für mehrere Frames (innerhalb der Frames haben alle Textfelder die gleiche TabIndex-Struktur). Zur Veranschaulichung hier noch ein Link zu einer leeren Beispieldatei:
https://www.herber.de/bbs/user/115082.xlsm
Aktuell werden mit dem folgenden Code alle Felder auf der UF, die der Case-Anweisung entsprechen farblich markiert. Ich möchte diese Gestaltung aber je Frame (also für SBC-1, SBC-2, etc.) getrennt vornehmen können.
Private Sub UserForm_Initialize()
Dim display_panel As MSForms.Control ' Bibliotheken immer mit angeben!
' display_panel: Anzeigefeld
Dim Test As Frame
Set Test = frm_Kanaele_SBC_1.ActiveControl
For Each display_panel In Controls  '
If TypeOf display_panel Is MSForms.TextBox Then
With Test
Select Case display_panel.TabIndex
Case 11, 12, 13, 14, 15, 16, 17, 18, 19
If display_panel.Value > 22400 Then
display_panel.BackColor = RGB(256, 0, 0)
End If
Case Else
End Select
End With
' Set display_panel.Font = make_font(True, False, 30, "Arial")
Else
' Set display_panel.Font = make_font(False, False, 10, "Arial")
End If
Next display_panel
End Sub
In meinem letzten Versuch (s. o.) habe ich versucht (zunächst einen) Frame über ActiveControl anzusprechen, was aber bei genauerer Betrachtung wohl ziemlicher Blödsinn ist.
Frage:
Wie kann ich Objekte, die sich innerhalb eines Frames auf einer UF befinden adressieren?
Eine 2. Baustelle betrifft den eigentlichen Wertevergleich:
Mein Ziel ist es, den Vergleichswert, der z. B. in der Zeile "Capacity" steht mit dem zugehörenden Wert (gleiche Spalte) in Zeile "real" zu vergleichen. Hierfür plane ich über das Tag zu gehen (gleiche Werte in "Capacity" wie in "real") und einen Schleifenzähler zu implementieren, über den dann ein Vergleich stattfinden kann. Anders ausgedrückt: Vergleiche Wert von "Capacity" (Tag=1) mit Wert "real" (Tag=1). Wenn Wert "real" > "Capacity dann Farbe "Rot". Ich sehe hier aber schon ein Problem, da txtbox-capacity.tag(1).value = txtbox-real.tag(1).value nicht funktionieren wird?! Kann ich das so machen oder habt ihr da bessere weil einfachere Vorschläge?
Wäre toll, wenn ihr eure Antwort mit einer kleinen Erklärung ergänzen könntet, damit ich es auch verstehe ;-)
VG und 1000 Dank für eure Unterstützung
Ingo

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

Betreff
Datum
Anwender
Anzeige
AW: OOP: Addr. von Objekten auf UF mit mehreren Frames
01.08.2017 13:12:01
Objekten
Hallo,
einfach ne Schleife drumherum:
'...
Dim objFrame As MSForms.Frame
For Each objFrame In Controls
For Each display_panel In objFrame.Controls
'...

Gruß, Mullit
AW: OOP: Addr. von Objekten auf UF mit mehreren Frames
01.08.2017 13:26:21
Objekten
Hallo nochmal,
gäbe auch noch die Möglichkeit ohne zweiten Loop:
'...
For Each display_panel In Controls
Select Case display_panel.Parent.Name
Case Is = "Frame1"
Case Is = "Frame2"
Case Is = "Frame3"
End Select
'...

Gruß, Mullit
AW: OOP: Addr. von Objekten auf UF mit mehreren Frames
01.08.2017 14:13:12
Objekten
Hallo Mullit,
vielen Dank für die schnelle Reaktion. Ich bekomme es bei mir nicht zum laufen. Wenn das Makro "Next objFrame" aufrufen möchte kommt die Meldung "Typen unverträglich".
Was mache ich da falsch? Ich habe auch noch nicht wirklich verstanden, was Du da machst :-( Sorry, aber ich bin VBA-Anfänger (sozusagen VBA-DAU ;-) )
Wo findet die Unterscheidung in den einzelnen Frames statt? Ich denke, mit dem 2. Bsp. von Dir (mittels Case-Anweisung) ist das für mich einfacher zu verstehen. "Frame1" ist dann "frm_Kanaele_SBC_1" und "Frame2" "frm_Codec_SBC_1" etc. Richtig? Unter den entsprechenden Case-Zweig müsste dann der eigentliche Formatierungscode kommen. Richtig? Also in den Case-Zweig müsste dann folgendes rein. Richtig?
                    Select Case display_panel.TabIndex
Case 11, 12, 13, 14, 15, 16, 17, 18, 19
If display_panel.Value > 22400 Then
display_panel.BackColor = RGB(256, 0, 0)
End If
Case Else
Könntest Du das vielleicht mal so umschreiben? Und ganz super wäre es, wenn Du da noch etwas erklärendes dazu schreiben könntest (z. B. zur Zeile "display_panel.Parent.Name").
Hier mal der Code mit Schleife - so wie ich es verstanden habe. Ich fürchte aber, das ich mich da irgendwo verhauen habe:
Private Sub UserForm_Initialize()
Dim test As Integer
Dim display_panel As MSForms.Control ' Bibliotheken immer mit angeben!
' display_panel: Anzeigefeld
Dim test_frame As Frame
'neu:
Dim objFrame As MSForms.Frame
Set test_frame = frm_Kanaele_SBC_1.ActiveControl
For Each objFrame In Controls
For Each display_panel In objFrame.Controls
'For Each display_panel In Controls  '
If TypeOf display_panel Is MSForms.TextBox Then
With test_frame
Select Case display_panel.TabIndex
Case 11, 12, 13, 14, 15, 16, 17, 18, 19
If display_panel.Value > 22400 Then
display_panel.BackColor = RGB(256, 0, 0)
End If
Case Else
End Select
End With
' Set display_panel.Font = make_font(True, False, 30, "Arial")
Else
' Set display_panel.Font = make_font(False, False, 10, "Arial")
End If
Next display_panel
'neu:
Next objFrame
End Sub
Vielen Dank und Grüße
Ingo
Anzeige
AW: OOP: Addr. von Objekten auf UF mit mehreren Frames
01.08.2017 15:16:05
Objekten
Hallo,
uhh ja das war crap von mir, die einzelnen Frames kann man in der Controls-Collection nicht direkt abfragen, daher der Fehler, aber wir haben ja die zweite Variante, Du unterscheidest die Frames mit .Parent.Name und in den einzelnen Cases fragst Du bspw. nochmal mit Select Case auf den .TabIndex oder .Value ab...
Gruß, Mullit
Suuupi, Teil-1 ist OK!
01.08.2017 15:53:38
Ingo
Hallo Mullit,
Du bist mein Held! Die erste Baustelle funktioniert!!!
Hast Du noch eine Idee, wie ich Teil 2 meiner Anfrage angehen kann?
Hier noch einmal der Text:
Eine 2. Baustelle betrifft den eigentlichen Wertevergleich:
Mein Ziel ist es, den Vergleichswert, der z. B. in der Zeile "Capacity" steht mit dem zugehörenden Wert (gleiche Spalte) in Zeile "real" zu vergleichen. Hierfür plane ich über das Tag zu gehen (gleiche Werte in "Capacity" wie in "real") und einen Schleifenzähler zu implementieren, über den dann ein Vergleich stattfinden kann. Anders ausgedrückt: Vergleiche Wert von "Capacity" (Tag=1) mit Wert "real" (Tag=1). Wenn Wert "real" > "Capacity dann Farbe "Rot". Ich sehe hier aber schon ein Problem, da txtbox-capacity.tag(1).value = txtbox-real.tag(1).value nicht funktionieren wird?! Kann ich das so machen oder habt ihr da bessere weil einfachere Vorschläge?
VG und noch einmal besten Dank für Teil-1. Das war eine riesen Unterstützung :-)
Ingo
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige