Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Pseudo-List(Of T) in VBA
zurück: RELEASE: Stundenplantool weiter: Ribbon-Tab in Excel 2007 ansteuern Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Higlav
Excel-Kenner, VBA-Kenner, VB.NET-Kenner


Verfasst am:
04. Jan 2014, 18:26
Rufname:
Wohnort: Zürich


Pseudo-List(Of T) in VBA - Pseudo-List(Of T) in VBA

Nach oben
       Version: Office 2010

Hallo liebe Community,

Ich als VB.NET-Programmierer geniesse unter anderem die Verwendung von der Klasse List(Of T). Sie stellt eine einfache Liste dar und bringt viele nützliche Funktionen mit, die ich in VBA nicht mehr missen möchte. Also habe ich mich hingesetzt und eine ListOfObject-Klasse geschrieben, in der ihr alle Objekte speichern könnt. Ich integrierte auch Prädikate, obwohl es in VBA unmöglich ist, Lambda-Ausdrücke zu gebrauchen. Mehr dazu nach dem Code:

Code:
Klassenname: "ListOfObject"

Option Explicit

Private Arr() As Object
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef pArray() As Any) As Long

'Fügt am Ende der Liste ein Objekt hinzu.
'Getestet
Public Sub Add(ByVal Obj As Object)
    If Obj Is Nothing Then Exit Sub
    Dim l%
    If SafeArrayGetDim(Arr) = 0 Then
        ReDim Arr(0)
    Else
        l = UBound(Arr) + 1
    End If
    ReDim Preserve Arr(l)
    Set Arr(l) = Obj
End Sub

'Fügt die Elemente der angegebenen Auflistung am Ende der Liste hinzu.
'Getestet
Public Sub AddRange(List As ListOfObject)
    Dim e As Variant
    For Each e In List.ToArray
        Me.Add e
    Next
End Sub

'Bestimmt, ob alle Elemente einer Sequenz eine Bedingung erfüllen.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Boolean
Public Function All(Predicate$) As Boolean
    Dim e As Variant
    All = True
    For Each e In Arr
        Dim b As Boolean
        b = Application.Run(Predicate, e)
        If Not b Then
            All = False
            Exit Function
        End If
    Next
End Function

'Gibt an, ob eine Sequenz Elemente enthält.
Public Function AnyElements() As Boolean
    AnyElements = (Not UBound(Arr) = 0)
End Function

'Berechnet der Durchschnitt einer Sequenz von Double-Werten, die durch den Aufruf einer Transformationsfunktion für jedes Element ermittelt werden.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Double
Public Function Average(Predicate$) As Double
    Dim e As Variant
    Dim i%, l#
    For Each e In Arr
        Dim d#
        d = Application.Run(Predicate, e)
        i = i + 1
        l = l + d
    Next
    Average = l / i
End Function

'Entfernt alle Elemente der Liste.
'Getestet
Public Sub Clear()
    Dim a() As Object
    Arr = a
End Sub

'Verkettet zwei Sequenzen.
'Getestet
Public Function Concat(List As ListOfObject) As ListOfObject
    Set Concat = New ListOfObject
    Concat.AddRange List
    Concat.AddRange Me
End Function

'Bestimmt, ob ein Element sich in der Liste befindet.
'Getestet
Public Function Contains(ByVal Obj As Object) As Boolean
    Dim e As Variant
    Contains = False
    If SafeArrayGetDim(Arr) = 0 Then Exit Function
    For Each e In Arr
        If e Is Obj Then
            Contains = True
            Exit Function
        End If
    Next
End Function

'Konvertiert die Elemente der aktuellen Liste in einen anderen Typ und gibt eine Liste der konvertierten Elemente zurück.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Object|Typ
Public Function ConvertAllToObj(Predicate$) As ListOfObject
    Dim e As Variant
    Dim l As New ListOfObject
    For Each e In Arr
        Dim el As Object
        Set el = Application.Run(Predicate, e)
        l.Add el
    Next
    Set ConvertAllToObj = l
