Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Comparaison du tri VBA et du tri Excel

  • Initiateur de la discussion Initiateur de la discussion job75
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

job75

XLDnaute Barbatruc
Bonjour le forum,

J'ai juste adapté la macro Quick sort de Jacques Boisgontier à un tableau de plusieurs colonnes.

Il paraît normal que le tri VBA prenne plus de temps que le tri Excel.

Je pensais que le tri Excel serait plus long si les cellules étaient colorées, ce n'est pas le cas.

A+
 

Pièces jointes

Re : Comparaison du tri VBA et du tri Excel

Bonjour Gérard,

toujours très intéressée par les tris, j'ai regardé (et exécuté en pas à pas) ton code.

mais je ne comprends pas bien pourquoi l'instruction .Sort [D1], Header:=xlNo
donne des chiffres complètement différents de ceux du début dans la colonne A.

J'imagine que la colonne A te sert à retrouver l'ordre initial??

Bises

C@thy
 
Re : Comparaison du tri VBA et du tri Excel

Bonjour C@thy 🙂

Pour bien comparer, il faut que les tris Excel et VBA (sur la colonne D) se fassent sur un tableau identique.

D'où la remise dans l'état initial par un tri sur la colonne A.

Par ailleurs ce que j'appelle "restitution" c'est l'entrée du tableau VBA (filtré) dans la feuille de calcul.

Bises itou.
 
Re : Comparaison du tri VBA et du tri Excel

Bonjour,

Le but d'un tri d'un Array() n'est pas de trier un champ du tableur mais de trier un Array() existant.
J'obtiens pour la PJ (20.000 items) avec un tri indexé.

0,07 s pour transfert tableur --> tableau a()
0,18 s pour le tri du tableau ( au lieu de 0,51 s pour le tri non indexé)
0,1 s pour le transfert du tableau a() -- > tableur.

Code:
Sub TriTableau2DIndexé()
  'tt = Timer()
  Dim clé(), index() As Long
  a = [A2:J20000].Value
  tt = Timer()
  Dim b()
  ReDim b(LBound(a) To UBound(a), LBound(a, 2) To UBound(a, 2))
  ReDim clé(LBound(a) To UBound(a, 1))
  ReDim index(LBound(a) To UBound(a, 1))
  For i = LBound(a) To UBound(a, 1)
    clé(i) = a(i, 4): index(i) = i
  Next i
  Call Tri(clé(), index(), LBound(a), UBound(clé))
  For lig = LBound(clé) To UBound(clé)
     For col = LBound(a, 2) To UBound(a, 2): b(lig, col) = a(index(lig), col): Next col
  Next lig
  MsgBox Timer() - tt
  [P2].Resize(UBound(b), UBound(b, 2)).Value2 = b     ' Tableau trié dans le tableur
End Sub

Sub Tri(clé(), index() As Long, gauc, droi) ' Quick sort
  ref = clé((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While clé(g) < ref: g = g + 1: Loop
    Do While ref < clé(d): d = d - 1: Loop
    If g <= d Then
      temp = clé(g): clé(g) = clé(d): clé(d) = temp
      temp = index(g): index(g) = index(d): index(d) = temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(clé, index, g, droi)
  If gauc < d Then Call Tri(clé, index, gauc, d)
End Sub

JB
 

Pièces jointes

Dernière édition:
Re : Comparaison du tri VBA et du tri Excel

Bonjour JB,

Le but d'un tri d'un Array() n'est pas de trier un champ du tableur mais de trier un Array() existant.

Bien sûr et c'est bien ce que je fais dans ma macro.

Au lieu de :

Code:
t = Timer
temp = .Cells
Call Tri(temp, 1, UBound(temp), UBound(temp, 2), 4)
t2 = Timer - t
j'aurais pu écrire :

Code:
temp = .Cells
t = Timer
Call Tri(temp, 1, UBound(temp), UBound(temp, 2), 4)
t2 = Timer - t
Cela ne change guère le résultat sur mon fichier, avec Win7-Excel 2010 :

- Tri Excel 0,16 s

- Tri VBA sans restitution 0,60 s

- Tri VBA avec restitution 1,21 s

A+
 
Re : Comparaison du tri VBA et du tri Excel

Quand on tri un tableau 2D, on utilise un index (on ne tri pas toutes les colonnes)

Pour 6 colonnes , le tri indexé du tableau prend 0,18 s au lieu de 0,51 s pour le tri non indexé.

Pour 10 colonnes , le tri indexé du tableau prend 0,21 s au lieu de 0,74 s pour le tri non indexé.

En PJ un module de classe qui permet de trier un tableau avec qq lignes:


Code:
Sub tri()
  Tablo = [a2:F10000].Value
  Set monTab = New Tableau             ' instanciation de la classe Tableau
  monTab.TriTab Tablo, 4, "A"          ' Tri col 4
  [P2].Resize(UBound(Tablo), UBound(Tablo, 2)).Value2 = Tablo
End Sub

Tri multi-critères colonne 4,1

Code:
Sub tri()
  Tablo = [a2:F10000].Value
  Set monTab = New Tableau             ' instanciation de la classe Tableau
  monTab.TriTabMult Tablo, 4, 1         ' Tri col 4
  [N2].Resize(UBound(Tablo), UBound(Tablo, 2)).Value2 = Tablo
End Sub

http://boisgontierjacques.free.fr/fichiers/Cellules/Tri2DFonctionStandard.xls

Cf Classe Tableau


JB
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…