Letzte Änderung am 30.01.2010
In diesem Abschnitt beschäftigen wir uns mit dem Möglichkeiten, Daten über ein Listenfeld (ListBox) mit einer Liste auszutauschen. Zunächst sehen wir uns die Möglichkeiten an, Daten in die Box zu schreiben. Da gibt es, wie wir sehen werden, einige.

RowSource

Diese Eigenschaft kann auf zwei Arten gesetzt werden.
  • Über das Eigenschaftenfenster

  • Neben der Bezeichnung RowSource wird der Bereich eingetragen. Im Beispiel A1:A10 als Zellbereich. Es können auch mehrspaltige Inhalte eingefügt werden, dann muß neben ColumnCount die Zahl der gewünschten Spalten eingegeben werden. (Standard ist 1).

  • Mit VBA
  • Private Sub UserForm_Activate()
    ListBox1.RowSource = "A1:A10"
    End Sub

    Wenn der Füllbereich über RowSource gesetzt wird, spricht man auch von einem gebundenen Listenfeld. In diesem Fall kann die Spaltenüberschrift in der Auswahlliste mit dargestellt werden. Dazu muß der Parameter bei ColumnHeads auf True gesetzt sein.

    Range

    Eine weitere Möglichkeit einen Bereich an das Listenfeld zu übergeben, ist die Verwendung einer Range:
    Private Sub UserForm_Activate()
    ListBox1.List = Sheets("Tabelle1").Range("A1:A10").Value
    End Sub
    ListBox1.RowSource = "A1:K1" geht leider nicht. Sollen Inhalte aus einer Zeile angezeigt werden, geht das zum Beispiel mit dieser Anweisung:
    Private Sub UserForm_Activate()
    ListBox1.List = Application.WorksheetFunction.Transpose(Range("A1:D1"))
    End Sub

    AddItem

    Die Anweisung AddItem eignet sich besondern gut, wenn es darum geht, aus einer Liste nur die Werte zu übernehmen, die bestimmte Kriterien erfüllen. Im ersten Beispiel ist zunächt der Grundaufbau dargestellt. Auf der rechten Seite werden nur die Zellen übernommen, die auch einen Inhalt haben. Da in einem Listenfeld mesitens mehr als eine Spalte dargestellt werden, habe ich ein entsprechendes Beisiel gewählt. Man kann erkennen, das die ListBox ein zweidimensionales Variablenfeld besitzt. Die Felder fangen jeweils bei 0 (Null) an zu zählen.
    Die Anweisung
    Private Sub UserForm_Activate()
    For iAnzahl = 0 To 10
            ListBox1.AddItem
            ListBox1.List(iAnzahl, 0) = Sheets("Tabelle1").Cells(iAnzahl + 2, 1)
            ListBox1.List(iAnzahl, 1) = Sheets("Tabelle1").Cells(iAnzahl + 2, 2)
            ListBox1.List(iAnzahl, 2) = Sheets("Tabelle1").Cells(iAnzahl + 2, 3)
            ListBox1.List(iAnzahl, 3) = Sheets("Tabelle1").Cells(iAnzahl + 2, 4)
            ListBox1.List(iAnzahl, 4) = Sheets("Tabelle1").Cells(iAnzahl + 2, 5)
    Next iAnzahl
    End Sub
     
    Nur ausgewählte Zeilen. (Buchstabe K in Spalte F).
    Private Sub UserForm_Activate()
    Dim iLiZahl As Integer
    For iAnzahl = 2 To 10
         If Sheets("Tabelle1").Cells(iAnzahl, 6) = "K" Then
            ListBox1.AddItem
            ListBox1.List(iLiZahl, 0) = Sheets("Tabelle1").Cells(iAnzahl, 1)
            ListBox1.List(iLiZahl, 1) = Sheets("Tabelle1").Cells(iAnzahl, 2)
            ListBox1.List(iLiZahl, 2) = Sheets("Tabelle1").Cells(iAnzahl, 3)
            ListBox1.List(iLiZahl, 3) = Sheets("Tabelle1").Cells(iAnzahl, 4)
            ListBox1.List(iLiZahl, 4) = Sheets("Tabelle1").Cells(iAnzahl, 5)
            iLiZahl = iLiZahl + 1
        End If
    Next iAnzahl
    End Sub
    
    Im zweiten Beispiel ist es wichtig zu beachten, dass der Zähler (iLiZahl) für das Listenfeld nur weiter gezählt wird, wenn eine weitere Zeile übernommen wurde.
    Auf die folgende Liste angewendet, würde der erste Quelltext die komplette Liste in das Listenfeld einlesen. Der zweite nur die Zeilen, die in Spalte F mit dem Buchstaben K gekennzeichnet sind.
    Tabelle1

     ABCDEF
    1Spalte 1Spalte 2Spalte 3Spalte 4Spalte 5Kriterium
    2Mein Inhalt 171545829 
    3Mein Inhalt 23178277K
    4Mein Inhalt 38271542 
    5Mein Inhalt 487803897K
    6Mein Inhalt 58869537 
    7Mein Inhalt 65377660 
    8Mein Inhalt 747306365K
    9Mein Inhalt 827288383 
    10Mein Inhalt 959999223 


    Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

    Formate mit einlesen (AddItem)

    Datum kommt geht Ist (Min) Differenz Saldo
    Mo. 18.Mrz. 07:15 15:30 495 30 1541
    Di. 19.Mrz. 07:15 15:30 495 30 1571
    Mi. 20.Mrz. 07:15 15:30 495 30 1601
    Do. 21.Mrz. 07:15 15:30 495 30 1631
    Fr. 22.Mrz. 07:15 15:30 495 55 1686
    Angenommen, es sollen Daten aus einer Liste wie dieser, in ein Listenfeld eingelesen werden, dann sieht das Ergebnis mit dem Makro von oben so aus:
    Nicht so der "Bringer" oder? Mit entsprechenden Anweisungen werden die Zahlenformate entsprechend definiert und abgebildet:
    Private Sub UserForm_Activate()
    For iAnzahl = 0 To 10
            ListBox1.AddItem
            ListBox1.List(iAnzahl, 0) = Format(Sheets("Tabelle4").Cells(iAnzahl + 2, 1), "ddd. dd. mmm.")
            ListBox1.List(iAnzahl, 1) = Format(Sheets("Tabelle4").Cells(iAnzahl + 2, 2), "hh:mm")
            ListBox1.List(iAnzahl, 2) = Format(Sheets("Tabelle4").Cells(iAnzahl + 2, 3), "hh:mm")
            ListBox1.List(iAnzahl, 3) = Sheets("Tabelle4").Cells(iAnzahl + 2, 4)
            ListBox1.List(iAnzahl, 4) = Sheets("Tabelle4").Cells(iAnzahl + 2, 5)
            ListBox1.List(iAnzahl, 5) = Sheets("Tabelle4").Cells(iAnzahl + 2, 6)
    Next iAnzahl
    End Sub
    
    Das Ergebnis:

    Daten mit Array einlesen

    Leider eignet sich die oben beschriebene Methode (AddItem) nur, um bis zu 10 Spalten in die Listbox einzulesen. Werden mehr Spalten benötigt, muss man entweder auf die RowSource-Methode zurück greifen, oder die im folgenden beschriebene Vorgehensweise mit einen Variant-Array gewält werden.
    Die Möglichkeit mit dem Array bietet dem Anwender auch die Option einzelne, nach bestimmten Bedingungen ausgewählte Datenzeilen in die Listbox zu schreiben, so wie das auch bei der AddItem-Methode geht, nur eben ohne die Beschränkung der Spaltenanzahl.
    So sieht das Makro aus:
    Option Explicit
    
    Private Sub UserForm_Activate()
        Dim iLiZahl As Integer
        Dim varLiArr(20, 15) As Variant
        Dim intSpalte As Integer
        Dim intZeile As Integer
        Dim intAnz As Integer
        For intZeile = 2 To 10
            If Sheets("Tabelle3").Cells(intZeile, 6) = "K" Then
                For intSpalte = 1 To 16
                    varLiArr(intAnz, intSpalte - 1) = Sheets("Tabelle3").Cells(intZeile, intSpalte)
                Next intSpalte
                intAnz = intAnz + 1
            End If
        Next intZeile
        ListBox1.List = varLiArr
    End Sub
    

    Quelltexte eingefügt mit: Excel Code Jeanie


     
    Zunächst wollen wir uns ansehen, wie einzelne Werte aus der Listbox übergeben werden können. Dazu betrachten wir das folgende Schema.
    0.00.10.20.30.40.5
    1.01.11.21.31.41.5
    2.02.12.22.32.42.5
    3.03.13.23.33.43.5
    4.04.14.24.34.44.5
    5.05.15.25.35.45.5
    6.06.16.26.36.46.5
    7.07.17.27.37.47.5
    8.08.18.28.38.48.5
    9.09.19.29.39.49.5
    Im Bild oben ist dargestellt, mit welcherAdresse die Werte aus dem Listenfeld ausgelesen werden können. Bezogen auf den Ausschnitt aus Tabelle1 im Bild darüber würde die Anweisung wert = Listbox1.List(2, 2) den Wert 71 an die Variable wert übergeben. Nun ist es natürlich nicht sinnvoll, aus einer Listenfeld Werte zu übergeben die von ihrer Adresse her festliegen. Dies Beispiel sollte nur noch mal das Prinzip der Adressen verdeutlichen. Die Auswahl würde sicher durch markieren einer Zeile im Listenfeld erfolgen. Diese Markierung gibt unter anderen den Wert des ListIndex zurück. Dafür gelten die Werte 0 für die erste Zeile, 1 für die zweite Zeile usw. Das stimmt also mit unseren Adressen in der Darstellung weiter oben überein.
    Damit könnte unsere Anweisung von oben so aussehen: wert = Listbox1.List(Listbox1.ListIndex, 2) Das heisst, es wird immer der Wert aus der 3. Spalte zurück gegeben, aber jetzt in Abhängigkeit von der markierten Zeile. Wir haben eine flexiblere Auswahl als mit einer festen Adresse.