Tri lignes Gauche-Droite, cherche solution par Array

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

Je cherche à trier les données de trois colonnes adjacentes (dans cet exemple A,B,C), lignes par lignes mais de la gauche vers la droite.

J'ai écrit cette macro (qui fonctionne)
Mais j'aimerai pouvoir faire la même chose en utilisant les tableaux (Array)
Surtout si le nombre de lignes dépasse les 5000.

Malgré mes essais, pour l'instant, je sèche.

Merci à ceux qui pourront m'aiguiller sur la bonne voie.

NB: J'ai inclus une macro qui génère des données de test.
Attention: Codes à tester sur une feuille vierge (à cause du Cells.Clear)
VB:
Sub Tri_Gauche_Droite()
Dim i As Long
Application.ScreenUpdating = False
DataTest
t = Timer()
'tri les données lignes par lignes de la gauche vers la droite
With Range(Cells(1, 1), Cells(Rows.Count, 3).End(3))
    For i = 1 To .Rows.Count
    .Cells(i, 1).Resize(, 3).Sort Key1:=.Cells(i, 1), Order1:=2, Orientation:=xlLeftToRight
    Next
End With
MsgBox Timer - t
End Sub
Private Sub DataTest()
Cells.Clear
[A1] = 12: [A2] = 15: [B1] = 3: [B2] = 5: [C1] = 8: [C2] = 9
Range("A1:C2").AutoFill Destination:=Range("A1:C5000")
End Sub
 
Solution
Re

Question subsidiaire
Précédemment j'avais utilisé Timer pour mesurer le temps d’exécution.
Pour être plus précis (enfin je crois), j'ai testé avec ceci
La question est:
Pourquoi le fait de déclarer les variables dans un cas semble rallonger, dans l'autre raccourcir, le temps d’exécution?
EDITION: Et si on restitue en A1 plutôt qu'en J1, le temps est plus court
Pourquoi?
VB:
Private Declare Function QueryPerformanceCounter Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "Kernel32" (X As Currency) As Boolean
Sub Tri()    '--  Tri bulles
Dim Tbl, temp, NbCol As Byte, lig As Long, i As Long, j As Long
Dim Debut As Currency, Fin As Currency, Freq As Currency
DataTest...

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,

Code:
Sub Tri()    '--  Tri bulles
  Tbl = Range("A1:C5000").Value
  NbCol = UBound(Tbl, 2)
  For lig = 1 To UBound(Tbl)
    For i = 1 To NbCol
      For j = 1 To NbCol - 1
        If Tbl(lig, j + 1) > Tbl(lig, j) Then temp = Tbl(lig, j): Tbl(lig, j) = Tbl(lig, j + 1): Tbl(lig, j + 1) = temp
      Next j
    Next i
  Next lig
  [J1].Resize(UBound(Tbl), UBound(Tbl, 2)) = Tbl
End Sub

JB
 

Pièces jointes

  • Classeur1.xls
    419 KB · Affichages: 50

Staple1600

XLDnaute Barbatruc
Re

Question subsidiaire
Précédemment j'avais utilisé Timer pour mesurer le temps d’exécution.
Pour être plus précis (enfin je crois), j'ai testé avec ceci
La question est:
Pourquoi le fait de déclarer les variables dans un cas semble rallonger, dans l'autre raccourcir, le temps d’exécution?
EDITION: Et si on restitue en A1 plutôt qu'en J1, le temps est plus court
Pourquoi?
VB:
Private Declare Function QueryPerformanceCounter Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "Kernel32" (X As Currency) As Boolean
Sub Tri()    '--  Tri bulles
Dim Tbl, temp, NbCol As Byte, lig As Long, i As Long, j As Long
Dim Debut As Currency, Fin As Currency, Freq As Currency
DataTest
QueryPerformanceCounter Debut
t = Timer()
Tbl = Range("A1:C5000").Value
NbCol = UBound(Tbl, 2)
  For lig = 1 To UBound(Tbl)
    For i = 1 To NbCol
      For j = 1 To NbCol - 1
        If Tbl(lig, j + 1) > Tbl(lig, j) Then temp = Tbl(lig, j): Tbl(lig, j) = Tbl(lig, j + 1): Tbl(lig, j + 1) = temp
      Next j
    Next i
  Next lig
[A1].Resize(UBound(Tbl), UBound(Tbl, 2)) = Tbl
QueryPerformanceCounter Fin
QueryPerformanceFrequency Freq
Debug.Print "Timer: " & Format(Timer - t, "0.00000 s")
Debug.Print "QueryPerf:" & Format((Fin - Debut) / Freq, "0.00000 s")
End Sub
Private Sub DataTest()
Cells.Clear
[A1] = 12: [A2] = 15: [B1] = 3: [B2] = 5: [C1] = 8: [C2] = 9
Range("A1:C2").AutoFill Destination:=Range("A1:C5000")
End Sub

PS: merci à kiki29
 
Dernière édition:

Statistiques des forums

Discussions
311 713
Messages
2 081 806
Membres
101 819
dernier inscrit
lukumubarth