Anzeige
Archiv - Navigation
1252to1256
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

Schleife für Controls über Zugriff auf Tabelle

Schleife für Controls über Zugriff auf Tabelle
tco99
Hallo zusammen,
ich brauche Hilfe dabei, eine Schleife zu bauen.
Ich habe dazu eine ganz gute Beispielmappe gemacht.
https://www.herber.de/bbs/user/79180.xls
Hier die Erläuterung zu dem was ich nicht hinbekomme.
In der Beispielmappe
--------------------------------------------------------------------------------------------------------------------
- Eine Userfom enthält eine Multipage und ein Button.
- Eine Seite der Multipage besitzt noch mal eine Multipage.
- 10 Checkboxen sind verteilt auf der Userform, jeweils 2 Checkboxen je Multipage-Seite.
- die Checkboxen sollen unterschiedliche Eigenschaften bekommen, je nach Inhalt der jeweiligen Zelle.
- Die Eigenschaften werden in einer Tabelle über eine Zahl gesteuert.
- Beim Klick auf den Button sollen den Checkboxen die Eigenschaften zugewiesen werden.
--------------------------------------------------------------------------------------------------------------------
Bei der hohen Zahl an Checkboxen (ca. 700) in meiner eigentlichen Datei ist das Schreiben des Codes in folgender Form viel zu viel für mich und sicher nicht die eleganteste Lösung:
Sub EigenschaftenDerCheckBoxen
Dim WS As Worksheet
Set WS = Worksheets("SheetXY")
If WS.Range("G3") = "0" Then
Userform.Checkbox1.Value = False
Userform.Checkbox1.Visible = False
Else
End If
End Sub
Wie kann man das in einer Schleife oder Ähnlichem realisieren?
Sowas wie einen Gruppennamen kann ich den CheckBoxen zuweisen wenn das nützlich sein sollte.
Und noch eine Frage: wie deklariert man Controls oder Userformen (ähnlich Dim WS as Worksheet)?
Dank und Gruß
Erdogan.
PS: Feedback ist selbstverständlich!
AW: Schleife für Controls über Zugriff auf Tabelle
03.03.2012 08:39:35
fcs
Hallo Erdogan,
hier ein Code-Vorschlag für die Zuweisung der Eigenschaften der Checkboxen.
Bei ggf. 700 Checkboxen in der Userform solltest du die Namen der Checkboxen ggf. etwas strukturieren, z.B. pro Page zählen - also P01_chkbox1, P01_chkbox2, P011_chkbox1, P012_chkbox2, P02_chkbox1, P02_chkbox2 usw.
Das ist zwar etwas mühseliger bei der Erstellung des Userforms (Umbenennen der Sterelemente), aber du verlierst sonst komplett den Überblick.
Ein Beispiel für die Deklaration von Controls findest du im Code. Man muss aber sehr genau darauf achten, das beim Zuweisen der Objekte die Typen passen. Oft ist es einfacher, eine Variable als Control zu deklarieren. Damit können allgemeine Control-Eigenschaften zugewiesen/abgefragt werden. Spezifische Eigenschaften, die nicht jedes Control hat, müssen dann über das zugehörige Objekt zugewiesen/abgefragt werden werden.
Beispiel:
Private Sub UserForm_Click()
Dim objControl As Control, objFormat As ControlFormat
For Each objControl In Me.Controls
With objControl
.Visible = True
With .Object
Select Case LCase(TypeName(objControl))
Case "checkbox"
.Enabled = True
.Value = False
.Locked = False
End Select
End With
End With
Next objControl
End Sub

