argument recevableL'indexation permet de garder trace des numéros de lignes d'origine.
C'est utile dans au moins deux cas:
1) — Lorsqu'on veut classer un tableau comportant de nombreuses colonnes, ainsi on n'a pas à déplacer les données elles mêmes pendant l'indexation, ce qui serait long,
2) — Lorsqu'on veut pouvoir indiquer, sans qu'il soit nécessaire de les y rechercher à postériori, à quelles lignes de la base se trouvent une valeur choisie dans une ComboBox.
Sub testQSort()
Dim TB, TA(), SortColl As New Collection, GetTA, Tmps!
Tmps = Timer
TB = Cells(1).CurrentRegion.Value
For Each T In TB
ReDim NewTB(1 To 1)
L = Mid(T, 1, Len(T) - 1): S = Len(T): cle = L & "|" & S
On Error Resume Next
SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle
If Err Then
GetTA = TA(SortColl(cle)): ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = T: TA(SortColl(cle)) = GetTA
Else
ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(T)
End If
Next
Debug.Print Timer - Tmps
Stop
End Sub
oui c'est vrai il y a encore une collection sauf que la différence c'est que avant les arrays étaient les items de la collection alors que la il n'y a plus d'item dans la collection et tout est mis dans un tableau, ce qui m'a fait gagner 0,5 seconde sur le temps c'est pas négligeable, … faudrait trouver un système sans collection pour voir la différence …sauf que tu met en jeu une collection
j'ai pas pu testerJ'ai repris mes recherches et ressorti un vieux module de classe TableIndex qui marchait très bien.
Je n'arrive plus à retrouver les circonstances qui m'ont fait trouver, même optimisée, la fusion plus rapide.
Function SortBubbleTB(t) 'fonction Tri à bulle classique modifé
Dim temp, i&, a&
For i = LBound(t) To UBound(t) - 1
For a = i To UBound(t)
Q = Q + 1
If t(i)(1) > t(a)(1) Then temp = t(i): t(i) = t(a): t(a) = temp: ch = ch + 1
Next
Next
SortBubbleTB = t
End Function
oui j'y suis tombé ce soir en faisant des recherches, on est connecté tous les 2 ma parolej'imagine que vous êtes déjà tombé sur ce site!
Option Base 1
Dim Q&
Dim ch&
Sub testQSort()
Dim TB, TA(), SortColl As New Collection, GetTA, Tmps!
Cells(1, 3).Resize(10000).ClearContents
Q = 0: ch = 0: tim = Timer
TB = Cells(1).CurrentRegion.Value
For Each t In TB
ReDim NewTB(1 To 1)
L = Mid(t, 1, Len(t) - 1): S = Len(t): cle = L & "|" & S
On Error Resume Next
SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle
If Err Then
GetTA = TA(SortColl(cle)): ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = t: TA(SortColl(cle)) = GetTA
Else
ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(t)
End If
Next
For i = 1 To UBound(TA): TA(i) = SortBubble(TA(i)): Q = Q + 1:: Next
TA = SortBubbleTB(TA)
ReDim TB(1 To 1)
n = 0
For Each arr In TA
Q = Q + 1
ReDim Preserve TB(1 To n + UBound(arr))
For i = 1 To UBound(arr)
Q = Q + 1
TB(i + n) = arr(i)
Next
n = UBound(TB)
Next
MsgBox Format(Timer - tim, "#0.00") & " sec" & vbCrLf & Q & " TOURS DE BOUCLE" & vbCrLf & ch & " INTERVERTIONS"
Cells(1, 3).Resize(UBound(TB)) = Application.Transpose(TB)
End Sub
Function SortBubble(t) 'fonction Tri à bulle classique
Dim temp, i&, a&
For i = LBound(t) To UBound(t) - 1
For a = i To UBound(t)
Q = Q + 1
If t(i) > t(a) Then temp = t(i): t(i) = t(a): t(a) = temp: ch = ch + 1
Next
Next
SortBubble = t
End Function
Function SortBubbleTB(t) 'fonction Tri à bulle classique modifé
Dim temp, i&, a&
For i = LBound(t) To UBound(t) - 1
For a = i To UBound(t)
Q = Q + 1
If t(i)(1) > t(a)(1) Then temp = t(i): t(i) = t(a): t(a) = temp: ch = ch + 1
Next
Next
SortBubbleTB = t
End Function
Option Base 1
Dim Q&, ch&, P&
'Tri par insertion (Insertion sort)
Sub testQSort()
Dim TB, TA(), SortColl As New Collection, GetTA, Tmps!
Cells(1, 3).Resize(10000).ClearContents
Q = 0: ch = 0: tim = Timer
TB = Cells(1).CurrentRegion.Value
For Each t In TB
ReDim NewTB(1 To 1)
L = Mid(t, 1, Len(t) - 1): S = Len(t): cle = L & "|" & S
On Error Resume Next
SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle
If Err Then
GetTA = TA(SortColl(cle)): ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = t: TA(SortColl(cle)) = GetTA
Else
ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(t)
End If
Next
For i = 1 To UBound(TA): TA(i) = SortInsertion1(TA(i)): Q = Q + 1:: Next
TA = SortInsertion1TB(TA)
ReDim TB(1 To 1)
n = 0
For Each arr In TA
Q = Q + 1
ReDim Preserve TB(1 To n + UBound(arr))
For i = 1 To UBound(arr)
Q = Q + 1
TB(i + n) = arr(i)
Next
n = UBound(TB)
Next
MsgBox Format(Timer - tim, "#0.00") & " sec" & vbCrLf & Q & " TOURS DE BOUCLE" & vbCrLf & ch & " INTERVERTIONS"
Cells(1, 3).Resize(UBound(TB)) = Application.Transpose(TB)
End Sub
Function SortInsertion1(t)
Dim temp, i&, a&
For i = LBound(t) + 1 To UBound(t)
For a = LBound(t) To i - 1
If t(i) < t(a) Then TP = t(i): t(i) = t(a): t(a) = TP: ch = ch + 1
Q = Q + 1
Next
Next
SortInsertion1 = t
End Function
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Function SortInsertion1TB(t)
Dim temp, i&, a&
For i = LBound(t) + 1 To UBound(t)
For a = LBound(t) To i - 1
If t(i)(1) < t(a)(1) Then TP = t(i): t(i) = t(a): t(a) = TP: ch = ch + 1
Q = Q + 1
Next
Next
SortInsertion1TB = t
End Function