Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen

"Echte" Spaltenanzahl in ComboBox festlegen | Herbers Excel-Forum


Betrifft: "Echte" Spaltenanzahl in ComboBox festlegen von: Martin
Geschrieben am: 19.08.2012 11:28:02

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

  

Betrifft: AW: "Echte" Spaltenanzahl in ComboBox festlegen von: Josef Ehrensberger
Geschrieben am: 19.08.2012 11:59:18


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 »



  

Betrifft: AW: "Echte" Spaltenanzahl in ComboBox festlegen von: Martin
Geschrieben am: 19.08.2012 12:09:18

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


  

Betrifft: AW: "Echte" Spaltenanzahl in ComboBox festlegen von: Josef Ehrensberger
Geschrieben am: 19.08.2012 12:13:02


Hallo Martin,

meinst du statt Spalten vielleicht Zeilen?

Ich kapier nicht, was du sagen bzw. erreichen willst.




« Gruß Sepp »



  

Betrifft: AW: "Echte" Spaltenanzahl in ComboBox festlegen von: Martin
Geschrieben am: 19.08.2012 12:19:53

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


  

Betrifft: Quatsch! von: Josef Ehrensberger
Geschrieben am: 19.08.2012 12:26:24


Hallo Martin,

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




« Gruß Sepp »



  

Betrifft: Quatsch! von: Josef Ehrensberger
Geschrieben am: 19.08.2012 12:26:38


Hallo Martin,

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




« Gruß Sepp »



  

Betrifft: Kein Quatsch! Lies mal in der Excel-Hilfe! von: Martin
Geschrieben am: 19.08.2012 12:35:20

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


  

Betrifft: doch Quatsch, ob du es glaubst oder nicht! o.T. von: Josef Ehrensberger
Geschrieben am: 19.08.2012 12:41:35

« Gruß Sepp »



  

Betrifft: Du irrst. Dann erkläre mal bitte... von: Martin
Geschrieben am: 19.08.2012 12:46:04

...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?


  

Betrifft: AW: Du irrst. Dann erkläre mal bitte... von: Josef Ehrensberger
Geschrieben am: 19.08.2012 12:51:48


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 »



  

Betrifft: AW: Du irrst. Dann erkläre mal bitte... von: Martin
Geschrieben am: 19.08.2012 13:13:58

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


  

Betrifft: Erklärungsnot - nicht wirklich von: Josef Ehrensberger
Geschrieben am: 19.08.2012 13:25:15


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 »



  

Betrifft: nur leider ist deine Erklärung falsch... von: Martin
Geschrieben am: 19.08.2012 13:34:51

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


  

Betrifft: Kraut und Rüben. von: Josef Ehrensberger
Geschrieben am: 19.08.2012 13:42:18


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 »



  

Betrifft: Deine Erklärung feht leider noch immer... von: Martin
Geschrieben am: 19.08.2012 14:04:22

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


  

Betrifft: AW: Deine Erklärung feht leider noch immer... von: Josef Ehrensberger
Geschrieben am: 19.08.2012 14:20:04


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 »



  

Betrifft: Nein.... von: Ramses
Geschrieben am: 19.08.2012 13:54:35

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


  

Betrifft: Fehler meinerseits..... von: Ramses
Geschrieben am: 19.08.2012 14:11:52

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


  

Betrifft: Danke, genau da liegt das Problem... von: Martin
Geschrieben am: 19.08.2012 14:12:05

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


  

Betrifft: AW: Danke, genau da liegt das Problem... von: Josef Ehrensberger
Geschrieben am: 19.08.2012 14:21:42


Hallo Martin,

genau das hab ich doch hier https://www.herber.de/forum/messages/1275626.html beschrieben.




« Gruß Sepp »



  

Betrifft: AW: Danke, genau da liegt das Problem... von: Martin
Geschrieben am: 19.08.2012 14:31:21

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


  

Betrifft: AW: Danke, genau da liegt das Problem... von: Josef Ehrensberger
Geschrieben am: 19.08.2012 14:36:43


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 »



  

Betrifft: Gut, meine Frage ist geklärt, aber... von: Martin
Geschrieben am: 19.08.2012 14:47:20

Hallo Sepp,

danke, meine Frage ist abschließend beantwortet. Hinsichtlich dem Kraut und der Rüben lagst du aber daneben... ;-)

Viele Grüße

Martin


  

Betrifft: Kraut=.ColumnCount - Rüben=.List ;-)) o.T. von: Josef Ehrensberger
Geschrieben am: 19.08.2012 15:43:39

« Gruß Sepp »



  

Betrifft: Eigentl lautet die AW JEIN, ... von: Luc:-?
Geschrieben am: 19.08.2012 19:02:24

…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 :-?


  

Betrifft: Außerdem... von: Josef Ehrensberger
Geschrieben am: 19.08.2012 13:38:38


... 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 »



  

Betrifft: AW: "Echte" Spaltenanzahl in ComboBox festlegen von: Gerd L
Geschrieben am: 19.08.2012 12:33:17

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


  

Betrifft: AW: "Echte" Spaltenanzahl in ComboBox festlegen von: Ramses
Geschrieben am: 19.08.2012 12:04:58

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


  

Betrifft: AW: "Echte" Spaltenanzahl in ComboBox festlegen von: Martin
Geschrieben am: 19.08.2012 12:14:04

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


  

Betrifft: OK - der weiß mehr als ich/wir ;-)) o.T. von: Josef Ehrensberger
Geschrieben am: 19.08.2012 12:15:58

« Gruß Sepp »



  

Betrifft: Ist das jetzt erst oder ironisch gemeint? o.T. von: Martin
Geschrieben am: 19.08.2012 12:21:14

owT


  

Betrifft: Das ist mehr als ironisch gemeint.... von: Ramses
Geschrieben am: 19.08.2012 12:38:54

Hallo

probiers doch einfach mal aus

https://www.herber.de/bbs/user/81479.xlsm

Gruss Rainer


  

Betrifft: AW: Das ist mehr als ironisch gemeint.... von: Martin
Geschrieben am: 19.08.2012 13:04:17

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


  

Betrifft: AW: Das ist mehr als ironisch gemeint.... von: Hajo_Zi
Geschrieben am: 19.08.2012 13:05:57

Hallo Martin,

es gehen auch mehr als 10 Spalten, wenn Du einen Bereich zu weist.

GrußformelHomepage


  

Betrifft: darauf hab ich schon gewartet! o.T. von: Josef Ehrensberger
Geschrieben am: 19.08.2012 13:07:08

« Gruß Sepp »



  

Betrifft: AW: Das ist mehr als ironisch gemeint.... von: Martin
Geschrieben am: 19.08.2012 13:16:27

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


  

Betrifft: AW: Das ist mehr als ironisch gemeint.... von: Hajo_Zi
Geschrieben am: 19.08.2012 13:27:51

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


  

Betrifft: AW: Das ist mehr als ironisch gemeint.... von: Martin
Geschrieben am: 19.08.2012 13:38:13

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


Beiträge aus den Excel-Beispielen zum Thema ""Echte" Spaltenanzahl in ComboBox festlegen"