Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
"Echte" Spaltenanzahl in ComboBox festlegen
Martin
Hallo,
eine ComboBox hat standardmäßig 10 Spalten. Ist es möglich diese Spaltenanzahl einfach auf eine _ Spalte zu festzulegen? Mit einem kleinen Trick ist es mir bereits gelungen, aber es gibt doch bestimmt eine bessere Lösung.

Private Sub UserForm_Initialize()
Dim i As Integer
With ComboBox1
'Standardmäßig 10 Spalten
For i = 1 To 50
.AddItem "Eintrag " & i
Next
Debug.Print "ComboBox-Spalten: " & UBound(.List, 2) + 1
.Clear
'Über Array-Zuweisung nur noch eine Spalte
.List = Array("Eintrag 1")
For i = 2 To 50
.AddItem "Eintrag " & i
Next
Debug.Print "ComboBox-Spalten: " & UBound(.List, 2) + 1
End With
End Sub

Hintergrund meiner Frage:
Im Buch "Excel-VBA (Einstieg für Anspruchsvolle)" von Michael Schwimmer steht:
"Schleifen mit der For Each...Next-Anweisung sind extra dafür gemacht, nacheinander alle Elemente einer Auflistung oder eines Datenfelds zurückzugeben. [...] Wollen Sie alle Elemente einer Auflistung durchlaufen, wenden Sie am besten die Schleife For Each...Next an. Das ist schneller, als die einzelnen Elemente über Index anzusprechen."
In dem Buch zudem, dass das Durchlaufen mit der For Each...Next-Anweisung um bis zu 40 Prozent schneller sei, als jedes einzelne Element per Index anzusprechen.
Wenn ich nun die For Each...Next-Anweisung anstelle der Index-Abfrage auf eine ComboBox anwende, würde (aufgrund der 10 Spalten) die 10-fache Anzahl an Durchläufen erfolgen. Das möchte ich mit der Reduzierung auf eine ComboBox-Spalte gerne vermeiden.
Viele Grüße
Martin

38
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: "Echte" Spaltenanzahl in ComboBox festlegen
Josef

Hallo Martin,
in deinem Code wird die Spaltenanzahl der ComboBox nirgends verändert!
Und wo her nimmst du die Info das eine ComboBox standardmäßig 10 Spalten hat?

« Gruß Sepp »

AW: "Echte" Spaltenanzahl in ComboBox festlegen
Martin
Hallo Josef,
du irrst dich. Lass doch einfach mal meinen geposteten Code durchlaufen und sieh mal ins Direktfenster.
Private Sub UserForm_Initialize()
Dim i As Integer
With ComboBox1
.List = Array() 'ohne diese Zeile ist ComboBox 10-spaltig
For i = 1 To 50
.AddItem "Eintrag " & i
Next
Debug.Print "ComboBox-Spalten: " & UBound(.List, 2) + 1
End With
End Sub
Ein anderes schönes Beispiel:
Private Sub UserForm_Initialize()
Dim i As Integer, item
With ComboBox1
For i = 1 To 10
.AddItem "Eintrag " & i
Next
End With
i = 1
For Each item In ComboBox1.List
Debug.Print i & ": " & item
i = i + 1
Next
End Sub
Viele Grüße
Martin
Anzeige
AW: "Echte" Spaltenanzahl in ComboBox festlegen
Josef

Hallo Martin,
meinst du statt Spalten vielleicht Zeilen?
Ich kapier nicht, was du sagen bzw. erreichen willst.

« Gruß Sepp »

AW: "Echte" Spaltenanzahl in ComboBox festlegen
Martin
Hallo Sepp,
ich hatte gehofft, dass meine Code-Beispiele mein Anliegen gut verdeutlichen. Hast du mal in dein Direktfenster gesehen? Obwohl ich nur 10 Einträge (Zeilen) in die ComboBox eingetragen habe, werden bei einer "For Each ... Next"-Anweisung 100 Einträge durchlaufen. Das liegt eben daran, dass die ComboBox standardmäßig 10 Spalten hat.
Viele Grüße
Martin
Anzeige
Quatsch!
Josef

Hallo Martin,
das ist Quatsch, schreib mal Debug.Print ComboBob1.ColumnCount dann siehst du, das sie nur eine Spalte hat.

« Gruß Sepp »

Quatsch!
Josef

Hallo Martin,
das ist Quatsch, schreib mal Debug.Print ComboBox1.ColumnCount dann siehst du, das sie nur eine Spalte hat.

« Gruß Sepp »

Anzeige
Kein Quatsch! Lies mal in der Excel-Hilfe!
Martin
Hallo Sepp,
offen gesagt finde ich es nicht so toll, dass du dich über meine Äußerungen lustig machst. In der Excel-Hilfe stehe doch eindeutig:
ColumnCount-Eigenschaft Gibt die Anzahl der Spalten an, die in einem Listenfeld oder in einem Kombinationsfeld angezeigt werden sollen.
Ich habe dir hier Codes gepostet, die den Sachverhalt eindeutig belegen. Aber scheinbar hast du die Codes nicht durchlaufen lassen. Eine ComboBox ist standardmäßig auf 10 Spalten eingerichtet, ob du es nun glaubst oder nicht.
Martin
doch Quatsch, ob du es glaubst oder nicht! o.T.
Josef
« Gruß Sepp »

Anzeige
Du irrst. Dann erkläre mal bitte...
Martin
...warum bei diesem Code trotz nur 10 Einträgen ganze 100 Treffer gelistet werden?
Private Sub UserForm_Initialize()
Dim i As Integer, item
With ComboBox1
.ColumnCount = 1
For i = 1 To 10
.AddItem "Eintrag " & i
Next
End With
i = 1
For Each item In ComboBox1.List
Debug.Print i & ": " & item
i = i + 1
Next
End Sub
Sprachlos?
AW: Du irrst. Dann erkläre mal bitte...
Josef

Hallo Martin,
Sprachlos? Nien, warum auch. Ich verwechsle ja nicht .ColumnCount mit .List.
Du kannst einen Kopfstand machen, aber deine ComboBox hat nicht mehr als eine Spalte!
Versuch mal mit
MsgBox ComboBox1.List(0, 1)

auf die (nicht vorhandene) Spalte 2 deiner Combo zuzugreifen.
Sprachlos?

« Gruß Sepp »

Anzeige
AW: Du irrst. Dann erkläre mal bitte...
Martin
Hallo Sepp,
du hast ".ColumnCount" ins Spiel gebracht, nicht ich! Du hast aber noch immer nicht erklärt, warum mein Code 100 Treffer listet! ListCount ergibt übrigens auch 10 Treffer (...was bei 10 Einträgen auch logisch ist), woher kommen nun die anderen 90 Treffer?
Scheinbar bist du nicht sprachlos, sondern in Erklärungsnot!
Viele Grüße
Martin
Erklärungsnot - nicht wirklich
Josef

Hallo Martin,
.ColumnCount gibt die Anzahl der Spalten der ComboBox an. Die List-Eigenschaft gibt ein Datenfeld vom Typ Variant/Variant zurück, das solange kein anderes Array an .List zugewiesen wurde, Die Maximale Spaltenanzahl für Ungebundene ComboBoxen enthält (0-9). Dieses Datenfeld hat aber nichts mit den angezeigten Spalten der Combo zu tun hat.
Wenn du .List ein Datenfeld mit weniger Spalten zuweist, dann wird dieses übernommen.
Das Standarmäßig 10-Spaltige Datenfeld hat aber nichts mit der ColumnCount-Eigenschaft zu tun,
wenn .ColumnCount=1 , kannst du nicht auf die zweite Spalte zugreifen, weil es sie nicht gibt!
Aber wenn du mit deinem Level "VBA bescheiden" so wie so alle besser zu wissen scheinst, warum stellst du dann in diesem Forum deine Fragen?

« Gruß Sepp »

Anzeige
nur leider ist deine Erklärung falsch...
Martin
Hallo Sepp,
wenn .ColumnCount=1 , kannst du nicht auf die zweite Spalte zugreifen, weil es sie nicht gibt!
Genau in diesem Satz irrst du dich:
Private Sub UserForm_Initialize()
Dim arrData(0 To 50, 0 To 50) As Variant
Dim i As Integer, j As Integer
For j = 0 To 49
For i = 0 To 49
arrData(j, i) = "Z" & j & "S" & i
Next i
Next j
ComboBox1.List = arrData
Debug.Print ComboBox1.ColumnCount 'ergibt 1
Debug.Print ComboBox1.List(1, 49) 'ergibt Z1S49
End Sub
Aber wenn du mit deinem Level "VBA bescheiden" so wie so alle besser zu wissen scheinst, warum stellst du dann in diesem Forum deine Fragen?
Ich stelle hier im Forum Fragen, weil ich auf dem Level "VBA bescheiden" bin und lernen möchte. Wäre ich ein Profi, müsste ich nicht fragen! Nur prüfe die Antworten, lese Bücher / die Excel-Hilfe und erkenne auch, wenn falsche Antworten gegeben werden.
Viele Grüße
Martin
Anzeige
Kraut und Rüben.
Josef

Hallo Martin,
"Das Standarmäßig 10-Spaltige Datenfeld hat aber nichts mit der ColumnCount-Eigenschaft zu tun,
wenn .ColumnCount=1 , kannst du nicht auf die zweite Spalte zugreifen, weil es sie nicht gibt!"

Du weißt ja an .List ein Array mit 50 Zeilen/Spalten zu, dann kannst du natürlich auch darauf zugreifen.

« Gruß Sepp »

Anzeige
Deine Erklärung feht leider noch immer...
Martin
Hallo Sepp,
mein letzter Versuch: Ich bitte dich zum wiederholten Male mir zu erklären, warum der folgende Code exakt die 10-fache Anzahl an Einträgen findet:
Private Sub UserForm_Initialize()
Dim i As Integer, item
With ComboBox1
.ColumnCount = 1
For i = 1 To 10
.AddItem "Eintrag " & i
Next
End With
i = 1
For Each item In ComboBox1.List
Debug.Print i & ": " & item
i = i + 1
Next
End Sub
Ich wäre dir auch sehr dankbar, wenn du dir diese Beispieldatei einmal ansehen würdest: https://www.herber.de/bbs/user/81480.xls
Wenn meine Erklärung mit den 10 Spalten falsch ist, dann gib mir doch bitte einfach die richtige Erklärung.
Viele Grüße
Martin
Anzeige
AW: Deine Erklärung feht leider noch immer...
Josef

Hallo Martin,
ich hab dir doch geschrieben, das Standardmäßig das Datenfeld das .List zurück gibt 10 Spalten umfasst.
Daher auch die 100 (scheinbaren) Einträge, das hat aber, und hier wiederhole ich mich schon zum x-ten Male, nichts mit der Spaltenanzahl (.ColumnCount) der Combo zu tun.
Wie du in Deinem zweiten Beispiel ja selbst gesehen hast, kann ich einer 1-Spaltigen ComboBox auch ein 50-Spaltiges Datenfeld zuweisen, es wird nur eine Spalte angezeigt ich kann aber auf alle Spalten des Datenfeldes zugreifen, aber nicht auf die nicht vorhandenen Spalten der ComboBox!
Du verwechselst immer die Spalten der Combo mit dem dahinter liegenden Datenfeld, das sind aber zwei komplett unterschiedliche Dinge.

« Gruß Sepp »

Nein....
Ramses
Hallo
Da liegt ein grundätzliches Missverständnis vo
Mit deiner Variante .List(xxx greifst du das Datenarray zu , aber du kannst NICHT auf den Inhalt der Spalte in der Comboxbox zugreifen.
Hier in diesem Beispiel sollte der Unterschied deutlich werden
https://www.herber.de/bbs/user/81481.xlsm
gruss Rainer
Fehler meinerseits.....
Ramses
Hallo
Sorry,... Fehler meinerseits mit dem Beispiel.
Da habe ich einen Zählfehler gemacht mit der Msgbox.
Ich kriegs bald auch nicht mehr auf die Reihe. Muss mir das nochmal zu Gemütze führen :-( Warum sich die Combobox so verhält.
Gruss Rainer
Danke, genau da liegt das Problem...
Martin
Hallo Rainer,
vielen Dank für deine Antwort.
Verstehe ich es richtig: Hinter jeder ComboBox steht ein Datenarray, welches standardmäßig in der zweiten Dimension auf "0 bis 9" festgelegt ist?
Viele Grüße
Martin
AW: Danke, genau da liegt das Problem...
Martin
Hallo Sepp,
ich bin gerade noch einmal den Archivthread durchgegangen. Sorry, du hattest doch recht. Jetzt komme ich noch einmal auf meine Ausgangsfrage zurück:
Ich vermute fast, dass ich die Antwort zur Reduzierung des ComboBox-Datenfeldes auf eine Spalte bereits selbst gepostet habe. Die einzige Möglichkeit ist bestimmt die Zuweisung über die List-Eigenschaft, oder?
Siehst du eine weitere Möglichkeit über "For Each ... Next" ausschließlich die Werte der ersten Spalte zu durchlaufen?
Viele Grüße
Martin
AW: Danke, genau da liegt das Problem...
Josef

Hallo Martin,
"Ich vermute fast, dass ich die Antwort zur Reduzierung des ComboBox-Datenfeldes auf eine Spalte bereits selbst gepostet habe. Die einzige Möglichkeit ist bestimmt die Zuweisung über die List-Eigenschaft, oder?"
Ja, das hab ich dir schon mehrfach geschrieben.
"Siehst du eine weitere Möglichkeit über "For Each ... Next" ausschließlich die Werte der ersten Spalte zu durchlaufen?"
Nein, das geht nur über den Index.

« Gruß Sepp »

Gut, meine Frage ist geklärt, aber...
Martin
Hallo Sepp,
danke, meine Frage ist abschließend beantwortet. Hinsichtlich dem Kraut und der Rüben lagst du aber daneben... ;-)
Viele Grüße
Martin
Kraut=.ColumnCount - Rüben=.List ;-)) o.T.
Josef
« Gruß Sepp »

Eigentl lautet die AW JEIN, ...
Luc:-?
…Martin,
denn man kann ein Datenfeld auch so aufbauen, dass es von For Each zeilen- bzw spaltenweise durchlaufen wird. Dabei kann man dann in der Schleife auch nur das gewünschte Element der Zeile bzw Spalte auswählen. Das ist aber kaum bekannt und man findet deshalb im Netz eher irreführende Ansichten (selbst in Tutorien!) als diese Möglichkeit.
Das bezieht sich natürlich auf das Datenfeld — die ComboBox-Diskussion hat nicht mein Interesse.
Gruß Luc :-?
Außerdem...
Josef

... hast du mit Spaltenanzahl" doch .ColumnCount ins Spiel gebracht und .ListCount gibt auch bei 100 Spalten nur die Anzahl der Daten-Zeilen zurück.

« Gruß Sepp »

AW: "Echte" Spaltenanzahl in ComboBox festlegen
Gerd
Hallo Martin,
die Spaltenanzahl ist beim Füllen mit der AddItem-Methode oder per RowSource wohl auf max. 10 begrenzt.
Private Sub UserForm_Activate()
Dim arrTest(1 To 50), i As Integer
For i = 1 To 50
arrTest(i) = "Eintrag" & i
Next
With ComboBox1
.Clear
.ColumnCount = 1
.List = WorksheetFunction.Transpose(arrTest)
.ListIndex = 0
End With
End Sub
Gruß Gerd
AW: "Echte" Spaltenanzahl in ComboBox festlegen
Ramses
Hallo
Ich versteh die Frage irgendwie nicht ganz.
Mit
Me.Combobox1.Columncount = 1
kannst du die Anzahl der Spalten doch ganz einfach verändern.
und mit
Private Sub CommandButton1_Click()
With Me.ComboBox1
.ColumnCount = Me.ComboBox1.ColumnCount + 1
.AddItem "1"
.List(.ListCount - 1, .ColumnCount - 1) = "1"
End With
End Sub
die entsprechenden Spalten geziehlt füllen, bzw. abfragen.
gruss Rainer
AW: "Echte" Spaltenanzahl in ComboBox festlegen
Martin
Hallo Rainer,
nein, ColumnCount gibt nur an wieviele ComboBox-Spalten anzgezeigt werden sollen. Auch wenn ich ColumnCount = 1 setze, hat die ComboBox weiterhin 10 Spalten.
Private Sub UserForm_Initialize()
Dim i As Integer, item
With ComboBox1
.ColumnCount = 1
For i = 1 To 10
.AddItem "Eintrag " & i
Next
End With
i = 1
For Each item In ComboBox1.List
Debug.Print i & ": " & item
i = i + 1
Next
End Sub
Viele Grüße
Martin
OK - der weiß mehr als ich/wir ;-)) o.T.
Josef
« Gruß Sepp »

Ist das jetzt erst oder ironisch gemeint? o.T.
Martin
owT
AW: Das ist mehr als ironisch gemeint....
Martin
Hallo Rainer,
ich glaube hier liegt ein grundsätzliches Mißverständnis vor: Deine Beispieldatei zeigt die Funktion von ColumnCount, aber ColumnCount gibt lediglich an wieviele Spalten angezeigt werden. Ich habe dir jetzt mal eine Beispieldatei hochgeladen, die doch recht deutlich beweist, dass eine ComboBox standardmäßig 10 Spalten hat: https://www.herber.de/bbs/user/81480.xls
Viele Grüße
Martin
AW: Das ist mehr als ironisch gemeint....
Hajo_Zi
Hallo Martin,
es gehen auch mehr als 10 Spalten, wenn Du einen Bereich zu weist.

darauf hab ich schon gewartet! o.T.
Josef
« Gruß Sepp »

AW: Das ist mehr als ironisch gemeint....
Martin
Hallo Hajo,
ja, das ist mir bekannt. Genau auf diese Weise setze ich die Spaltenanzahl doch auch auf 1 herunter:
Private Sub UserForm_Initialize()
Dim i As Integer
With ComboBox1
.List = Array() 'ohne diese Zeile ist ComboBox 10-spaltig
For i = 1 To 50
.AddItem "Eintrag " & i
Next
Debug.Print "ComboBox-Spalten: " & UBound(.List, 2) + 1
End With
End Sub
Viele Grüße
Martin
AW: Das ist mehr als ironisch gemeint....
Hajo_Zi
Hallo Martin,
in Deinem Beispiel arbeitest Du mit Add Item. Da sind nur 10 Spalten möglich. Weist Du aber den Bereich zu sind es mehr als 10.
Gruß Hajo
AW: Das ist mehr als ironisch gemeint....
Martin
Hallo Hajo,
aber bevor ich mit ".AddItem" arbeite, habe ich bereits mit ".List = Array()" die Spaltenanzahl neu festgelegt. Da mein Array aber leer ist, wird die Spaltenanzahl auf 1 reduziert.
Viele Grüße
Martin

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige