VBA Tipp: IN-Klausel aus Mehrfach-Listenfeld erzeugen

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich möchte aus den gewählten Einträgen eines Mehrfach-Listenfelds einen Filter für SQL erstellen.

Lösung

Die folgende Funktion liefert die Werte der Spalte lCol (0 ist die erste Spalte, 1 die zweite usw.) des Listenfeldes sCtrName auf dem Formular sFrmName, getrennt durch den String sSep.

Dabei werden die Werte der Einträge "umhüllt" von dem String in sLimiter:

Public Function GetItemsSelected(sFrmName As String, _
                                sCtrName As String, _
                                Optional sLimiter As String = "", _
                                Optional lCol As Long = -1, _
                                Optional sSep As String = ",") As String
On Error GoTo ER_
    Dim V As Variant
    Dim sOut As String
    Dim lBoundColumn As Long
 
    With Forms(sFrmName).Controls(sCtrName)
 
        lBoundColumn = .BoundColumn
 
        If lCol <> -1 Then .BoundColumn = lCol + 1
 
        For Each V In .ItemsSelected
            sOut = sOut & ", " & sLimiter & .ItemData(V) & sLimiter
        Next
 
        sOut = Mid(sOut, 3)
 
        .BoundColumn = lBoundColumn
 
    End With
 
EX_:
    GetItemsSelected = sOut
    Exit Function
ER_:
    sOut = ""
    Resume EX_
 
End Function

Aufruf

Wählt der User zB. aus einem einspaltigen Mehrfach-Listenfeld mit den Einträgen 1,2,3,4,5 den ersten und zweiten Eintrag, so zeigt der Aufruf

MsgBox GetItemsSelected("DasFormular", "DasListenfeld")

eine Messagebox mit dem Text:

1,2


Wählt der User z.B. aus einem zweispaltigen Mehrfach-Listenfeld mit den Einträgen a,b,c,d,e in der gebundenen Spalte den dritten und vierten Eintrag, so zeigt der Aufruf

MsgBox GetItemsSelected("DasFormular", "DasListenfeld", "'")

eine Messagebox mit dem Text:

'c','d'


Wählt der User aus einem dreispaltigen Mehrfach-Listenfeld mit den Einträgen

1 a abc
2 b def
3 c ghi
4 d jkl

und gebundener Spalte 1 den zweiten Eintrag und vierten Eintrag, so zeigt der Aufruf

MsgBox GetItemsSelected("DasFormular", "DasListenfeld","'",2,";")

eine Messagebox mit dem Text:

'def';'jkl'