Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array mit mehrspaltiger Listbox füllen

Forumthread: Array mit mehrspaltiger Listbox füllen

Array mit mehrspaltiger Listbox füllen
Martin
Hallo liebe Excelianer,
eine Listbox kann sehr einfach mit einem Array gefüllt werden: ListBox1.List() = Arr
Leider geht das nicht umgekehrt: Arr = ListBox1.List()
Folgende Lösung habe ich mir geschrieben:
Sub Lösung
For i = 1 To ListBox1.ListCount
For j = 1 To 9
Arr(i, j) = ListBox1.List(i - 1, j - 1)
Next j
Next i
End Sub
Das klappt zwar wunderbar, aber trotzdem würde es mich interessieren, ob es auch eine einfache Lösung wie "Arr = ListBox1.List()" gibt. Ich würde mich über Antworten sehr freuen.
Viele Grüße
Martin
Anzeige
AW: Array mit mehrspaltiger Listbox füllen
21.08.2009 20:33:45
Gerd
Hallo Martin!
Private Sub test()
Dim vnt()
Dim vnt2()
Dim i
Dim j
vnt = Range("a1:c4").Value
ListBox1.ColumnCount = 3
ListBox1.List = vnt
vnt2 = ListBox1.List
For i = 0 To UBound(vnt2, 1)
For j = 0 To UBound(vnt2, 2)
MsgBox vnt2(i, j)
Next
Next
End Sub
Gruß Gerd
Anzeige
Deklariere die Array-Variable dimensionslos
21.08.2009 20:33:53
NoNet
Hallo Martin,
so sollte es funktionieren :
Private Sub CommandButton1_Click()
Dim arr()
arr = ListBox1.List
MsgBox arr(7, 1)
End Sub

Gruß, NoNet
VIELEN DANK! So klappt es! - Aber noch eine Frage
21.08.2009 21:04:43
Martin
Hallo NoNet,
ich frage mich, warum ich darauf nicht selbst gekommen bin. Trotzdem frage ich gleich weiter:
Bislang habe ich mein Array so angelegt, dass es bei (1, 1) begann:
Dim Arr()
ReDim Arr(1 To ListBox1.ListCount, 1 To 9)
Allerdings beginnt das Array bei Deiner Lösung mit (0, 0). Da ich das Array mit "prcSort" noch sortieren möchte, wäre mir (1, 1) als Startpunkt lieber. Besteht die Möglichkeit das Array bei (1, 1) beginnen zu lassen? Wenn es nicht geht, ist es auch nicht schlimm (schließlich habe ich ja eine Lösung).
Viele Grüße
Martin
Anzeige
AW: VIELEN DANK! So klappt es! - Aber noch eine Frage
21.08.2009 21:27:55
Gerd
Hallo Martin,
schicke das Datenfeld in einen Range u. hole es aus diesem wieder zurück.
Gruß Gerd
AW: VIELEN DANK! So klappt es! - Aber noch eine Frage
21.08.2009 21:42:21
Martin
Hallo Gerd,
vielen Dank für deine Antwort, dein Vorschlag funktioniert. Woran liegt es, dass eine einer Range-Zuweisung das Array bei (1, 1) beginnt, bei einer Listbox-Zuweisung jedoch bei (0, 0). Gibt es dafür einen bestimmten Grund?
Viele Grüße
Martin
Anzeige
AW: Indices mal 0- mal 1-basierend
21.08.2009 21:53:41
Gerd
Hallo Martin,
dies wäre eine Frage an die Programmierer von MS.
Gruß Gerd
AW: Indices mal 0- mal 1-basierend
22.08.2009 11:12:34
Nepumuk
Hallo,
weil es keine Zeile / Spalte 0 gibt.
Gruß
Nepumuk
AW: Indices mal 0- mal 1-basierend
22.08.2009 12:31:58
Gerd
Hallo Nepumuk,
... in Tabellen, o.K.
bei einer Listbox-Zuweisung jedoch bei (0, 0)
Dies hätte MS wohl genauso gut analog festlegen können.
Gruß Gerd
Anzeige
AW: Indices mal 0- mal 1-basierend
22.08.2009 12:53:40
Martin
Hallo Gerd, hallo Nepumuk,
auch ich finde es schade, dass die Array-Zuweisung auf (1, 1) bei Range und (0, 0) bei einer Listbox erfolgt. Ich hätte mir wenigstens eine zusätzliche Möglichkeit gewünscht, dass ich manuell Einfluss auf die Zuweisungsart habe (zum Beispiel durch Festlegung des Array-Bereiches). Das wäre zum Beispiele eine schöne Variante gewesen:
Sub Beispiel()
With ListBox1
Dim Arr()
'Festlegung der Zuweisungsart durch Vorgabe des Array-Bereiches
ReDim Arr(1 To .ListCount, 1 To .ColumnCount + 1)
arr = .List
End With
End Sub
Viele Grüße
Martin
Anzeige
AW: Indices mal 0- mal 1-basierend
22.08.2009 13:07:51
Nepumuk
Hallo Gerd,
ne Listbox fängt aber nun mal mit Listindex 0 und Column 0 an. Das ist in sich schon logisch.
Gruß
Nepumuk
Einfach akzeptieren, das ist nicht das Einzige,...
22.08.2009 14:00:14
Luc:-?
...was in xl/VBA diesen Index-Start-Unterschied aufweist, Leute!
In der Mathematik ist auch 0 üblich, anderswo oft auch, mitunter allerdings mit dem Touch einer Obergröße wie bei Gliederungen (bzw der Option fehlender Untergliederungen)...
Da hat jeder Zweck seine eigene Logik und damit jede Form ihre Berechtigung... ;-)
Gruß+schöWE,
Luc :-?
Anzeige
AW: Einfach akzeptieren, das ist nicht das Einzige,...
22.08.2009 15:13:02
Gerd
Hallo Martin,
da bleibt als Alternative nur eine Schleifen-Lösung übrig.
@Luc:
Kenntnis u. Akzeptanz, was sonst ? :-)
Gruß Gerd
Vielen Dank an alle!
22.08.2009 15:44:14
Martin
Hallo Gerd, Nepumuk & Co.,
vielen Dank für Eure Antworten. Meine Frage hatte ich ja eigentlich nur aus Interesse gestellt, obwohl mir eine alternative Lösung bereits vorlag. Für alle, die die Daten einer mehrspaltigen Listbox in ein mehrspaltiges Array mit Beginn bei (1, 1) übertragen wollen, hier noch einmal die Lösung:
Sub Beispiel()
With ListBox1
Dim Arr()
ReDim Arr(1 To .ListCount, 1 To .ColumnCount + 1)
For j = 1 To .ColumnCount + 1
Arr(i, j) = .List(i - 1, j - 1)
Next j
End With
End Sub
Wenn das Array bei (0, 0) beginnen darf, geht es einfacher:
Sub Beispiel2()
Dim Arr()
Arr = ListBox1.List
End Sub
Viele Grüße
Martin
Anzeige
Dein erster Code...
22.08.2009 16:05:50
Tino
Hallo,
müsste meiner Meinung nach so aussehen.
Die ...Count Eigenschaft der Listbox fängt bei 1 an.
Dim Arr()
Dim j As Long, i As Long
With ListBox1
ReDim Arr(1 To .ListCount, 1 To .ColumnCount)
For i = 1 To .ListCount
For j = 1 To .ColumnCount
Arr(i, j) = .List(i - 1, j - 1)
Next i
Next j
End With

Gruß Tino
Anzeige
Danke für den Hinweis, noch eine kleine Änderung
22.08.2009 16:37:47
Martin
Hallo Tino,
vielen Dank für den Hinweis. Der Fehler ist mir unterlaufen, weil ich eigentlich mit UBound arbeiten wollte, das aber vergessen hatte.
Da die ColumnCount-Eigenschaft lediglich die Anzahl der anzuzeigenden Spalten angibt, kann ColumnCount von der tatsächlichen Spaltenanzahl der Listbox abweichen. In der Excel-Hilfe zur ColumnCount-Eigenschaft steht: "Gibt die Anzahl der Spalten an, die in einem Listenfeld oder in einem Kombinationsfeld angezeigt werden sollen." Daher wäre es aus meiner Sicht sinnvoller die tatsächliche Spaltenanzahl mit "UBound(.List, 2) + 1" zu ermitteln:
Sub Beispiel()
Dim Arr()
Dim j As Long, i As Long
With ListBox1
ReDim Arr(1 To .ListCount, 1 To UBound(.List, 2) + 1)
For i = 1 To .ListCount
For j = 1 To UBound(.List, 2) + 1
Arr(i, j) = .List(i - 1, j - 1)
Next i
Next j
End With
End Sub
Viele Grüße
Martin
Anzeige
gleicher Fehler
22.08.2009 23:03:11
Tino
Hallo,
beim blind schreiben ist dir der gleiche Fehler wie mir unterlaufen.
In der Schleife i und j vertauscht.
Gruß Tino
AW: gleicher Fehler
24.08.2009 15:28:17
Martin
Hallo Tino,
richtig, aber jetzt haben wir es aber endgültig geschafft!
Nun noch einmal offiziell für alle die richtige Lösung:
Sub Beispiel()
Dim Arr()
Dim j As Long, i As Long
With ListBox1
ReDim Arr(1 To .ListCount, 1 To UBound(.List, 2) + 1)
For i = 1 To .ListCount
For j = 1 To UBound(.List, 2) + 1
Arr(i, j) = .List(i - 1, j - 1)
Next j
Next i
End With
End Sub

Viele Grüße
Martin
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Array mit mehrspaltiger Listbox füllen


Schritt-für-Schritt-Anleitung

Um eine mehrspaltige Listbox in Excel mit einem Array zu füllen, kannst Du die folgenden Schritte befolgen:

  1. Erstelle eine UserForm: Füge eine ListBox und einen CommandButton hinzu.
  2. Füge den folgenden VBA-Code ein:
Private Sub CommandButton1_Click()
    Dim Arr() As Variant
    Dim i As Long, j As Long

    ' Anzahl der ListBox-Spalten angeben
    ListBox1.ColumnCount = 3

    ' Beispiel-Daten in das Array
    Arr = Range("A1:C4").Value

    ' Füllen der ListBox mit dem Array
    ListBox1.List = Arr
End Sub
  1. Fülle die ListBox: Wenn Du den Button klickst, sollte die ListBox mit den Daten aus dem Array gefüllt werden.
  2. Daten aus der ListBox in ein Array überführen: Um die Daten aus der ListBox zurück in ein Array zu übertragen, kannst Du folgenden Code verwenden:
Private Sub CommandButton2_Click()
    Dim Arr() As Variant
    Dim i As Long, j As Long

    ReDim Arr(1 To ListBox1.ListCount, 1 To ListBox1.ColumnCount)

    For i = 1 To ListBox1.ListCount
        For j = 1 To ListBox1.ColumnCount
            Arr(i, j) = ListBox1.List(i - 1, j - 1)
        Next j
    Next i
End Sub

Häufige Fehler und Lösungen

  • Fehler: "Typ nicht übereinstimmend": Dieser Fehler tritt häufig auf, wenn die ListBox nicht korrekt initialisiert wurde oder der Datentyp des Arrays nicht mit dem Inhalt der ListBox übereinstimmt. Stelle sicher, dass die ListBox die richtige Anzahl an Spalten hat und dass die Daten im Array korrekt formatiert sind.

  • Fehler: "Index außerhalb des Bereichs": Dies passiert, wenn Du versuchst, auf ein Element zuzugreifen, das nicht existiert. Achte darauf, dass Du die Schleifenbedingungen korrekt setzt, beispielsweise For i = 1 To ListBox1.ListCount.


Alternative Methoden

Eine einfachere Methode, um die ListBox mit einem Array zu füllen, besteht darin, die Daten direkt aus einem Excel-Bereich zu lesen:

Private Sub CommandButton3_Click()
    Dim Arr As Variant
    Arr = Range("A1:C4").Value
    ListBox1.List = Arr
End Sub

Diese Methode ist effizient, wenn die Daten bereits in einem Excel-Bereich vorliegen.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie Du mit einer mehrspaltigen ListBox und einem Array umgehen kannst:

  1. Daten aus dem Arbeitsblatt in die ListBox einfügen:

    ListBox1.List = Range("A1:C4").Value
  2. Daten aus der ListBox in ein Array übertragen:

    Dim Arr() As Variant
    ReDim Arr(1 To ListBox1.ListCount, 1 To ListBox1.ColumnCount)
    For i = 1 To ListBox1.ListCount
       For j = 1 To ListBox1.ColumnCount
           Arr(i, j) = ListBox1.List(i - 1, j - 1)
       Next j
    Next i
  3. Daten sortieren: Nachdem Du die Daten in ein Array überführt hast, kannst Du sie sortieren oder anderweitig verarbeiten.


Tipps für Profis

  • Verwende UBound: Um die Größe des Arrays dynamisch zu bestimmen, nutze UBound anstelle fester Werte. Dies macht Deinen Code flexibler.

  • Behandle 0-basierte Indizes: Sei Dir bewusst, dass die ListBox 0-basierte Indizes verwendet, während viele Arrays in VBA 1-basiert sind. Achte beim Zugriff auf die Elemente darauf.

  • Datenvalidierung: Füge eine Validierung ein, bevor Du auf die ListBox zugreifst, um sicherzustellen, dass sie nicht leer ist.


FAQ: Häufige Fragen

1. Kann ich die ListBox auch ohne eine UserForm verwenden?
Ja, Du kannst eine ListBox auch in einem Arbeitsblatt verwenden, jedoch ist die Handhabung etwas anders.

2. Warum beginnt das Array bei (0, 0) und nicht bei (1, 1)?
Die ListBox verwendet 0-basierte Indizes, während VBA-Arrays standardmäßig 1-basiert sind. Du kannst jedoch Arrays so anpassen, dass sie bei (1, 1) beginnen, indem Du ReDim entsprechend anwendest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige