Anzeige
Archiv - Navigation
1644to1648
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
Listindex der Combobox einlesen
18.09.2018 14:41:47
EasyD
Hallo zusammen
wer kann helfen
ich habe eine Userform mit einer Menge Comboboxen
In den Comboboxen möchte ich beim Start der Userform ("Anpassung") jeweils einen von zwei möglichen Einträgen stehen haben.
Leider sind meine Comboboxen allesamt leer beim Start.
Meine Lösung ist sicherlich nicht die eleganteste, sollte aber für mein Verständnis eigentlich funktionieren. Die Zellen auf die im Code ich verweise, enthalten entweder den Wert 0 oder 1.
Der Code:
Private Sub UserForm_Initialize()
Dim cb As Object
'Dim ctrl As MSForms.Control
'Dim CmdBtn As Klassecmd
'Funktion für die Commandbuttons festlegen - siehe Klassenmodul "Klassecmd"
'(die Eigentliche Funktion steht in dem Klassenmodul)
'Set colButtons = New Collection
'For Each ctrl In Me.Controls
'  If TypeOf ctrl Is MSForms.CommandButton Then
'    Set CmdBtn = New Klassecmd
'    Set CmdBtn.cmd = ctrl
'    colButtons.Add CmdBtn
'  End If
'Next ctrl
'die Comboboxen alle befüllen
For Each cb In Anpassung.Controls
If TypeName(cb) = "ComboBox" Then
cb.AddItem "0ter Eintrag"
cb.AddItem "1ter Eintrag"
Select Case cb.Name
Case ComboBox1
cb.ListIndex = Sheets("Tabelle1").Range("A301").Value
Case ComboBox2
cb.ListIndex = Sheets("Tabelle1").Range("A401").Value
Case ComboBox3
cb.ListIndex = Sheets("Tabelle1").Range("A501").Value
Case ComboBox4
cb.ListIndex = Sheets("Tabelle1").Range("A601").Value
Case ComboBox5a
cb.ListIndex = Sheets("Tabelle1").Range("A703").Value
Case ComboBox5b
cb.ListIndex = Sheets("Tabelle1").Range("A803").Value
Case ComboBox6a
cb.ListIndex = Sheets("Tabelle1").Range("A905").Value
Case ComboBox6b
cb.ListIndex = Sheets("Tabelle1").Range("A1005").Value
Case ComboBox7a
cb.ListIndex = Sheets("Tabelle1").Range("A1107").Value
Case ComboBox7b
cb.ListIndex = Sheets("Tabelle1").Range("A1207").Value
Case ComboBox8
cb.ListIndex = Sheets("Tabelle1").Range("A1307").Value
Case ComboBox9
cb.ListIndex = Sheets("Tabelle1").Range("A1407").Value
Case ComboBox10
cb.ListIndex = Sheets("Tabelle1").Range("A1507").Value
Case ComboBox11
cb.ListIndex = Sheets("Tabelle1").Range("A1607").Value
Case ComboBox12
cb.ListIndex = Sheets("Tabelle1").Range("A1707").Value
Case ComboBox13
cb.ListIndex = Sheets("Tabelle1").Range("A1807").Value
Case ComboBox14
cb.ListIndex = Sheets("Tabelle1").Range("A1907").Value
Case ComboBox16
cb.ListIndex = Sheets("Tabelle1").Range("A2008").Value
End Select
End If
Next
End Sub
Das Ziel der ganzen Nummer war, sich auch bei mehrfachem Aufruf der Userform den zuletzt in der Combobox gewählten Wert zu merken ("0ter Eintrag" entspricht listindex = 0, "1ter Eintrag" entsprechend Listindex = 1).
Den Wert in den ganzen Zellen ermittele ich wie folgt:
Private Sub ComboBox1_Change()
Sheets("Tabelle1").Unprotect
Sheets("Tabelle1").Range("A301") = ComboBox1.ListIndex
Sheets("Tabelle1").Protect
'und entsprechend auch für alle anderen
End Sub

Sprich - ich wähle mit der Combobox aus und das change-Ereignis schreibt dann bei Auswahl "0ter Eintrag" die 0 in die Zelle auf die ich dann beim erneuten Aufruf referenziere um den Listindex zu bestimmen (bzw 1 bei "1ter Eintrag"). Das funktioniert auch, nur leider interessiert das offenbar niemanden beim Start der Userform.
Kann es sein, dass sich das change-ereignis irgenwie mit der Initialisierung der Userform beißt (wird die Combobox durch die Initialisierung schon geändert)?
Im Übrigen habe ich auf der Userform nur noch Commandbuttons, die aber was anderes machen (die habe ich dank Hilfe hier im Forum in einem Klassenmodul mit ihrer Funktion belegt - das betrifft den Teil den ich ganz oben im Code auskommentiert habe).
Bin auch für kürzere Lösungen natürlich offen.
Dank euch!

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listindex der Combobox einlesen
18.09.2018 16:14:35
Mullit
Hallo,
Kann es sein, dass sich das change-ereignis irgenwie mit der Initialisierung der Userform beißt
(wird die Combobox durch die Initialisierung schon geändert)?

...so isses, das Setzen vom ListIndex löst das Change-Event aus, müsstest Du bspw. mit nem booleschen Flag abfangen...
Gruß, Mullit
AW: Listindex der Combobox einlesen
19.09.2018 09:11:29
EasyD
aha
merke - ich werde besser im Erkennen meiner Fehler.
Wenn Daniel's Antwort unten die lösung meines Problems ist, dann wäre das natürlich auch die simpelste Lösung. Hängt aber ebenfalls noch (Ausnahmefehler)
Dank Dir!
AW: Listindex der Combobox einlesen
18.09.2018 16:31:53
Daniel
Hi
wenn beim Start der Userform Steuerlemente für Usereingaben (Listboxen, Comboxen, Textfelder, Checkboxen, Optionbuttons, Togglebuttons) beim Start einer Userform nicht leer sein sollen sondern den Inhalt haben sollen, der der Anwender zuletzt gemacht hat, dann lautet die Lösung ganz einfach:
verknüpfe das Steuerelement mit einer Ausgabezelle.
hierzu wird die Adresse der Zelle, mit welcher das Steuerlement verknüpft werden soll, in die Eigenschaft ControlSource geschrieben, als Zelladresse und am besten auch gleich mit Tabellenblattname in Hochkommas: 'Tabelle1'!A1
eine Programmierung mit VBA-Code ist dazu nicht erforderlich.
Gruß Daniel
Anzeige
AW: Stimmt, ist natürlich noch besser...
18.09.2018 16:38:09
Mullit
...er schreibt ja eh was in die Zellen, sauber...
Gruß, Mullit
AW: Listindex der Combobox einlesen
19.09.2018 09:22:52
EasyD
Hey Daniel,
Kann man hier im Forum eine Freundschaftsanfrage stellen? Ohne deine pragmatischen Ansätze wäre ich schon oft aufgeschmissen gewesen.
Klingt super, würde ich auch unbedingt so machen wollen wenn ich mir dafür die Code-Schreiberei ersparen kann. Es hakt aber leider noch bei mir:
Ich habe in die Controlsource-Eigenschaft für die Combobox1 geschrieben:
'Tabelle1'!A301
Außerdem natürlich das Change-Ereignis geändert:
Private Sub ComboBox1_Change()
Sheets("Tabelle1").Unprotect
Sheets("Tabelle1").Range("A301") = ComboBox1.Value
Sheets("Tabelle1").Protect
'und entsprechend auch für alle anderen
End Sub
Sieht mir so aus, als wenn das auch wie gewünscht funktioniert. Ich ändere den Eintrag in der Combobox, das change-Ereignis ändert den Zellwert in A301 und beim nächsten Start übernimmt er den Wert aus A301 in die Combobox. So weit so gut, allerdings habe ich beim schließen der Userform dann einen Ausnahmefehler.
Ist in diesem Zusammenhang das hier evtl noch ein Problem?
Private Sub UserForm_Terminate()
Dim c As Klassecmd
For Each c In colButtons
Set c.cmd = Nothing
Set c = Nothing
Next c
Set colButtons = Nothing
End Sub
Das hängt zusammen mit der Steuerung der Commandbuttons, siehe ganz oben im Code zur Initialisierung. Ich habe allerdings noch arge Verständnisprobleme was die Verwendung von Klassenmodulen angeht. Diese Lösung hatte ich auch nur hier aus dem Forum um alle Commandbuttons mit einer einheitlichen Funktion zu belegen...
Stell dir die Userform so vor (ich kanns leider nicht ohne Riesen-Aufwand hochladen):
Ich habe untereinander 20 Comboboxen und jeweils rechts daneben einen dazugehörigen Commandbutton. Mit den Comboboxen will ich einen Wert in die Spalte A schreiben und mit den Commandbuttons springe ich mittels ActiveWindow.ScrollRow in die dazugehörige Zeile (das steht dann im Klassenmodul - für Combobox1 und Commandbutton1 in die Zeile 301)
Anzeige
AW: Listindex der Combobox einlesen
19.09.2018 16:16:03
Daniel
Hi EasyD
wie verstehst du den Satz: "eine Programmierung mit VBA-Code ist dazu nicht erforderlich." ?
ich habe ihn so gemeint, dass wenn du das Steuerelement über Controlsource mit einer Ausgabezelle verküpfst, kein weiterer VBA-Code (gemeint das Change-Event) mehr erforderlich ist, weil dann der Wert nicht nur beim Start der Userform in das Steuerelemente gelesen wird, sondern auch jede Änderung sofort und automatisch in die Zelle zurückgeschrieben wird.
Warum verwendest du überhaupt noch das Change-Event?
Hast du das nicht gelesen oder gelesen und anders verstanden?
Gruß Daniel
Anzeige
AW: Listindex der Combobox einlesen
19.09.2018 16:34:19
EasyD
Aaahhhhh...
wie verstehst du den Satz: "eine Programmierung mit VBA-Code ist dazu nicht erforderlich." ?
offensichtlich falsch verstanden Daniel.
Ich dachte du meinst damit, dass die Verknüpfung mit der Zelle lediglich dafür sorgt, dass die Combobox beim Starten wie gewünscht befüllt wird. Dass dann sofort bei jeder Änderung der Eigenschaft auch gleich der Zellinhalt geändert wird, war mir nicht klar. Dann spart's natürlich auch das Change-Event. Auf diese Idee bin ich nicht gekommen.
Ich werd's testen, klingt aber plausibel.
Tausend Dank!
AW: Listindex der Combobox einlesen
20.09.2018 16:29:20
EasyD
Hey Daniel,
ic hoffe, ich kann das Them nochmal auf machen, denn mein Problem ist leider noch nicht gelöst.
Ich bekomme einen Ausnahmefehler wenn ich die Userform per Commandbutton wieder schließen will.
Ich hab schon verstanden - die Werte für die Comboboxen steuere ich über ControlSource. Ein Change-Ereignis für die Comboboxen ist überflüssig. Kann es aber sein, dass sich das setzen der ControlSource-Eigenschaft durch einen Zellbezug damit nicht verträgt, dass ich ja die Comboboxen bei der Initialisierung der UserForm mit 2 unterschiedlich auswählbaren Einträgen befüllen muss (Add.Item)?
Mein Code nochmal:
Option Explicit
Dim colButtons As Collection
Private Sub UserForm_Initialize()
Dim cb As Object
Dim ctrl As MSForms.Control
Dim CmdBtn As Klassecmd
'Funktion für die Commandbuttons festlegen - siehe Klassenmodul "Klassecmd"
'(die Eigentliche Funktion steht in dem Klassenmodul)
Set colButtons = New Collection
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.CommandButton Then
Set CmdBtn = New Klassecmd
Set CmdBtn.cmd = ctrl
colButtons.Add CmdBtn
End If
Next ctrl
'die Comboboxen alle befüllen
'der beim Start aufgerufene Wert der Combobox wird über die ControlSource-Eigenschaft der  _
ComboBoxen gesetzt
For Each cb In Anpassung_Ertrag_IST.Controls
If TypeName(cb) = "ComboBox" Then
cb.AddItem "Faktoreingabe"
cb.AddItem "Pauschaleingabe"
'ist hier das Problem?
'Wir reden ja von einer Combobox die 2 Einträge haben soll. Nur der zuletzt ausgewählte soll
'über die ControlSource-Eigenschaft beim Start der Userform automatisch drin stehen.
End If
Next
End Sub
Wenn ich die gesamte Schleife auskommentiere, bekomme ich den Ausnahmefehler nicht. Allerdings haben meine Comboboxen dann auch nur den einen Wert aus der Zelle drin und ich kann keinen zweiten auswählen...
Zur Ergänzung:
Die Commandbuttons habe ich im Klassenmodul gesteuert. Die machen die Userform zu und springen mit Scrollrow in eine bestimmte Zeile.
Anzeige
AW: Listindex der Combobox einlesen
21.09.2018 12:08:46
Daniel
Du kannst dir auch diesen Code sparen, indem du die Werte, die in der Comboboxliste angezeigt werden sollen in Zellen auf einem Tabellenblatt Schreibstil (untereinanderliegend) und dann die Zelladresse in der Eigenschaft RowSource einträgst.
Dabei kannst du die gleiche Rowsource für mehrere Comoboxen verwenden.
Gruß Daniel
AW: Listindex der Combobox einlesen
21.09.2018 13:32:22
EasyD
ok
Danke erstmal
sehr viel comfortabler auf diesem Weg.
Merke, ich muss mich mit den Eigenschaften der Steuerelemente etwas intensiver befassen. Dass das alles auch so geht, war mir überhaupt nicht klar.
Und nun das ABER:
Den Ausnahmefehler habe ich immernoch. Ich kapier's nicht.
Ich habe in der Userform jetzt nur noch folgendes:
Private Sub UserForm_Initialize()
Dim cb As Object
Dim ctrl As MSForms.Control
Dim CmdBtn As Klassecmd
'Funktion für die Commandbuttons festlegen - siehe Klassenmodul "Klassecmd"
'(die Eigentliche Funktion steht in dem Klassenmodul)
Set colButtons = New Collection
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.CommandButton Then
Set CmdBtn = New Klassecmd
Set CmdBtn.cmd = ctrl
colButtons.Add CmdBtn
End If
Next ctrl
End Sub
Außerdem wäre da noch:
Private Sub UserForm_Terminate()
Dim c As Klassecmd
For Each c In colButtons
Set c.cmd = Nothing
Set c = Nothing
Next c
Set colButtons = Nothing
End Sub
Und dann noch das Klassenmodul für die Commandbuttons:
Option Explicit
Public WithEvents cmd As MSForms.CommandButton
Private Sub cmd_Click()
Application.ScreenUpdating = False
Sheets("Plananpassung").Activate
ActiveSheet.Unprotect
'In Abhängigkeit vom Namen des Commandbuttons die richtige Aktion ausführen
'-> Sprung in die Zeile
' Zeilen ein- und ausblenden
Select Case cmd.Name
Case "CommandButton1"
ActiveWindow.ScrollRow = 301
Range("302:400").EntireRow.Hidden = False
Range("402:500, 502:600, 602:700, 704:802, 804:902, 906:1004, 1006:1104, 1108:1206, 1208: _
1306, 1308:1406, 1408:1506, 1508:1606, 1608:1706, 1708:1806, 1808:1906, 1908:2005, 2009:2106").EntireRow.Hidden = True
Case "CommandButton2"
ActiveWindow.ScrollRow = 401
Range("402:500").EntireRow.Hidden = False
Range("302:400, 502:600, 602:700, 704:802, 804:902, 906:1004, 1006:1104, 1108:1206, 1208: _
1306, 1308:1406, 1408:1506, 1508:1606, 1608:1706, 1708:1806, 1808:1906, 1908:2005, 2009:2106").EntireRow.Hidden = True
'... entsprechend für alle weiteren Commandbuttons
End Select
Unload Anpassung '(Userform zu machen)
Application.ScreenUpdating = True
ActiveSheet.Protect
End Sub

Die RowSource verweist in allen Comboboxen auf 'Datengültigkeiten'!U3:U4
Die ControlSource auf 'Plananpassung'!A301 für die erste Combobox, für die zweite A401 usw
Wenn ich Dich nochmal behelligen kann, würde ich mal meine Userform in eine Musterdatei mal reinziehen und Dir das hoch laden. Das dauert aber eine Weile...
Vielleicht erkennst du meinen Fehler auch so?
Grüße und Tausend Dank!
Anzeige
AW: Listindex der Combobox einlesen
21.09.2018 13:51:29
Daniel
Mit Klassenprogrammierung kenn ich mich nicht aus.
Gruß Daniel
AW: Listindex der Combobox einlesen
21.09.2018 14:22:03
EasyD
ok
schade
aber tausend dank für die Anregungen! Wenn ich mir Code sparen kann, dann immer gerne!
Die Diskussion war sehr hilfreich!
AW: Listindex der Combobox einlesen
21.09.2018 16:46:55
Easyd
Na wenn das so ist dann versteh ich auch warum mir die userform kollabiert.
Werde das Montag testen und Bescheid geben.
AW: okidoki, mach das...owT
21.09.2018 16:51:56
Mullit
AW: Listindex der Combobox einlesen
19.09.2018 16:16:03
Daniel
Hi EasyD
wie verstehst du den Satz: "eine Programmierung mit VBA-Code ist dazu nicht erforderlich." ?
ich habe ihn so gemeint, dass wenn du das Steuerelement über Controlsource mit einer Ausgabezelle verküpfst, kein weiterer VBA-Code (gemeint das Change-Event) mehr erforderlich ist, weil dann der Wert nicht nur beim Start der Userform in das Steuerelemente gelesen wird, sondern auch jede Änderung sofort und automatisch in die Zelle zurückgeschrieben wird.
Warum verwendest du überhaupt noch das Change-Event?
Hast du das nicht gelesen oder gelesen und anders verstanden?
Gruß Daniel
Anzeige
AW: Listindex der Combobox einlesen
19.09.2018 09:34:29
EasyD
PS:
Ich hatte aus der Change-Eigenschaft der übrigen ComboBoxen bis eben auch noch entweder eine 0 oder eine 1 in Spalte A drin stehen statt des Value (auf den ich die ComboBox-Change ja gerade geändert hatte). Ich dachte, vielleicht hängt der Ausnahmefehler ja auch damit zusammen weil ich bei der Initialisierung der Box die 0ter-Eintrag oder 1ter-Eintrag per .AddItem setze (und eben nicht die 0 oder 1).
War's aber leider auch nicht... Habe überall in Spalte A nun vorsorglich erstmal 0ter-Eintrag drin stehen damit die ControlSource-Eigenschaft auch einen Wert nimmt, der unter .AddItem auch eingefügt werden kann.
Leider ergebnisgleich wie vorher...
Anzeige
AW: Listindex der Combobox einlesen
19.09.2018 15:01:01
EasyD
noch Ideen wo der Hase im Pfeffer liegt?

228 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige