Daten rein und raus - Listenfeld - Multiselektion |
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. | ||
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.