Objektvariablen als MSForms.Userform zu deklarieren bringt meist nicht so viel.
Innerhalb eines Userform-Code-Moduls kann man die Sytemvariable Me verwenden, um auf das Userform zu verweisen.
In anderen Codemodulen ist es am einfachsten, direkt den Userformnamen zu verwenden.
Gruß
Franz
'Erstellt unter Excel 2007
Private Sub CommandButton1_Click()
'Hier sollte das Makro starten
Call EigenSchaftenEinlesen
End Sub
Private Sub EigenSchaftenEinlesen()
Dim wks As Worksheet, Zelle As Range
Dim objCheckbox As MSForms.CheckBox
On Error GoTo Fehler
Set wks = Worksheets("Tabelle1")
With wks
For Each Zelle In .Range(.Cells(3, 2), .Cells(.Rows.Count, 2).End(xlUp))
Set objCheckbox = Me.Controls(Zelle.Text)
With objCheckbox
Select Case Zelle.Offset(0, 1).Value
Case 0
.Visible = True
.Locked = True
.Value = True
Case 1
.Visible = True
.Locked = True
.Value = False
Case 2
.Visible = False
.Locked = False
.Value = False
End Select
End With
Resume01:
Next
End With
Fehler:
'Fehlerbehandlung
With Err
Select Case .Number
Case 0 'kein Fehler
Case -2147024809
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description & vbLf & vbLf _
& "Steuerelement mit Name """ & Zelle.Text & """ existiert nicht!", _
vbInformation + vbOKOnly, "Eigenschaften einlesen"
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub

Anzeige
AW: Schleife für Controls über Zugriff auf Tabelle
03.03.2012 13:15:48
tco99
Hallo Matthias,
vielen Dank für deine ausführliche Antwort.
Das "Me" nutze ich, finde es auch praktisch. Wollte die Userform deklarieren weil ich dann das Makro in ein allgemeines Modul auslagern und bei Bedarf für mehrere Userformen nutzen könnte.
Mein Feedback wird wahrscheinlich noch dieses Wochenende kommen.
Viele Grüße und schönes Wochenende.
Erdogan
AW: Schleife für Controls über Zugriff auf Tabelle
03.03.2012 14:03:59
Hajo_Zi
Hallo erdogan,
warum Deklarieren. Schreibe im Modul einefach UserForm1.Textbox1=123
Ich habe jetzt mal vermutet das dies offen ist?

Anzeige
AW: Schleife für Controls über Zugriff auf Tabelle
03.03.2012 15:28:57
tco99
Hi Hajo,
weiß (immernoch!) nicht ob ich allen Antwortern einzeln antworten muss, daher antworte ich allen nur kurz :-)
Es gibt Makros die mehr als auf nur eine Userform angewendet werden könnten, daher wollte ich den Code variabel halten.
Gruß
Erdogan
AW: Schleife für Controls über Zugriff auf Tabelle
03.03.2012 16:02:12
tco99
Hallo Franz,
der Code funktioniert sehr gut. Die Fehlerbehandlung ebenfalls. Habe ein Control entfernt und prompt den Hinweis in der MsgBox bekommen.
Userbild
Da ich jetzt zwei sehr gut funktionierende Codes habe, stehe ich vor der Wahl. Erlaubt mir bitte, mich später zu entscheiden, welchen Code ich nehmen soll.
Wirklich herzlichen Dank für deine Hilfe!
Dass mit den allgemeinen und speziell für bestimmte Controls gegebene Eigenschaften verstehe ich. Was ich aber nicht zu nutzen weiß, ist die Eigenschaft "Groupname". Was kann ich sinnvolles damit anfangen?
Und wie kann ich eine Variable deklarieren und ihr einen Wert zuweisen, der dann für die ganze Laufzeit des Programmes gilt?
Ich weiß bereits dass es in ein Standardmodul kommt und mit "Public" beginnt und das ich die Art der Varaible definieren muss aber es hat nicht geklappt.
Z.B habe ich folgendes gemacht:
In einem Allgemeinen Modul
Public Kennwort as String
Kennwort = Userform.TextBoxKennwort.Value
Dann habe ich auf diese Variable zurückgegriffen aber keinen Wert für die Varaible bekommen obwohl ich natürlich vorher in der Textbox erst einen Wert eingetragen und dann die Zuweisung über Kennwort = Userform.TextBoxKennwort.Value vorgenommen habe.
Wenn du keine Zeit zu antworten hast, ist nicht schlimm, es gibt in meiner Datei größere Probleme, die ich noch vorher lösen muss.
Viele Grüße
Erdogan
Anzeige
AW: Schleife für Controls über Zugriff auf Tabelle
03.03.2012 17:32:08
fcs
Hallo Erdogan,
Groupname:
Diese Eigenschaft ist nützlich, wenn man Options-Schaltflächen zu einer Schaltgruppe zusammenlegen will. Die Vergabe des gleichen Groupname für mehrere Options-Schaltflächen hat den gleichen Effekt als ob man diese Options-Schaltflächen in einem Frame (Rahmen) plaziert.
Groüpname hat aber einige Vorteile - siehe Excel-VBA-Hilfe zu Groupname.
Variable für projektweite Verwendung:
Die Deklaration als Public in einem allgemeinen Modul is so korrekt.
Die Zuweisung des Wertes aus einer Userform-Textbox muss jedoch erfolgen, bevor das Userform geschlossen wird (Userform Unload, Alt+F4 oder Schließen-Kreuz des Userforms anklicken).
Verwendung von als Userform deklarierten Variablen.
Dim objUF as MSForms.Userform
Das Problem ist, dass man nicht alle Methoden und Eigenschaften verwenden/anpassen kann, die direkt mit dem Userform-Codenamen möglich sind.
Gruß
Franz
Anzeige
AW: Schleife für Controls über Zugriff auf Tabelle
03.03.2012 21:46:01
tco99
Hallo Franz,
dass mit Groupname verstehe ich jetzt :-) Ich kann dann in Zukunft bei z.B OptionsButtons auf die Verwendung von Rahmen verzichten.
Und von der Idee der Deklaration der Userformen nehme ich jetzt auch Abstand.
OK, dass mit der projektweiten Deklaration versuche ich nochmal. Wahrscheinlich habe ich mich bei der Zuweisung des Wertes auf eine Userform bezogen die zu dieser Zeit nicht geladen war. Ja, so muss es wohl gewesen sein.
Vielen Dank, Franz!
Schleife über Controls ("CheckBox") ...
03.03.2012 08:48:28
Matthias
Hallo
Im Tabellebereich habe ich einen Namen definiert!
ControlName Bereich(B3:B12) musst Du später anpassen
Ich bin davon ausgegangen, das wirklich die exakten Bezeichnungen der Controls
im Tabellenblatt stehen (so wie Du es gepostet hast).
Hab noch ein Button eingefügt um alle Checkbox-Elemente wieder auf Default zu stellen.
Hier der Code:
Option Explicit
Private Sub CommandButton1_Click()
Dim C As Range, MyControl As Object
For Each C In Range("ControlName")
Set MyControl = UserForm.Controls(C.Value)
'MsgBox C & vbLf & "SteuerCode: " & C.Offset(, 1)
Select Case C.Offset(, 1).Value
Case Is = 0
MyControl.Value = True
MyControl.Locked = MyControl.Value
MyControl.Visible = MyControl.Value
Case Is = 1
MyControl.Value = False
MyControl.Locked = Not MyControl.Value
MyControl.Visible = Not MyControl.Value
Case Is = 2
MyControl.Value = False
MyControl.Locked = MyControl.Value
MyControl.Visible = MyControl.Value
End Select
Set MyControl = Nothing
Next
End Sub
Private Sub CommandButton2_Click()
Dim ctrl As Control
For Each ctrl In UserForm.Controls
If TypeName(ctrl) = "CheckBox" Then
With ctrl
.Visible = True
.Value = False
.Locked = .Value
End With
End If
Next
End Sub


Hier die Datei:
https://www.herber.de/bbs/user/79182.xls
Wichtig !!!
Es muss noch eine Fehlerbehandlung eingebaut werden !!
(für den Fall das ein ungültiger Name eines Objektes im Bereich steht)
schö.WE.
Gruß Matthias
Anzeige
AW: Schleife über Controls ("CheckBox") ...
03.03.2012 13:11:39
tco99
Hallo Matthias,
vielen Dank für deine ausführliche Antwort.
Ich muss die Antwort erst umsetzen versuchen, dann schreibe ich mein Feedback wie es geklappt hat.
Das wird wahrscheinlich noch heute dieses Wochenende sein :-)
Viele Grüße und schönes Wochenende.
Erdogan
AW: Schleife über Controls ("CheckBox") ...
03.03.2012 15:38:26
tco99
Hallo Matthias,
der Code funktioniert eigentlich super gut aber das "Not" funktionierte nicht.
MyControl.Visible = Not MyControl.Value
Ich habe mir geholfen indem ich die Eigeschaft "händisch" gesetzt habe:
MyControl.Visible = False
und dann war alles gut.
Dein Code hilft mir jetzt sehr, auch bei der Eigenschaft Caption der Controls, also die Bennenung für die Ansicht der Controls erledige ich damit wunderbar! :-)
Für alle, die es nutzen möchten:
Sub BeschriftungenSetzen()
Dim C As Range, MyControl As Object
For Each C In Range("Controls.Montage.Dokumente.Dokumentennamen")
Set MyControl = Dokumente.Controls(C.Value)
'     MsgBox C & vbLf & "SteuerCode: " & C.Offset(, -4)
Select Case C.Offset(, -4).Value
Case Is = ""
MyControl.Caption = ""
Case Is  ""
MyControl.Caption = C.Offset(, -4) & "." & C.Offset(, -3)
End Select
Set MyControl = Nothing
Next
End Sub
Eine Fehlerbehandlung habe ich noch nicht vorgenommen aber das werde ich noch tun.
Wirklich herzlichen Dank!
Gruß
Erdogan
Anzeige
das "Not" funktioniert doch ... mit Erklärung
03.03.2012 17:54:24
Matthias
Hallo
Dann weiß ich nicht was Du anders machst als ich.
Hier eine weiterentwickelte Variante, in der Du das alles schön nachvollziehen kannst.
Bitte nach dem Laden des Formulars die Combobox öffnen und z.B. Checkbox2 auswählen.
Also irgendeine Checkbox, deren SteuerCode(1) ist.
Du solltest nun das hier sehen:
Bild1
Userbild


Nach dem Klick auf Eigenschaften zuweisen wählst Du bitte wieder Checkbox2 in der Combobox aus
Du solltest nun das hier sehen:
Bild2
Userbild
Du siehst also jetzt (und auch funktionierend!)
Locked & Visible sind genau das Gegenteil von Value (also Not .Value)
Hier die Datei mit der erweitereten Darstellung zum Lernen, Testen oder Spielen ;o)
https://www.herber.de/bbs/user/79189.xls
Gruß Matthias
Anzeige
AW: das "Not" funktioniert doch ... mit Erklärung
03.03.2012 21:41:03
tco99
Hallo Matthias,
es ehrt mich dass du dir so viel Mühe gemacht hast, danke schön!
Ich werde deine Datei gut aufbewahren.
Ja, richtig, es funktioniert auch in der Beispielmappe aber in meiner eigentlichen Datei hatte es nicht geklappt. Ich muss im Code in meiner eigentlichen Datei nach dem Grund suchen. Der Fehler muss ja bei mir liegen.
Viele Grüße und schönes Wochenende.
Erdogan

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige