Tempo addietro avevo scritto qualcosa di simile alla TList di Delphi in linguaggio VB6.

Ne riporto il codice:
codice:
' Costanti private
Private Const ArrayListMaxListSize = 2048

' Campi privati
Private FCapacity As Long
Private FCount As Long
Private FList() As Variant

' Constructor()
'       inizializza un'istanza dell'oggetto.
Private Sub Class_Initialize()
    ReDim FList(ArrayListMaxListSize)
    FCapacity = 0
    FCount = 0
End Sub

' Destructor()
'       dealloca la memoria utilizzata dall'oggetto.
Private Sub Class_Terminate()
      Clear
      Erase FList
End Sub

' Grow()
'       incrementa le capacità della lista.
Private Sub Grow()
    Dim Delta As Long
    If FCapacity > 64 Then
        Delta = FCapacity Mod 4
    Else
        If FCapacity > 8 Then
            Delta = 16
        Else
            Delta = 4
        End If
    End If
    Capacity = FCapacity + Delta
End Sub

' Add()
'       aggiunge un elemento alla lista.
Public Function Add(ByVal item As Variant) As Long
    Dim Result As Long
    Result = FCount
    If Result = FCapacity Then
        Grow
    End If
    If IsObject(item) Then
        Set FList(Result) = item
    Else
        FList(Result) = item
    End If
    FCount = FCount + 1
    Add = Result
End Function

' Clear()
'       elimina tutti gli elementi dalla lista.
Public Sub Clear()
  Count = 0
  Capacity = 0
End Sub

' Delete()
'       cancella l'elemento della lista avente l'indice specificato.
Public Sub Delete(ByVal Index As Long)
    Dim i As Long
    Dim item As Variant
    If (Index >= 0) Or (Index < FCount) Then
        If Index < FCount Then
            For i = (Index + 1) To (FCount - 1)
                If IsObject(FList(i)) Then
                    Set FList(i - 1) = FList(i)
                Else
                    FList(i - 1) = FList(i)
                End If
            Next
        End If
        FCount = FCount - 1
    End If
End Sub

' Exchange()
'       scambia la posizione di due elementi della lista.
Public Sub Exchange(ByVal Index1 As Long, Index2 As Long)
    Dim item As Variant
    If (Index1 < 0) Or (Index1 >= FCount) Then
        Err.Raise 6
    End If
    If (Index2 < 0) Or (Index2 >= FCount) Then
        Err.Raise 6
    End If
    If IsObject(FList(Index1)) Then
        Set item = FList(Index1)
    Else
        item = FList(Index1)
    End If
    If IsObject(FList(Index2)) Then
        Set FList(Index1) = FList(Index2)
    Else
        FList(Index1) = FList(Index2)
    End If
    If IsObject(item) Then
        Set FList(Index2) = item
    Else
        FList(Index2) = item
    End If
End Sub

' Expand()
'       aumenta la capacità della lista, se necessario.
Public Sub Expand()
    If FCount = FCapacity Then
        Grow
    End If
End Sub
    
' First()
'       restituisce il primo elemento della lista.
Public Function First() As Variant
    If IsObject(FList(0)) Then
        Set First = FList(0)
    Else
        First = FList(0)
    End If
End Function
    
' IndexOf()
'       restituisce l'indice di un elemento della lista.
Public Function IndexOf(ByVal item As Variant) As Long
    Dim Result As Long
    Result = 0
    While (Result < FCount) And (Not (FList(Result) Is item))
        Result = Result + 1
    Wend
    If Result = FCount Then
        Result = -1
    End If
    IndexOf = Result
End Function
    
' Insert()
'       inserisce un elemento nella lista.
Public Sub Insert(ByVal Index As Long, item As Variant)
    Dim i As Long
    If (Index < 0) Or (Index > FCount) Then
        Err.Raise 6
    End If
    If FCount = FCapacity Then
        Grow
    End If
    If Index < FCount Then
        For i = FCount To (Index + 1) Step -1
            If IsObject(FList(i - 1)) Then
                Set FList(i) = FList(i - 1)
            Else
                FList(i) = FList(i - 1)
            End If
        Next
    End If
    If IsObject(item) Then
        Set FList(Index) = item
    Else
        FList(Index) = item
    End If
    FCount = FCount + 1
End Sub
    
' Last()
'       restituisce l'ultimo elemento della lista.
Public Function Last() As Variant
    If IsObject(FCount - 1) Then
        Set Last = FList(FCount - 1)
    Else
        Last = FList(FCount - 1)
    End If
End Function
    
' Move()
'       muove un elemento all'interno della lista cambiandogli posizione.
Public Sub Move(ByVal CurIndex As Long, NewIndex As Long)
    Dim item As Variant
    If CurIndex <> NewIndex Then
        If (NewIndex < 0) Or (NewIndex >= FCount) Then
            Err.Raise 6
        End If
        If IsObject(FList(CurIndex)) Then
            Set item = FList(CurIndex)
        Else
            item = FList(CurIndex)
        End If
        Set FList(CurIndex) = Nothing
        Delete CurIndex
        Insert NewIndex, Nothing
        If IsObject(item) Then
            Set FList(NewIndex) = item
        Else
            FList(NewIndex) = item
        End If
    End If
End Sub
    
' Remove()
'       rimuove un elemento dalla lista.
Public Function Remove(ByVal item As Variant)
    Dim Result As Long
    Result = IndexOf(item)
    If Result >= 0 Then
        Delete (Result)
    End If
    Remove = Result
End Function
    
' Pack()
'       rimuove gli elementi distrutti o nulli dalla lista.
Public Sub Pack()
    Dim i As Long
    For i = FCount - 1 To 0 Step -1
        If FList(i) Is Nothing Then
            Delete (i)
        End If
    Next
End Sub
    
' Capacity
'       restituisce la capacità della lista.
Public Property Get Capacity() As Long
    Capacity = FCapacity
End Property

' Capacity
'       imposta la capacità della lista.
Public Property Let Capacity(ByVal NewCapacity As Long)
    If (NewCapacity < FCount) Or (NewCapacity > ArrayListMaxListSize) Then
        Err.Raise 6
    End If
    If NewCapacity <> FCapacity Then
        ReDim Preserve FList(NewCapacity)
        FCapacity = NewCapacity
    End If
End Property
    
' Capacity
'       restituisce il numero di elementi nella lista.
Public Property Get Count() As Long
    Count = FCount
End Property

' Capacity
'       imposta il numero di elementi nella lista.
Public Property Let Count(ByVal NewCount As Long)
    Dim i As Long
    If (NewCount < 0) Or (NewCount > ArrayListMaxListSize) Then
        Err.Raise 6
    End If
    If NewCount > FCapacity Then
        Capacity = NewCount
    End If
    If NewCount > FCount Then
        For i = (NewCount - 1) To FCount Step -1
            Set FList(i) = Nothing
        Next
    Else
        For i = FCount - 1 To NewCount Step -1
            Delete i
        Next
        FCount = NewCount
    End If
End Property
    
' Items
'       restituisce l'elemento della lista avente l'indice specificato.
Public Property Get Items(ByVal Index As Long) As Variant
    If (Index < 0) Or (Index >= FCount) Then
        Err.Raise 6
    End If
    If IsObject(FList(Index)) Then
        Set Items = FList(Index)
    Else
        Items = FList(Index)
    End If
End Property
    
' Items
'       imposta il riferimento per l'elemento della lista avente l'indice specificato.
Public Property Set Items(ByVal Index As Long, ByVal item As Variant)
    If (Index < 0) Or (Index >= FCount) Then
        Err.Raise 6
    End If
    If Not (item Is FList(Index)) Then
        If IsObject(item) Then
            Set FList(Index) = item
        Else
            FList(Index) = item
        End If
    End If
End Property
    
' List
'       restituisce il vettore di elementi interno.
Public Property Get List() As Variant()
    List = FList
End Property
Dovrebbe trattare sia tipi valore, come Integer, Double e così via, e oggetti.

Segnalatemi eventuali bug.

Ciao!