Objet Collection

Accueil

Liste sans doublons pour combobox MAC
Liste sans doublons 2 colonnes
Collection sans doublons triée
Tableau comme élément d'une collection
Simulation de Dictionary pour Excel Mac


Une Collection est un ensemble d'éléments.

Collection

Dim variable AS New Collection
Variable.Add item:=valeur

Sub EssaiCollection()
  Dim MaListe As New Collection
  MaListe.Add "Dupont"
  MaListe.Add "Martin"
  MaListe.Add "Zoe"
  For i = 1 To MaListe.Count
    Cells(i, 4) = MaListe(i)
  Next i
  Set MaListe = Nothing
End Sub

MaCollec.Add item:=valeur,Key:=clé
MaCollec.Remove item:=index
retourItem=MaCollec(clé)

Avec l’option Key, on peut interdire les doublons dans une collection.

Sub CollectionSansDoublons()
  Dim MaListe As New Collection
  On Error Resume Next
  MaListe.Add Item:="1111", Key:="Dupont"
  MaListe.Add Item:="2222", Key:="Durand"
  MaListe.Add Item:="3333", Key:="Martin"
  MaListe.Add Item:="4444", Key:="Martin"
  MaListe.Remove 2
  For i = 1 To MaListe.Count
    Cells(i, 5) = MaListe(i)
  Next i
  tmp = MaListe("Dupont")       ' Accès par une clé
  MsgBox tmp
  Set MaListe = Nothing
End Sub

Ci dessous, nous créons une collection sans doublons. Le temps est de 10 secondes (0,25 avec Dictionary)

Sub CollectionSansDoublons()
   Dim t, i As Long, n As Long, temp As Long
   t = Timer()
   Dim Maliste As New Collection
   On Error Resume Next
   n = 40000
   For i = 1 To n
     temp = Int(Rnd * n)
     Maliste.Add Item:=temp, key:=CStr(temp)
   Next i
   On Error GoTo 0
   Dim a()
   ReDim a(1 To n)
   For i = 1 To Maliste.Count
     a(i) = Maliste(i)
   Next i
   [a2].Resize(Maliste.Count) = Application.Transpose(a)
   MsgBox Timer() - t ' 10 sec
End Sub

Donne la liste sans doublons de la colonne A

SansDoublonsCollectionMAC

Sub SansDoublonsCollection()
  Dim Collec1 As New Collection
  a = Range([a2], [a65000].End(xlUp))
  On Error Resume Next
  For Each c In a
    Collec1.Add Item:=c, Key:=c
  Next c
  On Error GoTo 0
  Dim b(): ReDim b(1 To Collec1.Count)
  For i = 1 To Collec1.Count
     b(i) = Collec1(i)
  Next i
  [c2].Resize(Collec1.Count) = Application.Transpose(b)
End Sub

Liste sans doublons pour ComboBox pour MAC

Sur MAC, Dictionary n'existe pas. Pour obtenir une liste sans doublons pour un ComboBox , utiliser Collection:

FormLSDCollectionMAC
FormLSDTriéCollectionMAC
FormLSDTriéMAC
Données/Validation 5 niveaux MAC

Option Compare Text
Dim f
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Dim a()
  a = Application.Transpose(f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value)
  Me.ComboBox1.List = SansDoublonsMAC(a())
End Sub

Function SansDoublonsMAC(a())
  Dim Maliste As New Collection
  On Error Resume Next
  For i = LBound(a) To UBound(a)
     Maliste.Add Item:=a(i), key:=a(i)
  Next i
  On Error GoTo 0
  Dim b(): ReDim b(1 To Maliste.Count)
  For i = 1 To Maliste.Count
    b(i) = Maliste(i)
  Next i
  SansDoublonsMAC = Application.Transpose(b)
End Function

Listes sans doublons avec 2 colonnes (Nom+prénom)

FormCascadeSansDoublons2colonnesMAC

Dim f, a()
Private Sub UserForm_Initialize()
  Set f = Sheets("bd")
  a = f.Range("A2:D" & f.[A65000].End(xlUp).Row).Value
  Dim collect As New Collection
  Dim Tbl(1 To 2)
  On Error Resume Next
  For i = 1 To UBound(a)
    Tbl(1) = a(i, 1)
    Tbl(2) = a(i, 2)
    collect.Add Tbl, Key:=(a(i, 1) & a(i,2)
  Next i
  On Error GoTo 0
  Dim b(): ReDim b(1 To 2, 1 To collect.Count)
  For i = 1 To collect.Count
    b(1, i) = collect(i)(1)
    b(2, i) = collect(i)(2)
  Next i
  Me.ComboBox1.List = Application.Transpose(b)
End Sub

Collection sans doublons triée (ce qu'il ne faut pas faire)

Sur cet exemple, on tri directement dans l'objet Collection. Le temps de tri est catastrophique (4,3 s pour 2000 éléments cotre 0,06s pour un tri dans un tableau)

Sub CollectionSansDoublonsTrié()
  Dim MaListe As New Collection
  t = Timer
  MaListe.Add Int(Rnd * 10000)
  For i = 1 To 2000
    n = MaListe.Count
    aléa = Int(Rnd * 10000)
    If x > MaListe(n) Then
      MaListe.Add after:=n, Item:=aléa, key:=CStr(aléa)
    Else
      j = 1
      Do While j < n And aléa > MaListe(j)
         j = j + 1
      Loop
      On Error Resume Next
      MaListe.Add before:=j, Item:=aléa, key:=CStr(aléa)
    End If
  Next i
  Application.ScreenUpdating = False
  For i = 1 To MaListe.Count
      Cells(i, 3) = MaListe(i)
  Next i
  MsgBox "Temps:" & Timer - t
End Sub

Le tri est effectué dans un tableau

Sub CollectionSansDoublonsTrié2()
   Dim MaListe As New Collection
   t = Timer
   MaListe.Add Int(Rnd * 10000)
   On Error Resume Next
   For i = 1 To 2000
      n = MaListe.Count
      aléa = Int(Rnd * 10000)
      MaListe.Add after:=n, Item:=aléa, key:=CStr(aléa)
   Next i
   '-- transfert dans un tableau
   Dim TempTab()
   ReDim TempTab(1 To MaListe.Count)
   For i = 1 To MaListe.Count
      TempTab(i) = MaListe(i)
   Next
   Call tri(TempTab, 1, UBound(TempTab, 1))
   Cells(1, 4).Resize(MaListe.Count) = Application.Transpose(TempTab)
   MsgBox "Temps:" & Timer - t
End Sub

Sub tri(a, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
       temp = a(g): a(g) = a(d): a(d) = temp
       g = g + 1: d = d - 1
     End If
   Loop While g <= d
   If g < droi Then Call tri(a, g, droi)
   If gauc < d Then Call tri(a, gauc, d)
End Sub

Collections et tableau

Les éléments d'une collection peuvent être des tableaux.

Sub EssaiCollection()
  Dim MaListe As New Collection
  Dim Tbl(1 To 3)
  Tbl(1) = "Dupont"
  Tbl(2) = 30
  Tbl(3) = "Paris"
  MaListe.Add Tbl

  Tbl(1) = "Martin"
  Tbl(2) = 33
  Tbl(3) = "Montigny"
  MaListe.Add Tbl

  For i = 1 To MaListe.Count
    For col = 1 To 3
       Cells(i + 1, col) = MaListe(i)(col)
    Next col
  Next i
End Sub

Nom

Age

Ville

Dupont

30

Paris

Martin

33

Montigny

Simulation de l'objet Dictionary pour Excel Mac

Principe de la simulation de Dictionary avec 2 collections

Simulation dico avec collection

Sub SimulDictionnareCollection()
  Dim CollecItem As New Collection, CollecCle As New Collection
  nom = "Dupond": age = 30
  CollecCle.Add Item:=nom, Key:=nom
  CollecItem.Add Item:=age, Key:=nom
  nom = "Martin": age = 35
  CollecCle.Add Item:=nom, Key:=nom
  CollecItem.Add Item:=age, Key:=nom
  For i = 1 To CollecCle.Count       ' Toutes les clés et items
    Cells(i + 1, 1) = CollecCle(i)
    Cells(i + 1, 2) = CollecItem(CollecCle(i))
  Next i
End Sub

Pour simuler l'objet Dictionary sur Excel Mac, on crée un module de classe DictionnaireMac.
Cette classe simule la classe Dictionary en lui ajoutant un Tri.
Elle peut remplacer SortedList. Elle permet par exemple:
- d'obtenir des listes triées sans doublon,
- d'effectuer des tris multi-critères de tableaux à 2 dimensions,...

ClasseDictionnaireCollection
ClasseDictionnaireTableau

 

 


 

 

 

 

Exemples