Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Schleife für Controls über Zugriff auf Tabelle

Forumthread: 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!
Anzeige
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
Anzeige
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?

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
Anzeige
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!
Anzeige
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
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Schleife für Controls über Zugriff auf Tabelle


Schritt-für-Schritt-Anleitung

  1. Userform erstellen: Erstelle eine Userform mit verschiedenen Controls, wie CheckBoxen, und einer Multipage.

  2. Controls benennen: Achte darauf, dass deine Controls eine klare Namensstruktur haben (z.B. P01_chkbox1, P01_chkbox2), um die spätere Bearbeitung zu erleichtern.

  3. VBA-Editor öffnen: Öffne den VBA-Editor (Alt + F11) und füge ein neues Modul hinzu.

  4. Code einfügen: Verwende den folgenden Beispielcode, um eine Schleife für die Zuweisung von Eigenschaften zu den Controls zu erstellen:

    Private Sub CommandButton1_Click()
       Dim objControl As Control
       For Each objControl In Me.Controls
           With objControl
               If TypeName(objControl) = "CheckBox" Then
                   .Visible = True
                   .Value = False
                   .Locked = False
               End If
           End With
       Next objControl
    End Sub
  5. Fehlerbehandlung hinzufügen: Stelle sicher, dass du eine Fehlerbehandlung implementierst, um mit ungültigen Control-Namen umzugehen.


Häufige Fehler und Lösungen

  • Control nicht gefunden: Wenn du den Fehler erhältst, dass ein Control nicht existiert, überprüfe die Schreibweise der Control-Namen in deinem Excel-Blatt. Diese müssen exakt mit den Namen in der Userform übereinstimmen.

  • Fehler bei der Sichtbarkeit: Wenn die Sichtbarkeit von Controls nicht funktioniert, stelle sicher, dass du die richtige Logik verwendest. Beispielweise könnte MyControl.Visible = Not MyControl.Value nicht wie erwartet funktionieren. Setze die Sichtbarkeit manuell:

    MyControl.Visible = False

Alternative Methoden

  • Verwendung von Arrays: Du kannst auch Arrays nutzen, um die Eigenschaften der Controls zu steuern. Dies kann besonders nützlich sein, wenn du eine große Anzahl an Controls verwalten musst.

  • Datenbankanbindung: Anstatt Werte in einer Tabelle zu speichern, kannst du auch eine Datenbankanbindung in Betracht ziehen, um die Eigenschaften deiner Controls zu steuern.


Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung von me.controls in deiner Userform:

  • Checkboxen zurücksetzen:

    Private Sub CommandButton2_Click()
       Dim ctrl As Control
       For Each ctrl In Me.Controls
           If TypeName(ctrl) = "CheckBox" Then
               ctrl.Value = False
               ctrl.Visible = True
           End If
       Next ctrl
    End Sub
  • Eigenschaften von CheckBoxen setzen:

    Private Sub SetCheckboxProperties()
       Dim C As Range, MyControl As Object
       For Each C In Range("ControlName") ' Stelle sicher, dass dieser Bereich definiert ist
           Set MyControl = Me.Controls(C.Value)
           Select Case C.Offset(, 1).Value
               Case 0
                   MyControl.Visible = True
                   MyControl.Value = True
               Case 1
                   MyControl.Visible = True
                   MyControl.Value = False
               Case 2
                   MyControl.Visible = False
           End Select
       Next C
    End Sub

Tipps für Profis

  • Verwendung von me.controls: Das me.controls-Objekt ermöglicht es dir, einfach auf alle Controls innerhalb der aktuellen Userform zuzugreifen. Dies macht deinen Code flexibler und übersichtlicher.

  • Public Variablen: Wenn du Variablen in einem allgemeinen Modul deklarierst, stelle sicher, dass du sie mit Public kennzeichnest, damit sie im gesamten Projekt zugänglich sind.

  • Naming Convention: Halte dich an eine konsistente Namenskonvention für deine Controls, um die Wartbarkeit deines Codes zu verbessern.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass alle Controls sichtbar sind? Du kannst eine Schleife über me.controls verwenden, um die Sichtbarkeit aller Controls auf True zu setzen.

2. Was ist der Vorteil von me.controls? me.controls ermöglicht es dir, dynamisch auf alle Controls innerhalb einer Userform zuzugreifen, was den Code flexibler macht.

3. Wie kann ich eine Variable für die gesamte Laufzeit des Programms deklarieren? Verwende Public in einem allgemeinen Modul. Beispiel:

Public Kennwort As String
Kennwort = Userform.TextBoxKennwort.Value

4. Warum funktioniert mein Not-Befehl nicht wie erwartet? Überprüfe, ob der Wert des Controls zum Zeitpunkt der Ausführung korrekt gesetzt ist. Es kann hilfreich sein, die Logik manuell zu prüfen und die Sichtbarkeit direkt zu setzen.

5. Wie kann ich eine Fehlerbehandlung in meinen Code einfügen? Nutze On Error GoTo, um Fehler abzufangen und entsprechende Meldungen anzuzeigen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige