PDA

Vollständige Version anzeigen : Combobox füllen mit Werte von Tabelle


Zorro217
16.03.2009, 14:35
Hallo zusammen,

mir stellt sich gerade folgendes Excelproblem. Ich habe eine Combox, in welcher mir bestimmte Werte angezeigt werden sollen. Diese Werte stehen in den Zellen M13 bis max. IV13. Wenn ich über die Combox-Eigenschaft "ListFillRange" gehe und dort etwas eintrage, dann wird zwar ein Wert in der Combobox übernommen, aber die anderen nicht. Woran liegt das? Kann ich die Werte in der Combobox nur mittels "additem" einfügen?! Ich habe es so probiert:

Private Sub ComboBox1_Change()
ComboBox1.AddItem ("Nummer1")
ComboBox1.AddItem ("Nummer2")
ComboBox1.AddItem ("Nummer3")
ComboBox1.AddItem ("Nummer4")
ComboBox1.AddItem ("Nummer5")
End Sub

Wenn ich die Datei dann aber zu mache und wieder öffne, muß ich immer erst das Makro starten, damit die Combobox gefüllt wird. Das ist natürlich Käse...

Und vor allem möchte ich das ja gerne dynamisch halten. Excel soll mir also alle Werte auflisten, die zwischen M13 und IV13 stehen. Leerzeilen sollen allerdings nicht in der Combobox erscheinen. Habt Ihr eine Idee, wie man das hinbekommt?

Danke für Eure Antworten!

Zorro217

pefeu
16.03.2009, 15:21
Hallo Zorro,

ich würde es so versuchen
<FONT FACE="Arial,FixedSys"Size=2>
<Blockquote>
<FONT COLOR=#0000FF>Private Sub</FONT>&nbsp;ComboBox1_DropButtonClick()

<FONT COLOR=#0000FF>Dim</FONT>&nbsp;iSpalte&nbsp;&nbsp;<FONT COLOR=#0000FF>As Integer</FONT>

&nbsp;&nbsp;<FONT COLOR=#0000FF>With</FONT>&nbsp;ComboBox1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>For</FONT>&nbsp;iSpalte&nbsp;=&nbsp;13&nbsp;<FONT COLOR=#0000FF>To</FONT>&nbsp;256
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>If</FONT>&nbsp;Trim(Cells(13,&nbsp;iSpalte).Value)&nbsp;&lt;&gt;&nbsp;""&nbsp;<FONT COLOR=#0000FF>Then</FONT>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddItem&nbsp;Cells(13,&nbsp;iSpalte).Value
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>End If</FONT>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>Next</FONT>&nbsp;iSpalte
&nbsp;&nbsp;<FONT COLOR=#0000FF>End With</FONT>

<FONT COLOR=#0000FF>End Sub</FONT>&nbsp;

</Blockquote>
<FONT FACE="Courier New,FixedSys"Size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Code eingefügt mit <b><a href="http://rtsoftwaredevelopment.de" target="_blank">Syntaxhighlighter 4.4</a></b></FONT>
<FONT FACE="Arial,FixedSys"Size=2>
Mit Klick auf das kleine scharze Dreieck, werden die Werte eingelesen.

Gruß Peter

Zorro217
18.03.2009, 13:20
Hallo Pefeu,

danke für Deine Antwort. Ich habe den Code nun eingefügt, allerdings passiert folgendes: sobald ich einen Wert aus der Liste auswähle und anklicke und später nochmals das Dropdown-Feld anklicke, dann stehen dort alle Werte doppelt drin. Je öfter ich also das Dropdown-Feld anwähle, desto mehr setzt Excel mir dort die Werte immer und immer wieder rein. Woran kann das liegen?

Gruß Zorro217

jinx
18.03.2009, 16:02
Moin, Zorro217,

den Befehl .Clear ergänzen:

Private Sub ComboBox1_DropButtonClick()

Dim iSpalte As Integer

With ComboBox1
.Clear
For iSpalte = 13 To 256
If Trim(Cells(13, iSpalte).Value) <> "" Then
.AddItem Cells(13, iSpalte).Value
End If
Next iSpalte
End With

End Sub
Private Sub ComboBox1_DropButtonClick()

Dim rngCell As Range

With ComboBox1
.Clear
For Each rngCell In Range(Cells(13, 13), Cells(13, Columns.Count)).SpecialCells(xlCellTypeConstants, 23)
.AddItem Trim(rngCell.Value)
Next rngCell
End With

End Sub

Zorro217
19.03.2009, 06:28
Moin Jinx,

Danke Dir für die Antwort. Es wird jetzt tatsächlich der Inhalt der Combobox gelöscht. Allerdings macht meiner Meinung nach doch so eine Combobox keinen Sinn mehr, oder? Da habe ich mich wohl falsch ausgedrückt... :-) Nun wähle ich einen Wert aus der Combobox aus und dann wird er direkt rausgelöscht. Vielleicht macht es Sinn, dass ich doch erkläre, was Excel mit dem Wert dann machen soll. Bislang habe ich das erstmal außen vorgelassen, weil ich sonst den Code vermutlich gar nicht mehr verstehe... :D

Also wenn ich mittels Combobox einen Wert ausgewählt habe (z.B. "Nummer 2"), dann soll Excel zu dieser Zelle springen (also zu O13). Ich habe die Tabelle fixiert und möchte es irgendwie komfortabel gestalten, dass der Nutzer mehr oder weniger auf einen Blick sieht, welche "Alternativen" zur Verfügung stehen, und dann mittels Eingabe (oder Auswahl über die Combobox) zu dieser Zelle springt..

Kann ich das irgendwie über die Combobox erreichen? Oder würdest Du einen anderen Ansatz vorschlagen. Ich könnte es mittels Hyperlink umsetzen, fällt mir gerade ein, aber dann müßte ich alle Werte in einzelnen Zellen in dem fixierten Bereich irgendwo auflisten und das können relativ viele Werte werden....

Viele Grüße

Zorro217

jinx
19.03.2009, 18:08
Moin, Zorro217,

vileleicht so:

Private Sub ComboBox1_Change()

Dim rng As Range
Dim sSearch As String
sSearch = ComboBox1.Text
ActiveSheet.Rows("13:13").Find( _
what:=sSearch, LookIn:=xlValues, lookat:=xlWhole, _
searchorder:=xlByRows).Activate

End Sub
Private Sub UserForm_Initialize()

Dim rngCell As Range

With ComboBox1
.Clear
For Each rngCell In Range(Cells(13, 13), Cells(13, Columns.Count)).SpecialCells(xlCellTypeConstants, 23)
.AddItem Trim(rngCell.Value)
Next rngCell
End With

End Sub
Hier wird die ComboBox beim Initialisieren (erster Aufruf) mit Werten gefüllt, und ein Auswählen in der CB führt zur Markierung in der Zeile 13.

Zorro217
23.03.2009, 06:39
Moin Jinx,

so ungefähr habe ich mir das vorgestellt, allerdings läuft der Code bei mir noch nicht ganz richtig. Kann ich es irgendwie hinbekommen, dass Excel direkt nach dem Start die Combobox füllt?

Bei dem o.g. Code muß ich zunächst in die VBA-Umgebung gehen und dann das Makro mit "UserForm_Initialize()" starten. Ab dann läuft alles super. Wenn möglich würde ich es aber gerne so einstellen, dass die Combobox gefüllt ist, sobald man darauf klickt. Ich dachte da irgendwie an so ein "Workbook_Open()"-Makro, in dem ich die Combobox fülle. Es hapert allerdings an der Umsetzung...

Viele Grüße Zorro217

jinx
23.03.2009, 17:16
Moin, Zorro217,

Du solltest dann z.B. folgenden Code in DieseArbeitsmappe einfügen:

Private Sub Workbook_Open()
UserForm1.Show 'Namen bitte anpassen
End Sub
Durch das Aufrufen der UserForm wird das Initialize-Ereignis automatisch ausgelöst... ;)

Zorro217
24.03.2009, 06:50
Hallo Jinx,
Hallo auch an alle übrigen,

ich stehe gerade etwas auf dem Schlauch. Ich habe jetzt in meiner Datei unter "Tabelle1" folgenden Code gespeichert:
Private Sub ComboBox1_Change()
Dim rng As Range
Dim sSearch As String
sSearch = ComboBox1.Text
ActiveSheet.Rows("13:13").Find( _
what:=sSearch, LookIn:=xlValues, lookat:=xlWhole, _
searchorder:=xlByRows).Activate
End Sub

Private Sub UserForm_Initialize()
Dim rngCell As Range
With ComboBox1
.Clear
For Each rngCell In Range(Cells(13, 13), Cells(13, Columns.Count)).SpecialCells(xlCellTypeConstants, 23)
.AddItem Trim(rngCell.Value)
Next rngCell
End With
End Sub

Und unter "DieseArbeitsmappe" steht:
Private Sub Workbook_Open()
ComboBox1.Show
End Sub


Aber es funzt irgendwie nicht. Wenn ich die Datei neu aufrufe, dann kommt die Fehlermeldung "Objekt erforderlich"?! Ich vermute mal, dass ich den Namen falsch angepasst habe? Aber was genau passt an meinem Code nicht? Das Ding heißt doch auch ComboBox1, oder nicht? Mir ist gerade noch eingefallen: ich habe keinerlei UserForm in der Datei hinterlegt (oder doch???). Diese Combobox habe ich einfach auf das 1.Tabellenblatt gepackt. Also eine UserForm soll gar nicht erst gestartet werden. Nur wenn ich auf diese Combobox auf Tabelle1 klicke, sollten nach Möglichkeit die Werte sofort drin sein... Ich hoffe, dass war jetzt halbwegs verständlich? Die beiden Begriffe UserForm und Combobox verwirren mich gerade nen bissel...
Gruß Zorro217

jinx
24.03.2009, 17:02
Moin, Zorro217,

wir sind von unterschiedlichen Voraussetzungen ausgegangen - ich habe angenommen, Du setzt eine UserForm ein - stattdessen dürfte sich Deine CB direkt in der Tabelle befinden. Dann wäre das Ereignis für den Code Worksheet_Activate statt UserForm_Initialize:

Private Sub Worksheet_Activate()

Dim rngCell As Range

With ActiveSheet.ComboBox1
.Clear
For Each rngCell In Range(Cells(13, 13), Cells(13, Columns.Count)).SpecialCells(xlCellTypeConstants, 23)
.AddItem Trim(rngCell.Value)
Next rngCell
End With

End Sub
Und das Ereignis in DieseArbeitsmappe sollte auch anders aussehen:

Private Sub Workbook_Open()
Dim rngCell As Range

With Sheets("Tabelle2").ComboBox1
.Clear
For Each rngCell In Sheets("Tabelle2").Range(Cells(13, 13), Cells(13, Columns.Count)).SpecialCells(xlCellTypeConstants, 23)
.AddItem Trim(rngCell.Value)
Next rngCell
End With

End Sub

Zorro217
25.03.2009, 13:06
Hallo Jinx,

da habe ich mich wohl etwas unklar vorher ausgedrückt. Sorry. So wie es jetzt läuft, ist es super! Genauso habe ich es mir vorgestellt. Besten Dank für Deine Bemühungen! Bestünde ev. noch die Möglichkeit, dass die Comboox beim Arbeitsmappe-Öffnen quasi nichts anzeigt oder einen Platzhalter o.ä.? Hintergrund ist folgender: wenn ich zuletzt z.B. die Nummer3 in meiner CB anwähle und dann die Datei mit Speichern verlasse, erscheint mir die Nummer3 beim nächsten Aufruf auch automatisch in der CB. Allerdings ist nicht die Spalte mit Nummer3 markiert. Bevor Excel mir nun zu dieser Nummer3 springt, muß ich in der CB erst einen anderen Wert auswählen (z.B. Nummer4) und danach dann wieder Nummer3. Dann springt Excel um.

Das ist jetzt nicht so tragisch. Und wenn es zuviel Aufwand ist, auch nicht so schlimm. Aber vielleicht gibts da ja einen Befehl, mit dessen Hilfe ich in der Combox ein Leerfeld o.ä. beim Öffnen erzeugen kann?

Viele Grüße Zorro217

jinx
25.03.2009, 15:42
Moin, Zorro217,

entweder die Codezeile
.ListIndex = -1
vor das End Sub setzen (entspricht keiner Auswahl in der CB), oder aber die Position der Spalte durch FIND bestimmen und den Cursor umsetzen (das kannst Du gerne nachfordern, wenn Du es so gestalten möchtest).

Zorro217
26.03.2009, 07:08
Moin Jinx,

mal wieder vielen Dank für die rasche Antwort! Die Zeile reicht mir völlig aus. Ich habe sie allerdings noch auf folgendes abgeändert:

Sheets("Tabelle1").ComboBox1.ListIndex = -1

Vorher kam immer die Fehlermeldung: "unzulässig oder nicht ausreichend definierter Verweis", keine Ahnung weshalb, zumal ja in meinem Workbook-Open-Makro bereits die Combobox1 namentlich auftaucht.
Naja, Hauptsache, es läuft. :D

Schönen Dank noch mal!

Viele Grüße

Zorro217

Zorro217
26.03.2009, 10:59
Hallo zusammen,

ich muß das Thema doch noch mal kurz wiedereröffnen. Ich habe den Code jetzt in meine gewünschte Tabelle gepackt. Zwar läuft alles in meiner Testdatei super, aber in der richtigen Tabelle (die ich leider nicht veröffentlichen kann) bekomme ich es nicht ganz hin. Meine Combobox dort hat immer noch allerhand Leerzeilen?! :mad: Kann mir irgendwer vielleicht doch noch verraten, wie ich den Code abändern kann, so dass die Leerzeilen verschwinden? Ich habe den Code von Jinx soweit bei mir drin und eigentlich nur den Namen des Tabellenblatts geändert. Nichts destrotrotz erscheinen die Leerzeilen...

Gruß

Zorro217

jinx
26.03.2009, 16:08
Moin, Zorro217,

dann hast Du möglicherweise Leerzeichen in Zellen in dem Bereich:

If Len(Trim(rngCell.Value)) > 0 Then .AddItem Trim(rngCell.Value)

Zorro217
30.03.2009, 06:48
Moin Jinx,

die Leerzeichen habe ich nun rausbekommen, allerdings gibt es noch ein anderes Problem. Dabei dachte ich eigentlich, die Datei wäre nun fertig. Also meine Combobox und die Auswahl hierüber funktioniert nun super. Problem: wenn ich in der Tabelle, die fixiert ist, als Beispiel in der Zeile 100 stehe und dann einen Wert aus der Combobox auswähle, dann springt Excel zu dieser Zelle. Aber leider geht Excel dabei dann auch aus Zeile 100 raus und wieder ganz nach oben, so dass ich wieder runtersrcollen muß. Besser wäre es, wenn Excel zu der gewünschten Spalte springt, aber die markierte Zelle beibehält. Ist das noch möglich?

Viele Grüße Zorro217

jinx
30.03.2009, 16:14
Moin, Zorro217,

welchen Befehl nutzt Du dafür? Wenn es Application.GoTo mit Scroll:=True ist, wird immer die neue Zelle links oben zu sehen sein (auch im fixierten Bereich). Momentan lann ich den Sinn des Vorhabens nicht nachvollziehen...

Zorro217
31.03.2009, 09:40
Moin Jinx,

ich erkläre mein Problem am besten nochmal anhand der obigen Datei. Ich würde als Beispiel so vorgehen (nachdem die Tabelle in / ab L14 fixiert ist):

1.) Nach unten scrollen, z.B. bis Zelle D200 und die Zelle markieren
2.) In die Combobox gehen (dazu muß ich nicht hochscrollen), weil die CB in dem fixierten Bereich oben drin liegt
3.) Hier z.B. Nummer4 auswählen.

==> So, und nun soll Excel in D200 bleiben, aber die Spalte, in der die Nummer4 auftaucht, quasi aktivieren. Excel soll somit im Prinzip für mich nach rechts scrollen, bis die Spalte mit Nummer4 sichtbar ist. Stattdesssen springt Excel aber richtig in die Zelle mit Nummer4 und scrollt leider nach oben. An so etwas wie "application.goto habe ich auch gedacht, es scheitert allerdings wieder an der Umsetzug.

Ich hoffe, das war verständlich. Leider kann ich die Originaldatei hier nicht posten. Ich kann auch gerne versuchen, Dir den Sinn dieser Vorgehensweise zu erklären: Dadurch dass die Tabelle fixiert ist, sehe ich auf meinem Bildschirm noch die Spalten Q bis U. Wenn nun aber überall in Zeile 13 (also bis zur Spalte IV) etwas eingetragen ist, kann ich nicht auf einmal alle Werte sehen, die dort zur Auswahl stehen. Ich müßte somit so lange nach rechts scrollen, bis der gewünschte Wert erreicht ist. Und das könnte halt dementsprechend lange dauern.

Wie gesagt: ich hoffe, ich habe mich da jetzt irgendwie verständlich ausgedrückt... Als Code habe ich bislang nur das, was Du mir freundlicherweise geschrieben hast... Wenn das jetzt aber zu umständlich sein sollte, dann kann ich damit so wie es jetzt ist, leben. Das hat mir ja schon sehr geholfen und ich konnte wieder was dazu lernen...

Viele Grüße Zorro217

jinx
31.03.2009, 10:04
Moin, Zorro217,

wenn ich Dein Problem richtig verstanden habe, sollte der folgende Code helfen; er gehört hinter die Tabelle1:

Private Sub ComboBox1_Change()

Dim rngCell As Range

Set rngCell = ActiveSheet.Rows("13:13").Find( _
what:=ActiveSheet.ComboBox1.Text, _
LookIn:=xlValues, _
lookat:=xlWhole, _
searchorder:=xlByColumns)
Cells(ActiveCell.Row, rngCell.Column).Select
Set rngCell = Nothing

End Sub

Zorro217
31.03.2009, 10:53
Hallo Jinx,

perfekt!!!!!!!!!!!!!!! :D Genau so sollte es laufen! Wirklich super. Dankeschön!!!!!!!

Viele Grüße Zorro217