End Function
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Variant|Typ
Public Function ConvertAllToVar(Predicate$) As ListOfVariant
    Dim e As Variant
    Dim l As New ListOfVariant
    For Each e In Arr
        Dim el As Variant
        Let el = Application.Run(Predicate, e)
        l.Add el
    Next
    Set ConvertAllToVar = l
End Function

'Gibt die Anzahl Elemente zurück, die tatsächlich in der Liste enthalten sind.
'Getestet
Public Function Count() As Integer
    Count = UBound(Arr) + 1
End Function

'Gibt mithilfe des Standartvergleichs unterschiedliche Elemente auf der Liste zurück.
'Getestet
Public Function Distinct() As ListOfObject
    Dim e As Variant
    Dim l As New ListOfObject
    For Each e In Arr
        If Not l.Contains(e) Then
            l.Add e
        End If
    Next
    Set Distinct = l
End Function

'Gibt das Element an einem angegebenen Index der Sequenz zurück.
'Getestet
Public Function ElementAt(Index%) As Object
    Set ElementAt = Arr(Index)
End Function

'Erzeugt die Differenzmenge zweier Sequenzen mithilfe des Standartgleichheitsvergleichs zum Vergleichen von Werten.
'Getestet
Public Function Except(List As ListOfObject) As ListOfObject
    Dim e As Variant
    Dim l As New ListOfObject
    For Each e In Arr
        If Not List.Contains(e) Then
            l.Add e
        End If
    Next
    Set Except = l
End Function

'Gibt das erste Element einer Sequenz zurück.
'Getestet
Public Function First() As Object
    If SafeArrayGetDim(Arr) = 0 Then Exit Function
    Set First = Arr(0)
End Function

'Gibt das erste Element einer Sequenz zurück, bei dem das angegebene Prädikat True zurückgibt.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Boolean
'Getestet
Public Function First2(Predicate$) As Object
    Dim e As Variant
    For Each e In Arr
        Dim b As Boolean
        b = Application.Run(Predicate, e)
        If b Then
            Set First2 = e
            Exit Function
        End If
    Next
End Function

'Führt die angegebene Aktion für jedes Element der Liste aus.
'Prädikat muss folgende Syntax haben: Action(ByRef Object|Typ)
'Getestet
Public Sub ForEach(Predicate$)
    Dim e As Variant
    For Each e In Arr
        Set e = Application.Run(Predicate, e)
    Next
End Sub

'Erstellt eine flache Kopie eines Bereichs von Elementen der Liste.
'Getestet
Public Function GetRange(Index%, Count%) As ListOfObject
    On Error Resume Next
    Dim l As New ListOfObject
    Dim i%
    For i = Index To Index + Count - 1
        l.Add ElementAt(i)
    Next
    Set GetRange = l
End Function

'Sucht nach dem angegebenen Objekt und gibt den nullbasierenden Index des ersten Vorkommens der gesamten Liste zurück.
'Getestet
Public Function IndexOf(Obj As Object) As Integer
    Dim e As Variant
    For Each e In Arr
        If e Is Obj Then Exit Function
        IndexOf = IndexOf + 1
    Next
End Function

'Fügt am angegebenen Index ein Element in die Liste ein.
Public Sub Insert(Index%, Obj As Object)
    Dim a As New ListOfObject
    Dim b As New ListOfObject
    a.AddRange Me.GetRange(0, Index - 1)
    b.AddRange Me.GetRange(Index, UBound(Arr) - Index)
    Me.Clear
    Me.AddRange a
    Me.Add Obj
    Me.AddRange b
End Sub

'Fügt die Elemente einer Auflistung am angegebenen Index in die Liste ein.
Public Sub InsertRange(Index%, List As ListOfObject)
    Dim a As New ListOfObject
    Dim b As New ListOfObject
    a.AddRange Me.GetRange(0, Index - 1)
    b.AddRange Me.GetRange(Index, UBound(Arr) - Index)
    Me.Clear
    Me.AddRange a
    Me.AddRange List
    Me.AddRange b
End Sub

'Erzeugt die Schnittmenge zweier Sequenzen mithilfe des Standartgleichheitsvergleichs zum Vergleichen von Werten.
Public Function Intersect(List As ListOfObject) As ListOfObject
    Dim e As Variant
    Dim l As New ListOfObject
    For Each e In Arr
        If List.Contains(e) Then l.Add e
    Next
    Set Intersect = l
End Function

'Ruft das Element am angegebenen Index ab.
Public Property Get Item(Index%) As Object
    Set Item = Arr(Index)
End Property
'Legt das Element am angegebenen Index fest.
Public Property Set Item(Index%, Obj As Object)
    Arr(Index) = Obj
End Property


'Gibt das letzte Element einer Sequenz zurück.
Public Function Last() As Object
    If UBound(Arr) = 0 Then Exit Function
    Set Last = Arr(UBound(Arr) - 1)
End Function

'Sortiert die Elemente einer Sequenz nach einem Schlüssel.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Long
Public Function OrderBy(Predicate$, Optional Descending As Boolean = False) As ListOfObject
    Dim e As Variant
    Dim l As New ListOfObject
    Dim i&
    Dim Key() As Long
    ReDim Key(l.Count - 1)
    For Each e In Arr
        Key(i) = Application.Run(Predicate, e)
        i = i + 1
    Next
    Key = Array(Key).Sort
    If Descending Then Key = Array(Key).Reverse
    For Each e In Key
        l.Add Me.ElementAt(CLng(e))
    Next
    Set OrderBy = l
End Function

'Entfernt das erste Vorkommen eines angegebenen Objekts.
Public Sub Remove(Obj As Object)
    Dim e As Variant
    Dim i%
    For Each e In Arr
        If e Is Obj Then
            RemoveAt i
            Exit Sub
        End If
        i = i + 1
    Next
End Sub

'Entfernt alle Elemente, die die vom angegebenen Prädikat angegebenen Bedingungen erfüllen.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Boolean
Public Sub RemoveAll(Predicate$)
    Dim e As Variant
    Dim l() As Integer
    Dim i%
    For Each e In Arr
        If CBool(Application.Run(Predicate, e)) Then
            ReDim Preserve l(UBound(l))
            l(UBound(l) - 1) = i
        End If
        i = i + 1
    Next
    For Each e In Array(l).Reverse
        RemoveAt i
    Next
End Sub

'Entfernt das Element am angegebenen Index aus der Liste.
Public Sub RemoveAt(Index%)
    Dim a As New ListOfObject
    Dim b As New ListOfObject
    Set a = Me.GetRange(0, Index - 1)
    Set b = Me.GetRange(Index + 1, Count - Index + 1)
    a.AddRange b
    Arr = a.ToArray
End Sub

'Entfernt einen Bereich aus Elementen aus der Liste
Public Sub RemoveRange(Index%, Count%)
    Dim i%
    For i = Index + Count - 1 To Index Step -1
        RemoveAt i
    Next
End Sub

'Kehrt die Reihenfolge der Liste um
Public Sub Reverse()
    Arr = Array(Arr).Reverse
End Sub

'Berechnet die Summe einer Sequenz aus Double-Werten, die durch den Aufruf einer Transformationsfunktion für jedes Element ermittelt werden.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Double
Public Function Sum(Predicate$) As Double
    Dim e As Variant
    For Each e In Arr
        Sum = Sum * CDbl(Application.Run(Predicate, e))
    Next
End Function

'Erzeugt die Vereinigungsmenge zweier Sequenzen mithilfe des Standartgleichheitsvergleichs.
Public Function Union(List As ListOfObject) As ListOfObject
    Set Union = List.Except(Me)
    Union.AddRange Me
End Function

'Filtert eine Sequenz von Werten nach einem Prädikat.
'Prädikat muss folgende Syntax haben: Func(Object|Typ) As Boolean
Public Function Where(Predicate$) As ListOfObject
    Dim e As Variant
    Dim l As New ListOfObject
    For Each e In Arr
        If CBool(Application.Run(Predicate, e)) Then
            l.Add e
        End If
    Next
    Set Where = l
End Function

'Gibt die Liste als Array zurück. Für For-Each-Schleifen zu benützen.
Public Function ToArray() As Object()
    ToArray = Arr
End Function


Mit Prädikaten lassen sich Listen filtern. Hierzu müsst ihr eine öffentliche Funktion in einem Modul erstellen, die einen Parameter eures Typs annimmt und je nach Funktion auch entsprechende Datentypen zurückgibt(einfach die Beschreibungen zu den Funktionen lesen).

Code:
Public Function NameOfControl(control As Control) As Boolean
    NameOfControl = (control.Name Like "Button*")
End Function


Wenn Ihr jetzt z.B. Alle Controls in diese ListOfObject speichert, könnt ihr alle Controls ausgeben lassen, die als Name "Button"(und etwas) haben:

Code:
    'Code
    Dim Cntrls As New ListOfObject
    Cntrls.Add Button1
    Cntrls.Add Button2
    Cntrls.Add TextBox1
    '...

    Dim BtnInName As ListOfObject
    Set BtnInName = Cntrls.Where("NameOfControl")
   'Code




Leider verhindert VBA das Boxen von Stackvariablen, weshalb ich das Ganze noch zu einer "ListOfVariant" umschreiben muss, um auch Integer/String/Double/...-Listen zu erstellen:

Code:
Klassenname: "ListOfVariant"

Option Explicit

Private Arr() As Variant
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef pArray() As Any) As Long

'Fügt am Ende der Liste ein Objekt hinzu.
'Getestet
Public Sub Add(ByVal Obj As Variant)
    Dim l%
    If SafeArrayGetDim(Arr) = 0 Then
        ReDim Arr(0)
    Else
        l = UBound(Arr) + 1
    End If
    ReDim Preserve Arr(l)
    Let Arr(l) = Obj
End Sub

'Fügt die Elemente der angegebenen Auflistung am Ende der Liste hinzu.
'Getestet
Public Sub AddRange(List As ListOfVariant)
    Dim e As Variant
    For Each e In List.ToArray
        Me.Add e
    Next
End Sub

'Bestimmt, ob alle Elemente einer Sequenz eine Bedingung erfüllen.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Boolean
Public Function All(Predicate$) As Boolean
    Dim e As Variant
    All = True
    For Each e In Arr
        Dim b As Boolean
        b = Application.Run(Predicate, e)
        If Not b Then
            All = False
            Exit Function
        End If
    Next
End Function

'Gibt an, ob eine Sequenz Elemente enthält.
Public Function AnyElements() As Boolean
    AnyElements = (Not UBound(Arr) = 0)
End Function

'Berechnet der Durchschnitt einer Sequenz von Double-Werten, die durch den Aufruf einer Transformationsfunktion für jedes Element ermittelt werden.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Double
Public Function Average(Predicate$) As Double
    Dim e As Variant
    Dim i%, l#
    For Each e In Arr
        Dim d#
        d = Application.Run(Predicate, e)
        i = i + 1
        l = l + d
    Next
    Average = l / i
End Function

'Entfernt alle Elemente der Liste.
'Getestet
Public Sub Clear()
    Dim a() As Variant
    Arr = a
End Sub

'Verkettet zwei Sequenzen.
'Getestet
Public Function Concat(List As ListOfVariant) As ListOfVariant
    Set Concat = New ListOfVariant
    Concat.AddRange List
    Concat.AddRange Me
End Function

'Bestimmt, ob ein Element sich in der Liste befindet.
'Getestet
Public Function Contains(ByVal Obj As Variant) As Boolean
    Dim e As Variant
    Contains = False
    If SafeArrayGetDim(Arr) = 0 Then Exit Function
    For Each e In Arr
        If e Is Obj Then
            Contains = True
            Exit Function
        End If
    Next
End Function

'Konvertiert die Elemente der aktuellen Liste in einen anderen Typ und gibt eine Liste der konvertierten Elemente zurück.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Variant|Typ
Public Function ConvertAllToObj(Predicate$) As ListOfObject
    Dim e As Variant
    Dim l As New ListOfObject
    For Each e In Arr
        Dim el As Object
        Set el = Application.Run(Predicate, e)
        l.Add el
    Next
    Set ConvertAllToObj = l
End Function
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Variant|Typ
Public Function ConvertAllToVar(Predicate$) As ListOfVariant
    Dim e As Variant
    Dim l As New ListOfVariant
    For Each e In Arr
        Dim el As Variant
        Let el = Application.Run(Predicate, e)
        l.Add el
    Next
    Set ConvertAllToVar = l
End Function

'Gibt die Anzahl Elemente zurück, die tatsächlich in der Liste enthalten sind.
'Getestet
Public Function Count() As Integer
    Count = UBound(Arr) + 1
End Function

'Gibt mithilfe des Standartvergleichs unterschiedliche Elemente auf der Liste zurück.
'Getestet
Public Function Distinct() As ListOfVariant
    Dim e As Variant
    Dim l As New ListOfVariant
    For Each e In Arr
        If Not l.Contains(e) Then
            l.Add e
        End If
    Next
    Set Distinct = l
End Function

'Gibt das Element an einem angegebenen Index der Sequenz zurück.
'Getestet
Public Function ElementAt(Index%) As Variant
    Let ElementAt = Arr(Index)
End Function

'Erzeugt die Differenzmenge zweier Sequenzen mithilfe des Standartgleichheitsvergleichs zum Vergleichen von Werten.
'Getestet
Public Function Except(List As ListOfVariant) As ListOfVariant
    Dim e As Variant
    Dim l As New ListOfVariant
    For Each e In Arr
        If Not List.Contains(e) Then
            l.Add e
        End If
    Next
    Set Except = l
End Function

'Gibt das erste Element einer Sequenz zurück.
'Getestet
Public Function First() As Variant
    If SafeArrayGetDim(Arr) = 0 Then Exit Function
    Let First = Arr(0)
End Function

'Gibt das erste Element einer Sequenz zurück, bei dem das angegebene Prädikat True zurückgibt.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Boolean
'Getestet
Public Function First2(Predicate$) As Variant
    Dim e As Variant
    For Each e In Arr
        Dim b As Boolean
        b = Application.Run(Predicate, e)
        If b Then
            Let First2 = e
            Exit Function
        End If
    Next
End Function

'Führt die angegebene Aktion für jedes Element der Liste aus.
'Prädikat muss folgende Syntax haben: Action(ByRef Variant|Typ)
'Getestet
Public Sub ForEach(Predicate$)
    Dim e As Variant
    For Each e In Arr
        Let e = Application.Run(Predicate, e)
    Next
End Sub

'Erstellt eine flache Kopie eines Bereichs von Elementen der Liste.
'Getestet
Public Function GetRange(Index%, Count%) As ListOfVariant
    On Error Resume Next
    Dim l As New ListOfVariant
    Dim i%
    For i = Index To Index + Count - 1
        l.Add ElementAt(i)
    Next
    Let GetRange = l
End Function

'Sucht nach dem angegebenen Objekt und gibt den nullbasierenden Index des ersten Vorkommens der gesamten Liste zurück.
Public Function IndexOf(Obj As Variant) As Integer
    Dim e As Variant
    For Each e In Arr
        If e = Obj Then Exit Function
        IndexOf = IndexOf + 1
    Next
End Function

'Fügt am angegebenen Index ein Element in die Liste ein.
Public Sub Insert(Index%, Obj As Variant)
    Dim a As ListOfVariant
    Dim b As ListOfVariant
    a.AddRange Me.GetRange(0, Index - 1)
    b.AddRange Me.GetRange(Index, UBound(Arr) - Index)
    Me.Clear
    Me.AddRange a
    Me.Add Obj
    Me.AddRange b
End Sub

'Fügt die Elemente einer Auflistung am angegebenen Index in die Liste ein.
Public Sub InsertRange(Index%, List As ListOfVariant)
    Dim a As ListOfVariant
    Dim b As ListOfVariant
    a.AddRange Me.GetRange(0, Index - 1)
    b.AddRange Me.GetRange(Index, UBound(Arr) - Index)
    Me.Clear
    Me.AddRange a
    Me.AddRange List
    Me.AddRange b
End Sub

'Erzeugt die Schnittmenge zweier Sequenzen mithilfe des Standartgleichheitsvergleichs zum Vergleichen von Werten.
Public Function Intersect(List As ListOfVariant) As ListOfVariant
    Dim e As Variant
    Dim l As New ListOfVariant
    For Each e In Arr
        If List.Contains(e) Then l.Add e
    Next
    Set Intersect = l
End Function

'Ruft das Element am angegebenen Index ab.
Public Property Get Item(Index%) As Variant
    Let Item = Arr(Index)
End Property
'Legt das Element am angegebenen Index fest.
Public Property Let Item(Index%, Obj As Variant)
    Arr(Index) = Obj
End Property


'Gibt das letzte Element einer Sequenz zurück.
Public Function Last() As Variant
    If UBound(Arr) = 0 Then Exit Function
    Let Last = Arr(UBound(Arr) - 1)
End Function

'Sortiert die Elemente einer Sequenz nach einem Schlüssel.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Long
Public Function OrderBy(Predicate$, Optional Descending As Boolean = False) As ListOfVariant
    Dim e As Variant
    Dim l As New ListOfVariant
    Dim i&
    Dim Key() As Long
    ReDim Key(l.Count - 1)
    For Each e In Arr
        Key(i) = Application.Run(Predicate, e)
        i = i + 1
    Next
    Key = Array(Key).Sort
    If Descending Then Key = Array(Key).Reverse
    For Each e In Key
        l.Add Me.ElementAt(CLng(e))
    Next
    Set OrderBy = l
End Function

'Entfernt das erste Vorkommen eines angegebenen Objekts.
Public Sub Remove(Obj As Variant)
    Dim e As Variant
    Dim i%
    For Each e In Arr
        If e Is Obj Then
            RemoveAt i
            Exit Sub
        End If
        i = i + 1
    Next
End Sub

'Entfernt alle Elemente, die die vom angegebenen Prädikat angegebenen Bedingungen erfüllen.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Boolean
Public Sub RemoveAll(Predicate$)
    Dim e As Variant
    Dim l() As Integer
    Dim i%
    For Each e In Arr
        If CBool(Application.Run(Predicate, e)) Then
            ReDim Preserve l(UBound(l))
            l(UBound(l) - 1) = i
        End If
        i = i + 1
    Next
    For Each e In Array(l).Reverse
        RemoveAt i
    Next
End Sub

'Entfernt das Element am angegebenen Index aus der Liste.
Public Sub RemoveAt(Index%)
    Dim a As New ListOfVariant
    Dim b As New ListOfVariant
    Let a = Me.GetRange(0, Index - 1)
    Let b = Me.GetRange(Index + 1, Count - Index + 1)
    a.AddRange b
    Arr = a.ToArray
End Sub

'Entfernt einen Bereich aus Elementen aus der Liste
Public Sub RemoveRange(Index%, Count%)
    Dim i%
    For i = Index + Count - 1 To Index Step -1
        RemoveAt i
    Next
End Sub

'Kehrt die Reihenfolge der Liste um
Public Sub Reverse()
    Arr = Array(Arr).Reverse
End Sub

'Berechnet die Summe einer Sequenz aus Double-Werten, die durch den Aufruf einer Transformationsfunktion für jedes Element ermittelt werden.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Double
Public Function Sum(Predicate$) As Double
    Dim e As Variant
    For Each e In Arr
        Sum = Sum * CDbl(Application.Run(Predicate, e))
    Next
End Function

'Erzeugt die Vereinigungsmenge zweier Sequenzen mithilfe des Standartgleichheitsvergleichs.
Public Function Union(List As ListOfVariant) As ListOfVariant
    Set Union = List.Except(Me)
    Union.AddRange Me
End Function

'Filtert eine Sequenz von Werten nach einem Prädikat.
'Prädikat muss folgende Syntax haben: Func(Variant|Typ) As Boolean
Public Function Where(Predicate$) As ListOfVariant
    Dim e As Variant
    Dim l As New ListOfVariant
    For Each e In Arr
        Dim b As Boolean
        b = Application.Run(Predicate, e)
        If b Then
            l.Add e
        End If
    Next
    Set Where = l
End Function

'Gibt die Liste als Array zurück. Für For-Each-Schleifen zu benützen.
Public Function ToArray() As Variant()
    ToArray = Arr
End Function

_________________
Private Sub WakingUp(sender As Object, e As WillingArgs) Handles Alarm.IsRinging
My.Brain.Start(Forced:=Not e.IsWilledToWakeUp)
End Sub
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel Hilfe: *T*T.wie vergleiche ich mehr spalten und zeilen ???? 5 leidernurgast 78 23. Sep 2013, 18:57
Leider nur Gast *T*T.wie vergleiche ich mehr spalten und zeilen ????
Keine neuen Beiträge Excel VBA (Makros): einzelne, z.T. verbundene Zellen in andere Datei kopieren??? 9 mathiasbx 415 12. Jul 2013, 22:07
mathiasbx einzelne, z.T. verbundene Zellen in andere Datei kopieren???
Keine neuen Beiträge Excel Formeln: Bei wert 1 bis 9 T eingeben und bei 10 bis 18 N 11 rudiger64 196 19. Jul 2012, 20:03
hiob Bei wert 1 bis 9 T eingeben und bei 10 bis 18 N
Keine neuen Beiträge Excel VBA (Makros): Import aus Ordner im Format JJJJ.MM. und Dateiname JJJJ.MM.T 2 jora74 141 01. Mai 2012, 12:54
jora74 Import aus Ordner im Format JJJJ.MM. und Dateiname JJJJ.MM.T
Keine neuen Beiträge Excel Formate: Benutzerdefinierte Darstellung in T Euro mit Punkten... 2 baltic80 1023 15. Aug 2011, 15:51
baltic80 Benutzerdefinierte Darstellung in T Euro mit Punkten...
Keine neuen Beiträge Excel Formeln: Summenprodukt aus zwei Textspalten (mit z.T. nur TextTEILEN) 5 dagobu 1185 27. Apr 2011, 22:06
Gast Summenprodukt aus zwei Textspalten (mit z.T. nur TextTEILEN)
Keine neuen Beiträge Excel VBA (Makros): Automatisches aktualisieren z.T. abschalten, bzw. verkürzen 0 Ado27 395 18. Apr 2011, 18:58
Ado27 Automatisches aktualisieren z.T. abschalten, bzw. verkürzen
Keine neuen Beiträge Excel Hilfe: Zeitintervall berechnen H:MM:SS.T 2 ELSstudent 884 03. Dez 2010, 12:31
ELSstudent Zeitintervall berechnen H:MM:SS.T
Keine neuen Beiträge Excel VBA (Makros): Pdf Datei deren Name nur z.T. bekannt ist aus Excel öffnen 4 **Gast** 294 27. Okt 2010, 16:54
**Gast** Pdf Datei deren Name nur z.T. bekannt ist aus Excel öffnen
Keine neuen Beiträge Excel Formeln: Differenzbetrag zwischen 2 Data(zeitlich) ist kleiner 0 T:2 1 lanuria 321 30. Nov 2009, 14:24
Gast Differenzbetrag zwischen 2 Data(zeitlich) ist kleiner 0 T:2
Keine neuen Beiträge Excel Auswertungen: P T automatisch anpassen, wenn Datensatz sich verändert? 2 Sterli 201 09. Nov 2009, 12:45
Sterli P T automatisch anpassen, wenn Datensatz sich verändert?
Keine neuen Beiträge Excel Formeln: Ameriokanisches Datumsformat umwandeln M.T.JJ in TT.MM.JJJJ 2 Zarkay 927 07. Mai 2009, 21:51
Gast Ameriokanisches Datumsformat umwandeln M.T.JJ in TT.MM.JJJJ
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Frontpage Forum