Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1096to1100
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
Objekte in Schichten-Reihenfolge aus UserForm
Andreas
Hallo Herber Fans,
Ich versuche mich schon seit einiger Zeit leider erfolglos, Objekte einer UserForm, in diesem Falle Frames auch als Objekt in ein Array einzulesen. Hintergrund der ganzen Aufgabe ist, daß ich mit der Zeit immer mehr und komplexere UserForms erstellt habe, und ich das Layouting dieser UserForms über einen Code vereinheitlichen möchte. Da ein Frame in der Regel weitere Steuerelemente aufnimmt, muß ein Frame in seinen Parametern Top und Height immer vor der UserForm eingerichtet werden. Wenn ein Frame wiederum auf einem Frame liegt dann muß der zweite Frame, vor dem ersten Frame bearbeitet werden, usw. Ergo: Ich will die Schichten einer UserForm feststellen. Ich will in einer flexiblen Schleife feststellen, wie viele Schichten auf einer UserForm liegen und diese mit der höchsten Schachtelung beginnend abarbeiten.
Ich habe einmal eine Beispiel UserForm erstellt, um das Problem zu erläutern.
Es gibt zwei Frames, die direkt auf der UserForm liegen. „Layer 1“ hat als „Child“ „Layer 2“, dieser wiederum als Child „Layer 3“. Dann kommt noch einmal „Layer 01“ direkt auf der UF, dieser hat nur ein Child „Layer 02“.
Ich möchte nun alle Controls der UF durchloopen, wenn festgestellt wird, daß ein Child existiert, soll geprüft werden, ob dieses Child wiederum Childs hat. Am Ende möchte ich für das Beispiel von „oben“ kommend alle Namen auflisten, bis ich wieder bei der UF als „Mutter“ aller Frames angekommen bin.
Die Reihenfolge (Ausgabe des Namens, z.B. über Debug.Print) wenn ich alle Frames direkt von der UserForm durchloopen lasse, ist:
UserForm
Layer 1
Layer 2
Layer 3
Layer 01
Layer 02
Die Reihenfolge für die Betrachtungsweise „von oben kommend“ muß aber sein:
Layer 3
Layer 2
Layer 02
Layer 1
Layer 01
UserForm
Mit dieser Reihenfolge kann ich den Code für die Einrichtung aller controls und ihrer ChildItems auf der UserForm beginnen.
Ich habe schon an Collections gedacht, da diese meines Wissens nach Objekte gut aufnehmen können. Also steht als Wissensgewinn auch die generelle Frage im Raum, warum kann eine Collection ein Objekt aufnehmen, ein Array aber nicht? Oder habe ich, was ich vermute, in der Deklaration der Komponenten einen Fehler gemacht.
Und 2. Wie kann ich die Schichtung korrekt abbilden. Es fehlt mir der logisch stringente Gedankendurchbruch. Es hat mich gestern bis 23:30 Uhr beschäftigt, aber auch über Nacht kam keine zündende Idee.
Ich würde mich sehr freuen, wenn jemand von Euch mal einen Blick darauf werfen kann.
https://www.herber.de/bbs/user/64146.xls
Euch allen noch einen guten Start in den Tag!
Viele Grüße, Andreas Hanisch

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

Betreff
Benutzer
Anzeige
AW: Objekte in Schichten-Reihenfolge aus UserForm
01.09.2009 10:50:41
Klaus-Dieter
Hallo Andreas,
willst du uns verklapsen? Was bringt denn der Blick auf eine leere Datei und ein Userform ohne Objekte?
Viele Grüße Klaus-Dieter

Online-Excel
AW: Objekte in Schichten-Reihenfolge aus UserForm
01.09.2009 10:54:16
Andreas
Hallo Klaus Dieter,
auf keinen Fall. Im VBA Editor liegt die UserForm1 und in dieser ist der Code hinterlegt "on initialize".
Grüße, Andreas
AW: Objekte in UserForm Listen
04.09.2009 14:40:51
fcs
Hallo Andreas,
die Basis Lösung hast du ja schon (korrete Deklaration und Zuweisung der Objekte).
Hier dann noch ein Beispiel, wie du alle Steuerelemente eines Userforms in ein Array packst und dann weitere Informationen ausliest.
In meinem Beispiel werden die Infos in ein Tabellenblatt geschrieben.
Die Parent.Name- und Name-Info zeigt, welche Steuerelemente in anderen Elementen (Frames eingebettet sind).
Gruß
Franz
Option Explicit
'Erstellt unter Excel 2007 / Windows Vista
'Autor: fcs
'Erstellt 2009-09-03
Sub aa_Userform1_Infos()
Call UF_Objekte_Auswerten(UserForm:=UserForm1, wksAusgabe:=ActiveSheet, _
bolNewSheet:=False)
End Sub
'Prozedur im Allgemeinem-Modul
'ggf. aufrufen am Ende der Userform-Initialisierungs-Prozedur per: _
Call UF_Objekte_Auswerten(Me)
Sub UF_Objekte_Auswerten(UserForm, Optional wksAusgabe As Worksheet, _
Optional bolNewSheet As Boolean = True)
'Userform muss der Codename eines Userforms sein !!
Dim arrObjects() As Control, i As Long, wks As Worksheet
Dim Zeile As Long, Spalte As Long
On Error GoTo Fehler
'Auslesen der verschiedenen Layer_via Array (Fehler!)_START
With UserForm
ReDim Preserve arrObjects(0 To .Controls.Count - 1)
For i = 0 To UBound(arrObjects)
Set arrObjects(i) = .Controls(i)
Next i
End With
If bolNewSheet = True Then
Set wks = Worksheets.Add
Else
If wksAusgabe Is Nothing Then
Set wks = ActiveSheet
Else
Set wks = wksAusgabe
End If
wks.UsedRange.ClearContents
End If
With wks
Zeile = 1: Spalte = 0
'Infos zum Userform
Spalte = Spalte + 1: '.Cells(Zeile, Spalte) = i 'Controls-Item-Nr
Spalte = Spalte + 1: '.Cells(Zeile, Spalte) = arrObjects(i).Parent.Name
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = UserForm.Name
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = UserForm.Caption
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = UserForm.Top
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = UserForm.Left
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = UserForm.Width
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = UserForm.Height
Spalte = Spalte + 1: '.Cells(Zeile, Spalte) = UserForm.TabIndex
Spalte = Spalte + 1: '.Cells(Zeile, Spalte) = arrObjects(i).Object.GroupName
Spalte = Spalte + 1: '.Cells(Zeile, Spalte) = arrObjects(i).Object.Value
'Spaltentitel
Zeile = Zeile + 1: Spalte = 0
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Item"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Parent.Name"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Name"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Object.Caption"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Top"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Left"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Width"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Height"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "TabIndex"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Object.GroupName"
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = "Object.Value"
'Infos zu den Steuerelementen im Userform
For i = LBound(arrObjects) To UBound(arrObjects)
Zeile = Zeile + 1: Spalte = 0
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = i 'Controls-Item-Nr
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Parent.Name
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Name
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Object.Caption
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Top
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Left
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Width
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Height
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).TabIndex
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Object.GroupName
Spalte = Spalte + 1: .Cells(Zeile, Spalte) = arrObjects(i).Object.Value
Next
Columns.AutoFit
Range("A3").Select
ActiveWindow.FreezePanes = True
End With
Fehler:
With Err
If .Number  0 Then
Select Case .Number
Case 438, 394 'Automatisierungs-Fehler 440, Eigenschaft/Methode gibt es _
für das Steuerelement nicht
If wks Is Nothing Then
MsgBox "Fehler-Nr. 438" & vbLf _
& "Methode kann mit dem Objekt nicht ausgeführt werden" & vbLf & .HelpContext
Else
ActiveSheet.Cells(Zeile, Spalte) = "#NV"
Resume Next
End If
Case Else
MsgBox "Fehler-Nr. " & .Number & vbLf & .Description & .vbLf & .HelpContext
End Select
End If
End With
End Sub

Anzeige
AW: Objekte in UserForm Listen
04.09.2009 16:00:10
Andreas
Hallo Franz,
schön von Dir zu lesen. Ich dachte schon, es antwortet keiner mehr. Dein Code ist sehr interessant. Durch erweitertes Wissen im Handling von Objekten in Arrays und Collections konnte ich gestern in einem langen Programmierexzess auch die Lösung für mein Problem herbeiführen. Die UF wird durchgelooped, und in der nächsten Schleifeniteration werden nur die zuletzt gesammelten Objekte bearbeitet, deren Controls.Parent Angaben müssen immer mit der .name Angabe des aktiven Objektes in der Schleife übereinstimmen, so ist sichergestellt, daß nur Controls auf dem nächsthöheren Objekt eingesammelt werden. Der Weg dorthin war tricky, die Lösung sieht nun aber so einfach aus... wie so oft vermutlich. Egal.
Habe Dank für Deine Rückmeldung und Deinen Einsatz im Forum.
Schönes Wochenende.
Viele Grüße, Andreas
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige