Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Steuerelement Combobox in Excel?!?





Frage

Hallo allerseits, nachdem im VBA Bereich niemand reagiert hat probier ich es nochmal hier - vielleicht wird hier ja jemand darauf aufmerksam: Ich habe in einem Excel Tabellenblatt ein Steuerelement der Art "Combobox" angelegt. Jetzt möchte ich dieses mit Daten füllen. Aber wie?!? Bei dem gleichen Steuerelement in einem Formular (Userform) gibts unter den Element-Eigenschaften die Zeile RowSource, dort kann man einen Quellenbereich im Tabellenblatt angeben. Diese Eigenschaft gibts bei der ComboBox im Tabellenblatt aber nicht. Wie gehts dann? Oder bin ich da mit "RowSource" ganz auf dem falschen Dampfer?!? Vielen Dank schon mal für jeden Hinweis! Hannes

Antwort 1 von coros

Hy Hannes,

das macht man über die ComboBox.AddItem-Eigenschaft und einer davor geschalteten Schleife.

Beispiel:

Mit dem Code, der in das VBA Projekt des Blattes, in dem sich die ComboBox befindet, gehört, wird die ComboBox1 jedes mal wenn der Pfeil auf der rechten Seite betätigt wird von neuem gefüllt. Gefüllt wird die Box mit den Daten aus Spalte A von Zeile 1 bis 10.

Private Sub ComboBox1_DropButtonClick()
For Wiederholungen = 1 To 10
ComboBox1.AddItem Cells(Wiederholungen, 1)
Next
End Sub



Ich hoffe, Du kommst klar. Bei ragen melde Dich.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von Hanso

Hallo Oliver,

erstmal vielen Dank für die Tips! Z.T. hilft mir das auch weiter. Allerdings wird mit jeder Auswahl in der ComboBox die Liste erneut hinzugefügt. Der Aktionsbefehl ist bei mir allerdings "Change". Das sollte eigentlich keinen Unterschied machen(?). Aber ich probiers gleich nochmal aus.

Was mir aber noch dringender ist: Ich möchte, dass im DropDown Menü die auszuwählenden Bezeichnungen (also "Auswahl A", "Auswahl B" usw. aus der 1. Spalte einer Tabelle) erscheinen, der Auswahl dann aber ein Wert zugeordnet wird, der bspw. in der 2. Spalte der Tabelle steht. Wenn ich die Steuerelemente richtig verstehe, dann entspricht ersteres der Zuordnung "Text", zweiteres "Value".
Diese Zuweisung wird auch nicht mehr verändert. Durch die Auswahl an der ComboBox soll diese lediglich einen Wert annehmen der im weiteren Ablauf einer Prozedur verwendet wird.
Also AddItem "manuell" oder per Schleife für den Text und dann (value)...?
Iss ´n bißchen lang geworden... Hoffe es ermöglicht eine umso kürzere Antwort ;-)

Hannes

Antwort 3 von coros

Hallo Hannes,

damit nicht immer die Daten in der ComboBox hinten angehängt werden und somit die Datensätze mehrfach in der ComboBox erscheinen, trage am Anfang des Codes den Befehl

ComboBox1.Clear

Das bewirkt, dass die Inhalte der ComboBox zuerst gelöscht werden bevor sie wieder mit Daten gefüllt wird. Der Unterschied zwischen den Change- und dem DropButtonClick-Ereignis ist der, dass die Box beim Change-Ereignis erst bei Textänderung, bzw. bei Texteingabe in das ComboBoxfeld mit Daten gefüllt wird. Beim DropButtonClick-Ereignis aber schon wenn der Pfeil zum Aufklappen des ComboBoxmenüs betätigt wird.

Sorry, aber den Rest Deiner Frage habe ich leider nicht verstanden. ich weiß nicht, was Du mit

Zitat:
Wenn ich die Steuerelemente richtig verstehe, dann entspricht ersteres der Zuordnung "Text", zweiteres "Value".


meinst. Und auch den Rest habe ich nicht verstanden. Das musst Du wohl noch mal etwas genauer erklären. Verzichte wenn möglich mal auf die ganzen Bezeichnungen wie Value oder AddItem usw., das verwirrt nur unnötig.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 4 von Hanso

