ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 10.01.2000

Diese Seite wurde zuletzt aktualisiert am 10.01.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Zurück...


Anzeige

(-hg) mailto:hg_joinex@aboutvb.de

Das Gegenstück zur MSDN-Library - VB SplitSplit-Funktion in Visual Basic 6 ist die MSDN-Library - VB JoinJoin-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


Modul modJoinEx.bas (modJoinEx.bas - ca. 10,5 KB)






Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer