Bonjour,
Je fais des petits tests pour vider une collection.
Avec For/Next ET Step -1 aucun souci :
Pas de souci, si ce n'est la lenteur induite.
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
Autre solution qui ne pose pas de souci : Nothing :
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 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
Le résultat, dans la fenêtre d'exécution est :
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, " - ")
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.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
Mais par contre :
Voici donc mes deux questions :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...
- Qu'elle logique suit donc cette boucle For Each?
- 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!]
Partager