Ja Du hast recht! Ich versuche es nochmal im Zusammenhang zu erklären:
Ich habe mehrere Excelsheets in einer Excel Datei. Eines dient als Benutzeroberfläche. Hier soll der Benutzer verschiedene Angaben mit Hilfe von Steuerelementen machen, die von einer VBA-Prozedur unter Rückgriff auf Daten die in den anderen Sheets stehen, verarbeitet werden. Der Benutzer drückt dann am Ende auf den Button "Berechnen" und die Prozedur verwendet die Angaben, bzw. was ihnen zugeordnet ist.
Unter anderem soll der Benutzer aus einer in einem Dropdown Feld vorgegeben Liste eine Bezeichnung auswählen (in diesem Fall eine Betonklasse, zB. "C 20/25"). Jeder Betonklasse ist eine Festigkeit zugeordnet, die der Benutzer nicht sehen soll, die die VBA Prozedur bei ihrer Berechnung aber verwenden soll.

Meiner Vorstellung nach entspricht das im Fall der ComboBox einer zweispaltige Tabelle, deren erste Spalte im Dropdown-Menü zu sehen ist (die Betonklassen) und deren zweite Spalte die zugehörigen Festigkeiten enthalten, die nicht zu sehen sind, aber von der Prozedur verwendet werden.
Diese Angaben könnten sowohl direkt im Code oder auf einem seperaten Excelsheet stehen , das ist letztlich egal, da diese immer gleich sind und jeweils eins davon ausgewählt wird.

So, ich hoffe das ist verständlicher :-)
Vielen Dank für Mühe und Geduld!

Hannes

Antwort 5 von coros

Nabend Hannes,

man könnte das z.B. über WorksheetFunction.VLookup realisieren. VLookup ist SVERWEIS in VBA. Den Wert, der dort ermittelt wird könnte man in eine Variable schreiben, mit dem Du dann weiterarbeiten könntest. Mal als Beispiel:

In der Spalte A von Zeile 1 bis 12 stehen Deine Betonklassen. In Spalte B stehen die dazugehörigen Festigkeiten. Dann würde der Code für das Change-Ereignis der ComboBox1 folgendermaßen aussehen:

Private Sub ComboBox1_Change()
On Error Resume Next
Wert = WorksheetFunction.VLookup(ComboBox1, Range("A1:B12"), 2, False)
MsgBox Wert
End Sub


Bei dem Beispielcode wird Dir dann das gefundene Ergebnis in einer Bildschirmmeldung angezeigt. Anstelle der MsgBox kann dann Dein weiterer Code stehen.

Ich hoffe, Du kommst klar. Ansonsten melden.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 6 von Hanso

Möchte hier noch die abschließende Antwort auf meine Frage nachreichen:

Was ich gesucht habe ist schlicht und einfach "ListFillRange". Die vorgeschlagenen Lösungen helfen zwar auch weiter (und haben meinen Horizont stark erweitert - also vielen Dank dafür!), aber es geht auch einfacher - zumindest für meinem Fall:

Bei dem Steuerelement ComboBox in einem Datenblatt heißt die Zuordnung zu einer Zelle bzw. Liste in einem Excel Sheet in der Tat "ListFillRange".
Im Gegensatz dazu heißt diese Zuordnung bei dem gleichen Steuerelement in einem Formular "RowSource".

ListFillRange ist in den Eigenschaften der ComboBox in einem Datenblatt mit aufgeführt. Der Verweis wird wie in Excel Zellen und nicht wie in VBA geschrieben:
Also z.B. ein Verweis auf eine Liste A1:B10 in einem anderen Blatt/Sheet als dem in dem das Steuerelement ist lautet:
´Tabelle2´!A1:B10 (in der rechten Spalte bei der Eigenschaft ListFillRange)

Die Eigenschaft "BoundColumn" bestimmt welche Spalte dieser so angegebenen Liste als Wert (Value) definiert wird.
Die Eigenschaft "LinkedCell" bestimmt wiederum in welche Zelle dieser Wert (value) geschrieben werden soll.
"ColumCount" schließlich gibt an wieviele Spalten der mit ListFillRange angegebene Liste im Fenster der ComboBox angezeigt werden.
"TextColumn" bestimmt die Spalte deren Inhalt mit Text ausgegeben wird und die auch nach der Auswahl angezeigt wird.

So hoffe, diese Angaben können nochmal jemanden weiterhelfen. Den Vorrednern nochmal vielen Dank für die Mühe und sollte noch Fehler sein, korrigiert sie bitte.

Hannes