Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Dynamisch erstellte Checkboxen auswerten

Dynamisch erstellte Checkboxen auswerten
26.06.2014 10:13:53
Erik
Liebe Gemeinde,
ich habe eine Frage und hoffe, dass ein Auserkorener oder eine Auserkorene mit diese Frage beantworten kann. :)
Die Ausgangslage:
Ich lasse ein dynamisch varierende Zahl von Checkboxen auf einem Userform, dort auf einer Multipage, erzeugen.

Dim CountRows, i As Integer
Dim formCheckBox As MSForms.Checkbox
CountRows = WorksheetFunction.CountA(Sheets("Einstellungen").Range("A1:A100"))
Me.MultiPage1.Pages("Page4").ScrollHeight = 30 + CountRows * 20
For i = 0 To CountRows - 1
Set formCheckBox = Me.MultiPage1.Pages("Page4").Controls.Add("Forms.Checkbox.1")
With formCheckBox
.Name = "CbSetting" & i
.Width = 210
.Height = 18
.Left = 5
.Top = 30 + i * 20
.BackStyle = 0
.WordWrap = False
.Caption = Sheets("Einstellungen").Range("A" & i + 1).Value
.Value = Sheets("Einstellungen").Range("B" & i + 1).Value
End With
Next i

Das funktioniert hervorragend.
Das Problem:
Ich möchte nun gern die Werte dieser Checkboxen abfragen. Folgender Versuch wirft mir die Fehlermeldung "Typen unverträglich" aus.

Dim optval As String
CountRows = WorksheetFunction.CountA(Sheets("Einstellungen").Range("A1:A100"))
Set formCheckBox = Me.MultiPage1.Pages("Page4")
For i = 1 To CountRows
optval = formCheckBox.Controls("CbSetting" & i).Value
Debug.Print optval
Next i
Ich vermute, dass ich die Multipage bzw. die darauf befindlichen Checkboxen nicht richtig anspreche...
Ich bedanke mich schonmal für's Lesen und für die Hilfe.
Gruß
Erik

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dynamisch erstellte Checkboxen auswerten
26.06.2014 10:37:33
Daniel
Hi
Wenn du die Checkboxen sowieso direkt untereinander anordnet, warum machst du dann keine Multiselect-Listbox daraus?
Das ist einfacher zu aprogrammieren weil du unabhängig von der Anzahl der Optionen nur ein Steuerelement hast und durch die zwei Multiselectmodi wird's auch für den Anwender komfortabler.
Gruß Daniel

Anzeige
AW: Dynamisch erstellte Checkboxen auswerten
26.06.2014 11:00:01
Rudi
Hallo,
dynamisch erstellte Controls kannst du nicht über den Namen ansprechen.
 Dim cnt As Object
For Each cnt In MultiPage1.Pages("Page4").Controls
If TypeName(cnt) = "CheckBox" Then
If cnt.Name Like "CbSetting*" Then
Debug.Print cnt.Name, cnt.Value
End If
End If
Next

Gruß
Rudi

Anzeige
AW: Dynamisch erstellte Checkboxen auswerten
26.06.2014 11:09:05
Mullit
Hallo,
Du hast im ersten Teil
Dim formCheckBox As MSForms.Checkbox
als CheckBox deklariert, im zweiten Teil
Dim optval As String
CountRows = WorksheetFunction.CountA(Sheets("Einstellungen").Range("A1:A100"))
Set formCheckBox = Me.MultiPage1.Pages("Page4")
For i = 1 To CountRows
optval = formCheckBox.Controls("CbSetting" & i).Value
Debug.Print optval
Next i

der Variablen eine Page zugewiesen....
Gruß,

Anzeige
das ist doch Wurscht
26.06.2014 11:28:58
Rudi
Hallo,
die gleiche Variable(nbezeichnung) in unterschiedlichen Prozeduren mit unterschiedlichen Typen zu deklarieren ist syntaktisch kein Problem.
Man kann schlichtweg zur Laufzeit erstellte Controls nicht über den Namen ansprechen.
Eine Möglichkeit wäre noch, die Controls einer Collection zuzuweisen.
Mal ganz einfach:
Option Explicit
Dim oCol As New Collection
Private Sub UserForm_Initialize()
Dim CountRows, i As Integer
Dim formCheckBox As MSForms.CheckBox
CountRows = 5
With MultiPage1.Pages("Page4")
.ScrollHeight = 30 + CountRows * 20
For i = 1 To CountRows
Set formCheckBox = .Controls.Add("Forms.Checkbox.1")
With formCheckBox
.Name = "CbSetting" & i
.Width = 210
.Height = 18
.Left = 5
.Top = 30 + i * 20
.BackStyle = 0
.WordWrap = False
.Caption = "Test " & i
End With
oCol.Add formCheckBox, formCheckBox.Name
Next i
End With
End Sub
Private Sub CommandButton1_Click()
Dim i As Integer
For i = 1 To oCol.Count
Debug.Print oCol("CbSetting" & i).Value
Next
End Sub

Gruß
Rudi

Anzeige
AW: das ist doch Wurscht
26.06.2014 11:42:34
Mullit
Hallo,
Man kann schlichtweg zur Laufzeit erstellte Controls nicht über den Namen ansprechen.
wo hast Du das denn her?
Sowas läuft bei mir 'wie geschnitten Brot':
Option Explicit
Private Sub CommandButton1_Click()
MsgBox Me.Controls("CbSetting1").Value
End Sub
Private Sub UserForm_Initialize()
Dim formCheckBox As MSForms.CheckBox
Set formCheckBox = Controls.Add("Forms.Checkbox.1")
With formCheckBox
.Name = "CbSetting" & 1
.Width = 30
.Height = 18
.Left = 5
.Top = 20
End With
End Sub
mit unterschiedlichen Typen zu deklarieren

Ich sehe in dem Code nur die CheckBox-Deklaration....
Gruß,

Anzeige
AW: das ist doch Wurscht
26.06.2014 11:49:37
Erik
Hallo ihr Guten,
ich habe mich für den Tipp von Daniel entschieden und die Variante einer Multiselect-Listbox gewählt.
Ein Problem habe ich jedoch noch. Ich habe die Listenoptionen so gewählt, dass der/die Anwender/-in gezielt Einträge anhaken und abhaken kann.
Wie lese ich nun aus, ob ein Eintrag true (angehakt) oder false (nicht angehakt) ist?
So erstelle ich die Listbox, funktioniert auch wunderbar.

CountRows = WorksheetFunction.CountA(Sheets("Einstellungen").Range("A1:A100"))
For i = 0 To CountRows - 1
Set formListBox = Me.MultiPage1.Pages("Page4").Controls("LBSettings")
With formListBox
.AddItem Sheets("Einstellungen").Range("A" & i + 1).Value
.Selected(i) = Sheets("Einstellungen").Range("B" & i + 1).Value
End With
Next i
Mit folgenedem Code versuche ich die Zustände abzufragen und in einer Spalte zu speichern:

CountRows = WorksheetFunction.CountA(Sheets("Einstellungen").Range("A1:A100"))
For i = 0 To CountRows - 1
Sheets("Einstellungen").Range("B" & i + 1).Value = LBSettings.List(i).Selected
Next i

Die Fehlermeldung lautet: "Objekt erforderlich". Ich habe schon versucht, diese Deklaration zu verwenden:

Set formListBox = Me.MultiPage1.Pages("Page4").Controls("LBSettings")
CountRows = WorksheetFunction.CountA(Sheets("Einstellungen").Range("A1:A100"))
For i = 0 To CountRows - 1
Sheets("Einstellungen").Range("B" & i + 1).Value = formListBox.List(i).Selected
Next i

Funktioniert leider nicht. Ich gebe zu, ich habe so meine Schwierigkeiten mit dem Objektmodell von VBA. :)
Danke für eure Hilfe!
Gruß
Erik

Anzeige
AW: das ist doch Wurscht
26.06.2014 12:19:17
Mullit
Hallo,
Du scheinst da jedesmal Probleme mit der Notation zu haben;
die ListBox sprichst du so an:
 CountRows = WorksheetFunction.CountA(Sheets("Einstellungen").Range("A1:A100"))
For i = 0 To CountRows - 1
Sheets("Einstellungen").Range("B" & i + 1).Value =  _
formListBox.List(i).Selected
Next i

Zeig außerdem immer mal Deinen ganzen Code,
da fehlen jedesmal die Variablendeklarationen...
Gruß,

Anzeige
Listbox auslesen
26.06.2014 13:03:01
Rudi
Hallo,
Sheets("Einstellungen").Range("B" & i + 1).Value = LBSettings.Selected(i)
Gruß
Rudi

AW: das ist doch Wurscht
26.06.2014 14:36:05
Daniel
Hi
der Vorteil der Listbox ist doch, dass hier das Steuerlelement schon zur Programm-Erstellungszeit vorhanden ist und nicht erst zur Programm-Laufzeit erzeugt wird.
Dh du kannst das Steuerelement wie von den Kollegen gezeigt "direkt" angeben und auch den Namen aus der Vorschlagsliste der Intellisense auswählen (Tastenkombi ALT+LEER) so dass Tipp- und Rechtschreibfeher nicht vorkommen können.
Gruß Daniel
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige