Letzte Änderung am 17.07.2015
In diesem Abschnitt beschäftigen wir uns mit der Möglichkeit, Daten über eine Multiselektion aus einem Listenfeld zu übergeben. Dazu muss die entsprechende Eigenschaft im Eigenschaftenfesnster aktiviert werden.

Neben der Bezeichnung Multiselect wird wird die Option 1 - fmMultiSelectMulti ausgewählt. Möglich wäre auch 2 - fmMultiSelectExtended, das würde bewirken, dass die Multi-Auswahl nur bei gedrückter Steuerungstaste (Strg) möglich ist.

  • Mit VBA
  • Private Sub UserForm_Activate()
    ListBox1.MultiSelect = fmMultiSelectMulti
    End Sub

    Die Grundvoraussetzungen für die Multiauswahl sind nun geschaffen. Nun muss noch die getroffene Auswahl erfasst werden. Wenn im Listenfeld die Tabelle, oder Teile davon (bezogen auf die Spalten), dargestellt ist, könnte man das über den ListIndex der Auswahlen abarbeiten.
    Da aber im Listenfeld häufig nicht alle Zeilen der Tabelle dargestellt werden, weil es sich um das Ergebnis einer Vorauswahl handelt, gehe ich nur auf diesen Fall ein. Diese Methode hat dann den Vorteil, dass sie in jedem Fall funktioniert.
    Da bei einer Vorauswahl weniger Zeilen in der Listbox sind, als in der Herkunfttabelle, versteht es sich von selbst, dass man über den ListIndex des Listenfeldes keinen Bezug zu den Zeilen der Herkunfttabelle herstellen kann.
    Angenommen wir haben so eine Liste:
    Anrede Vorname Nachname Straße PLZ Ort
    Frau Agathe Noth-Helfer Gartenstr. 8 72764 Reutlingen
    Frau Anne Kaffek Bahnstr. 456 40852 Düsseldorf
    Herr Anton Kumpel Knappenweg 6 15295 Brieskow-Finkenheerd
    Herr Hans Guck in die Luft Adelsweg 234 40396 Düsseldorf
    Herr Harry Hurtig Hauptstr. 90 41265 Düsseldorf
    Herr Hans Wurst Sandhauserstraße 107b 13505 Berlin
    Frau Ilona Zimmermann Zugweg 23 53225 Bonn
    Firma Insolventia Habenichts Pleitegeier 1 40665 Düsseldorf
    Herr Jack Black Casinoweg 67 50986 Köln
    Herr Jan Enzi Bahnhofstr. 29 a 15518 Briesen
    Herr Jörg Knutsen Elbchausse 1 20477 Hamburg
    Herr Karl Werti an der B 1 14778 Brandenburg
    Herr Knut Hansen An der Alster 1 20355 Hamburg
    Herr Kulti Multi Zeithstr. 109 53819 Neunkirchen-Seelscheid
    Frau Linde Kirch Finkenstr. 61-63 45772 Marl
    Frau Magdalene Müller Hauptstr. 30 34431 Marsberg
    Frau Marie Pech G.-Hauptmann-Str. 15 03044 Cottbus
    Herr Mark Walsum Bahnstr. 31 53894 Mechernich
    Herr Martin Meier Martinsweg 97 20987 Hamburg
    Firma Maximo Lieder Ostring 3 47441 Moers
    Frau Moni Maier Mohnweg 65 80987 München
    Herr Motte Klar Hauptstr. 94 53340 Meckenheim
    Herr Oskar Goldner Spicher Str. 4 53859 Niederkassel
    Frau Sandra Sonnenschein Kölner Str. 6 51254 Köln
    Frau Sieglinde Nächste Königswinterstraße 8 10318 Berlin
    Frau Susi Sorglos Im Feld 4 51362 Köln
    Herr Theo Tausendsassa Am Rhein 5 51365 Köln
    Frau Tina Tussnelda Am Hang 3 50696 Köln
    Frau Wally Gaier Berg Weg 45 50986 Köln
    Herr Walter Maingod Damaschkestraße 26 10711 Berlin
    Herr Jim Beam Whiskeyweg 12 34567 Suffhausen
    Firma Toni Trappa Galoppweg 34 12345 Musterstadt
    Herr Reiner Zufall Bergweg 21 55666 Schwachhausen
    Aus dieser Liste sollen nur die Damen in der Listbox erscheinen. Das könnte man mit einem Makro so lösen:
    Private Sub CommandButton1_Click()
    Dim intZeile As Integer
    Dim intSpalte As Integer
    For intZeile = 2 To 34
        If Tabelle1.Cells(intZeile, 1) = "Frau" Then
            ListBox1.AddItem Tabelle1.Cells(intZeile, 1)
                ListBox1.List(ListBox1.ListCount - 1, 1) = Tabelle1.Cells(intZeile, 2)
                ListBox1.List(ListBox1.ListCount - 1, 2) = Tabelle1.Cells(intZeile, 3)
                ListBox1.List(ListBox1.ListCount - 1, 3) = Tabelle1.Cells(intZeile, 4)
                ListBox1.List(ListBox1.ListCount - 1, 4) = Tabelle1.Cells(intZeile, 5)
                ListBox1.List(ListBox1.ListCount - 1, 5) = Tabelle1.Cells(intZeile, 6)
                ListBox1.List(ListBox1.ListCount - 1, 6) = intZeile
        End If
    Next intZeile
    End Sub
    
    Natürlich gibt es bessere Methoden, Daten in ein Listenfeld zu bekommen, als die hier vorgestellte. Es geht mir aber darum, ein Beispiel zu geben, dass auch Einsteiger nachvollziehen können. Der wesentliche Punkt der Vorgehensweise ist diese Zeile: ListBox1.List(ListBox1.ListCount - 1, 6) = intZeile. Damit wird in dem Listenfeld in jedem Datensatz die Zeilennummer der Datenherkunft eingetragen. Dieses Datenfeld kann auch ausgeblendet werden. Bei der Datenauswahl kann man im Rahmen der Multiauswahl darauf zurückgreifen. Damit ist sicher gestellt, dass immer der richtige Datensatz angesprochen wird.