Bonjour,

Je fais des petits tests pour vider une collection.
Avec For/Next ET Step -1 aucun souci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Dim i&, T#, C As Collection, N&
    N = 10000
    Set C = New Collection
    For i = 1 To N
        C.Add i, CStr(i)
    Next i
    T = Timer
    For i = N To 1 Step -1
        C.Remove i
    Next i
    Debug.Print "Vidé avec For - Next " & Timer - T
Pas de souci, si ce n'est la lenteur induite.
Autre solution qui ne pose pas de souci : Nothing :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Dim i&, T#, C As Collection, elem, N&
    N = 10000
    Set C = New Collection
    T = Timer
    For i = 1 To N
        C.Add i, CStr(i)
    Next i
    Debug.Print "Remplit en : " & Timer - T:
    T = Timer
    Set C = Nothing
    Debug.Print "Vidé avec Nothing " & Timer - T
Là ou je ne comprend pas, c'est la logique de la boucle For Each...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim i&, T#, C As Collection, elem, N&, Tb()
    N = 100
    Set C = New Collection
    For i = 1 To N
        C.Add i, CStr(i)
    Next i
    i = 0
    On Error GoTo Suite
    T = Timer
    For Each elem In C
        i = i + 1
        ReDim Preserve Tb(1 To i)
        Tb(i) = elem
        C.Remove elem
    Next
    Debug.Print "Vidé avec For Each " & Timer - T
Suite:
    Debug.Print "Planté à l'indice : " & i & " -- Nb d'éléments restants : " & C.Count
    Debug.Print Join(Tb, " - ")
Le résultat, dans la fenêtre d'exécution est :
Planté à l'indice : 40 -- Nb d'éléments restants : 61
1 - 2 - 4 - 5 - 7 - 9 - 10 - 12 - 13 - 15 - 17 - 18 - 20 - 22 - 23 - 25 - 26 - 28 - 30 - 31 - 33 - 34 - 36 - 38 - 39 - 41 - 43 - 44 - 46 - 47 - 49 - 51 - 52 - 54 - 56 - 57 - 59 - 60 - 62 - 64
Je crois comprendre cette ligne : Planté à l'indice : 40 -- Nb d'éléments restants : 61 si le nombre d'éléments est 100, il y a une cohérence.
Mais par contre :
Je prends 1 --> je le supprime ==>> il passe à 2 ok, normal
Je prends 2 --> je le supprime ==>> il passe à 4 ????
Je prends 4 --> je le supprime ==>> il passe à 5 ok, normal
Je prends 5 --> je le supprime ==>> il passe à 7 ????
Je prends 7 --> je le supprime ==>> il passe à 9 ????
Je prends 9 --> je le supprime ==>> il passe à 10 ok, normal
etc...
Voici donc mes deux questions :
  1. Qu'elle logique suit donc cette boucle For Each?
  2. La collection est-elle bien vidée avec Nothing (ne reste t'il vraiment rien en mémoire) ? [Parce que le temps d'exécution entre la boucle et Nothing est juste hallucinant!]