|
Das Gegenstück zur Split-Funktion
in Visual Basic 6 ist die Join-Funktion.
Sie verkettet die Elemente eines Arrays unter optionaler Einfügung
eines Trenn-Strings zu einem Gesamt-String. Allerdings hat sie zwei
Nachteile. Zum einen steht sie eben erst ab VB 6 zur
Verfügung, zum anderen kann sie nur die Elemente eines Arrays
verketten. Möchten Sie jedoch die Elemente eines Objekts wie einer
Collection, einer ListBox, einer ComboBox oder einer FileListBox
verketten, oder steht Ihnen nur VB 5 zur Verfügung,
müssen Sie eine eigene Lösung schaffen. Die hier vorgestellte
Funktion JoinEx ist eine solche Lösung und bietet zudem noch
einigen zusätzlichen Komfort.
Sie können JoinEx sowohl ein Array als auch eines der genannten
Objekte übergeben. JoinEx macht jedoch nichts anderes, als den
übergebenen Typ zu ermitteln und die Parameter an die
spezialisierten Hilfsfunktionen JoinExArray, JoinExCollection oder
JoinExList weiter zu reichen. Sie können diese Hilfsfunktionen auch
direkt aufrufen - der Funktionsname "JoinEx" ist lediglich
ein wenig leichter im Gedächtnis zu behalten.
Das erste der Komfort-Feature der JoinEx-Funktionen stellt die
Möglichkeit dar, im optionalen Parameter TrimSeparator festzulegen,
ob die Verkettung der Elemente mit dem Separator abgeschlossen
werden soll oder nicht (Voreinstellung).
Weiterhin können Sie optional festlegen, mit welchem Element die
Verkettung beginnen soll (Parameter First, Voreinstellung: mit dem
ersten), wie viele Elemente ab dem Startelement verkettet werden
sollen (Parameter Count) oder welches das letzte verkettete Element
sein soll (Parameter Last).
Dann können Sie sowohl festlegen, ob die Reihenfolge umgekehrt
werden soll (Parameter Reverse), und ob das Start- und das
Schlusselement gegebenenfalls automatisch vertauscht werden, falls
das Startelement größer als das Schlusselement sein sollte
(Parameter SwapRange).
Alternativ zu den Angaben von Startelement, Anzahl oder
Schlusselement können Sie auch eine Index-Liste als Array
übergeben (Parameter IndexList). In dieser Liste übergeben Sie die
Indices, die verkettet werden sollen, separat in der gewünschten
Reihenfolge. Geben Sie hier zusätzlich Reverse = True
an, wird diese Reihenfolge wiederum umgekehrt.
Übergeben Sie JoinEx bzw. JoinExList eine ListBox, können Sie
im Parameter Selected zusätzlich noch angeben, ob nur markierte
Elemente der Liste berücksichtigt werden sollen. Dabei wird noch
unterschieden (Enumeration jxSelectedConstants), ob sich bei der
Angabe von Start-, Schlusselement oder Anzahl diese Angabe absolut
auf die Gesamtheit der ListBox-Elemente oder nur relativ auf die
Menge der markierten Elemente beziehen sollen.
Sollte in einer der Funktionen ein Fehler auftreten, kehrt sie
ohne Ergebnis zurück. Den Fehler können Sie dann wie gewohnt über
das Err-Objekt ermitteln.
Public Enum jxSelectedConstants
jxAll
jxSelected
jxSelectedRange
End Enum
Public Function JoinEx(Data As Variant, _
Optional Separator As String = "", _
Optional TrimSeparator As Boolean = True, _
Optional ByVal First As Variant, _
Optional ByVal Count As Variant, _
Optional ByVal Last As Variant, _
Optional ByVal Reverse As Boolean, _
Optional ByVal SwapRange As Boolean = False, _
Optional IndexList As Variant, _
Optional ByVal Selected As jxSelectedConstants) As String
Dim nObj As Object
If IsArray(Data) Then
JoinEx = JoinExArray(Data, Separator, TrimSeparator, First, _
Count, Last, Reverse, SwapRange, IndexList)
ElseIf IsObject(Data) Then
Set nObj = Data
Select Case TypeName(Data)
Case "Collection", "ListBox", "ComboBox", "FileListBox"
JoinEx = JoinExList(nObj, Separator, TrimSeparator, First, _
Count, Last, Reverse, SwapRange, IndexList, Selected)
End Select
End If
End Function
Public Function JoinExArray(Data As Variant, _
Optional Separator As String = "", _
Optional TrimSeparator As Boolean = True, _
Optional ByVal First As Variant, _
Optional ByVal Count As Variant, _
Optional ByVal Last As Variant, _
Optional ByVal Reverse As Boolean, _
Optional ByVal SwapRange As Boolean = False, _
Optional IndexList As Variant) As String
Dim l As Long
Dim nFirst As Long
Dim nLast As Long
Dim nSwap As Long
Dim nReverse As Boolean
Dim nStep As Integer
Dim nJoinEx As String
Dim nTest As String
On Error GoTo Error_JoinExArray
If IsEmpty(Data) Then
Exit Function
End If
nTest = Data(LBound(Data))
If IsMissing(IndexList) Then
If IsMissing(First) Then
nFirst = LBound(Data)
Else
nFirst = First
End If
If IsMissing(Count) Then
If IsMissing(Last) Then
nLast = UBound(Data)
Else
nLast = Last
End If
Else
nLast = nFirst + Count - 1
End If
If Reverse Then
nReverse = True
nStep = -1
Else
nStep = 1
End If
If SwapRange Then
If nLast < nFirst Then
nReverse = Not nReverse
End If
End If
If nReverse Then
nSwap = nLast
nLast = nFirst
nFirst = nSwap
End If
If nFirst < LBound(Data) Then
nFirst = LBound(Data)
End If
If nLast > UBound(Data) Then
nLast = UBound(Data)
End If
For l = nFirst To nLast Step nStep
nJoinEx = nJoinEx & Data(l) & Separator
Next 'l
Else
If Reverse Then
nFirst = UBound(IndexList)
nLast = LBound(IndexList)
nStep = -1
Else
nLast = UBound(IndexList)
nFirst = LBound(IndexList)
nStep = 1
End If
For l = nFirst To nLast Step nStep
Select Case IndexList(l)
Case LBound(Data) To UBound(Data)
nJoinEx = nJoinEx & Data(IndexList(l)) & Separator
End Select
Next 'l
End If
If TrimSeparator Then
If Len(nJoinEx) Then
nJoinEx = Left$(nJoinEx, Len(nJoinEx) - Len(Separator))
End If
End If
JoinExArray = nJoinEx
Error_JoinExArray:
End Function
Public Function JoinExCollection(Coll As Collection, _
Optional Separator As String = "", _
Optional TrimSeparator As Boolean = True, _
Optional ByVal First As Variant, _
Optional ByVal Count As Variant, _
Optional ByVal Last As Variant, _
Optional ByVal Reverse As Boolean, _
Optional ByVal SwapRange As Boolean = False, _
Optional IndexList As Variant) As String
Dim l As Long
Dim nFirst As Long
Dim nLast As Long
Dim nSwap As Long
Dim nReverse As Boolean
Dim nStep As Integer
Dim nJoinEx As String
With Coll
If .Count = 0 Then
Exit Function
End If
If IsMissing(IndexList) Then
If IsMissing(First) Then
nFirst = 1
Else
nFirst = First
End If
If IsMissing(Count) Then
If IsMissing(Last) Then
nLast = .Count
Else
nLast = Last
End If
Else
nLast = nFirst + Count - 1
End If
If Reverse Then
nReverse = True
nStep = -1
Else
nStep = 1
End If
If SwapRange Then
If nLast < nFirst Then
nReverse = Not nReverse
End If
End If
If nReverse Then
nSwap = nLast
nLast = nFirst
nFirst = nSwap
End If
If nFirst < 1 Then
nFirst = 1
End If
If nLast > .Count Then
nLast = .Count
End If
For l = nFirst To nLast
nJoinEx = nJoinEx & .Item(l) & Separator
Next 'l
Else
On Error GoTo Error_JoinExCollection
If Reverse Then
nFirst = UBound(IndexList)
nLast = LBound(IndexList)
nStep = -1
Else
nLast = UBound(IndexList)
nFirst = LBound(IndexList)
nStep = 1
End If
For l = nFirst To nLast Step nStep
Select Case IndexList(l)
Case 1 To .Count
nJoinEx = nJoinEx & .Item(IndexList(l)) & Separator
End Select
Next 'l
End If
If TrimSeparator Then
If Len(nJoinEx) Then
nJoinEx = Left$(nJoinEx, Len(nJoinEx) - Len(Separator))
End If
End If
End With
JoinExCollection = nJoinEx
Error_JoinExCollection:
End Function
Public Function JoinExList(List As Object, _
Optional Separator As String = "", _
Optional TrimSeparator As Boolean = True, _
Optional ByVal First As Variant, _
Optional ByVal Count As Variant, _
Optional ByVal Last As Variant, _
Optional ByVal Reverse As Boolean, _
Optional ByVal SwapRange As Boolean = False, _
Optional IndexList As Variant, _
Optional ByVal Selected As jxSelectedConstants) As String
Dim l As Long
Dim nFirst As Long
Dim nLast As Long
Dim nSwap As Long
Dim nReverse As Boolean
Dim nStep As Integer
Dim nJoinEx As String
Dim nSelected() As String
Dim nIndex As Long
With List
If .ListCount = 0 Then
Exit Function
End If
If IsMissing(IndexList) Then
If IsMissing(First) Then
nFirst = 0
Else
nFirst = First
End If
If IsMissing(Count) Then
If IsMissing(Last) Then
nLast = .ListCount - 1
Else
nLast = Last
End If
Else
nLast = nFirst + Count - 1
End If
If Reverse Then
nReverse = True
nStep = -1
Else
nStep = 1
End If
If SwapRange Then
If nLast < nFirst Then
nReverse = Not nReverse
End If
End If
If nReverse Then
nSwap = nLast
nLast = nFirst
nFirst = nSwap
End If
If nFirst < 0 Then
nFirst = 0
End If
If nLast > .ListCount - 1 Then
nLast = .ListCount - 1
End If
If TypeName(List) = "ListBox" Then
Select Case Selected
Case jxAll
For l = nFirst To nLast
nJoinEx = nJoinEx & .List(l) & Separator
Next 'l
Case jxSelected
For l = nFirst To nLast
If .Selected(l) Then
nJoinEx = nJoinEx & .List(l) & Separator
End If
Next 'l
Case jxSelectedRange
ReDim nSelected(0 To .SelCount - 1)
For l = 0 To .ListCount - 1
If .Selected(l) Then
nSelected(nIndex) = .List(l)
nIndex = nIndex + 1
End If
Next 'l
JoinExList = JoinExArray(nSelected, Separator, _
TrimSeparator, First, Count, Last)
Exit Function
End Select
Else
For l = nFirst To nLast
nJoinEx = nJoinEx & .List(l) & Separator
Next 'l
End If
Else
On Error GoTo Error_JoinExList
If Reverse Then
nFirst = UBound(IndexList)
nLast = LBound(IndexList)
nStep = -1
Else
nLast = UBound(IndexList)
nFirst = LBound(IndexList)
nStep = 1
End If
If Selected Then
For l = nFirst To nLast Step nStep
Select Case IndexList(l)
Case 0 To .ListCount - 1
If .Selected(IndexList(l)) Then
nJoinEx = nJoinEx & .List(IndexList(l)) & Separator
End If
End Select
Next 'l
Else
For l = nFirst To nLast Step nStep
Select Case IndexList(l)
Case 0 To .ListCount - 1
nJoinEx = nJoinEx & .List(IndexList(l)) & Separator
End Select
Next 'l
End If
End If
If TrimSeparator Then
If Len(nJoinEx) Then
nJoinEx = Left$(nJoinEx, Len(nJoinEx) - Len(Separator))
End If
End If
End With
JoinExList = nJoinEx
Error_JoinExList:
End Function

|