Microsoft 365 Est-il possible d'utiliser les fonctions TRIER ou TRIERPAR avec VBA ?

  • Initiateur de la discussion Initiateur de la discussion danielco
  • Date de début Date de début
  • Mots-clés Mots-clés
    vba

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 !

danielco

XLDnaute Barbatruc
Bonjour,

La question est toute entière dans le titre. Est-il possible d'utiliser les fonctions TRIER ou TRIERPAR avec VBA ?

Merci d'avance.

Daniel
 
Solution
Bonjour à tous,

Attention ChatGPT hallucine, ces fonctions sont bien présentes via WorksheetFunction. Voir ci-joint un petit exemple :
NB : Il faut fournir le 3e argument pour SortBy (direction de tri) qui n'est pas optionnel comme dans la fonction.

VB:
Public Sub ExTri()
  ' generation des index de tri dans la feuille (statique)
  With Sheet1.Range("A2")
    Range(.Cells, .End(xlDown)).Clear
    .Formula2 = "=RANDARRAY(20,1,0,100,TRUE)"
    .SpillingToRange.Value = .SpillingToRange.Value
  End With
 
  Dim myData As Variant
  myData = Sheet1.Range("A2:B21").Value
 
  Dim colIdx As Variant
  ' utilisation de application.index car worksheetfunction.index leve erreur
  colIdx = Application.Index(myData, , 1)
 
  Dim colNames As Variant...
Bonjour Danielco,
Pour trier un tableau, vous pouvez utiliser "Sort".
Par ex pour trier un tableau A1.D100 tri sur colonne B ascendant avec titre :
VB:
Range("A1:D100").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
et sur plusieurs colonnes, par ex :
Code:
Range("A1:F100").Sort Key1:=Range("B1"), Key2:=Range("D1"), Order1:=xlAscending, Order2:=xlDescending, Header:=xlYes
 
Bonjour Danielco,
Pour trier un tableau, vous pouvez utiliser "Sort".
Par ex pour trier un tableau A1.D100 tri sur colonne B ascendant avec titre :
VB:
Range("A1:D100").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
et sur plusieurs colonnes, par ex :
Code:
Range("A1:F100").Sort Key1:=Range("B1"), Key2:=Range("D1"), Order1:=xlAscending, Order2:=xlDescending, Header:=xlYes
Bonjour et merci,

Ce que je souhaite faire c'est utiliser, si possible TRIER pour trier un tableau en mémoire, sans passer par les routines de tri que j'utilise sans les comprendre, genre quicksort.

Daniel
 
Bonsoir.
J'ai si ça vous intéresse des fonctions qui retournent une table de Long des indices de lignes par ordre crossant d'une ou plusieurs colonne, donc un tableau dynamique 2D, et basés sur une méthode différente du Quick-Sort. C'est une méthode par fusions sans découpages inutiles en petit paquets au départ.
 
Bonsoir.
J'ai si ça vous intéresse des fonctions qui retournent une table de Long des indices de lignes par ordre crossant d'une ou plusieurs colonne, donc un tableau dynamique 2D, et basés sur une méthode différente du Quick-Sort. C'est une méthode par fusions sans découpages inutiles en petit paquets au départ.
Bonsoir et merci,
Je veux bien, si vous avez une routine qui trie des tableaux à deux dimensions.
Merci d'avance.
 
Il s'agit de la Sub IndexerParFusions du module MGigogne quand c'est pour plusieurs colonnes d'arguments de tri,
et de la Sub IndexerFus1Col du module MSujetCBx pour une seule colonne.
Rappel: elles constituent seulement une table dynamique de Long. Pour obtenir le tableau effectivement trié il faut reverser le Tableau source dans un nouveau tableau dynamique en suivant l'ordre des numéros de lignes donné dans cette table, comme finissent par le faire mes fonctions Gigogne et SujetCBx.
 

Pièces jointes

Dernière édition:
Bonsoir à tous,

A priori TRIER et TRIERPAR n'ont pas de correspondance en VBA, voici la réponse de ChatGPT :
Dans Excel 2021 VBA, Application.Sort et Application.SortBy ne sont pas des méthodes valides en tant que telles. Ce sont des concepts liés au tri, mais en VBA moderne, tu dois utiliser l’objet Sort associé à une feuille ou une plage.
A+
 
Il s'agit de la Sub IndexerParFusions du module MGigogne quand c'est pour plusieurs colonnes d'arguments de tri,
et de la Sub IndexerFus1Col du module MSujetCBx pour une seule colonne.
Rappel: elles constituent seulement une table dynamique de Long. Pour obtenir le tableau effectivement trié il faut reverser le Tableau source dans un nouveau tableau dynamique en suivant l'ordre des numéros de lignes donné dans cette table, comme finissent par le faire mes fonctions Gigogne et SujetCBx.
Bonjour,
Merci. Je vais prendre le temps de les comprendre. Si j'ai une question, je reviendrai vers toi.
 
Bonjour à tous,

Attention ChatGPT hallucine, ces fonctions sont bien présentes via WorksheetFunction. Voir ci-joint un petit exemple :
NB : Il faut fournir le 3e argument pour SortBy (direction de tri) qui n'est pas optionnel comme dans la fonction.

VB:
Public Sub ExTri()
  ' generation des index de tri dans la feuille (statique)
  With Sheet1.Range("A2")
    Range(.Cells, .End(xlDown)).Clear
    .Formula2 = "=RANDARRAY(20,1,0,100,TRUE)"
    .SpillingToRange.Value = .SpillingToRange.Value
  End With
 
  Dim myData As Variant
  myData = Sheet1.Range("A2:B21").Value
 
  Dim colIdx As Variant
  ' utilisation de application.index car worksheetfunction.index leve erreur
  colIdx = Application.Index(myData, , 1)
 
  Dim colNames As Variant
  colNames = Application.Index(myData, , 2)
 
  Dim sortedNames As Variant
  sortedNames = WorksheetFunction.SortBy(colNames, colIdx, 1)
 
  Sheet1.Range("F2").Resize(UBound(sortedNames)).Value = sortedNames
End Sub
Edit, et on peut utiliser Sort de manière équivalente comme ceci
VB:
Sheet1.Range("F2").Resize(UBound(myData,1), UBound(myData,2)).Value = WorksheetFunction.Sort(myData)
 

Pièces jointes

Bonjour,

Comme souvent le cas. La fonction Sort était déjà utilisé au post #2.
Mais n'est valable que sur feuille pas en array. En array il n'y a qu'un module VBA pour trier mais pas de formule. ( post #8 par exemple )
Non, c'est différent. On peut très bien utiliser les fonctions "formules" Excel TRIER (WorksheetFunction.Sort != Range.Sort) et TRIER.PAR (WorksheetFunction.SortBy) sur des Array en mémoire. Tant qu'elles respectent la structure (2D) d'un équivalent de plages d'une feuille.

C'est l'objectif de mon post, qui ne travaille pas sur des Ranges mais uniquement sur des Array (Variant). La question de l'OP est pleine de sens : sur XL 2021+ on peut effectivement se passer de ces algorithmes de tri "codés manuellement" pour trier des array de valeurs, tant qu'on ne manipule que du texte/numérique c'est suffisant et beaucoup plus simple.

EDIT : je ne comprends donc pas pourquoi le #9 a été marqué comme solution alors qu'il est complètement faux...
 
bonjour le fil,
un essai en PJ (à utiliser à partir d'excel2019, je crois)
VB:
Sub M_Test()
     Dim Arr, i, j, L, S

     Arr = WorksheetFunction.RandArray(10000, 3, -100, 100)     'matrice avec 3 colonnes, valeurs "double" entre -100 et 100
     For i = 1 To UBound(Arr)
          L = WorksheetFunction.RandBetween(1, 10)
          S = ""
          For j = 1 To L
               S = S & Chr(WorksheetFunction.RandBetween(65, 90))
          Next
          Arr(i, 3) = S                      'remplacer 3ième colonne par un string de longueur variable
     Next

     With Range("A1").Resize(UBound(Arr), UBound(Arr, 2))     'plage pour coller
          .Value = Arr                       'coller matrice originale
          .Sort .Range("A1"), xlAscending, .Range("B1"), , xlDescending, .Range("C1"), xlAscending, Header:=xlNo     'puis appliquer un triage oridinaire

          'application.sort paramètre 1 = la matrice, paramètre 2 = l'index de a colonne, paramétre 3 = 1 pour ascendant et -1 pour descendant, paramètre 4 eventuellement si on veut trier lignes au lieu de colonnes)
          'si on trie plusieurs colonnes, on commence avec le key3, puis le key2 et alors key1
          .Offset(, 5) = Application.Sort(Application.Sort(Application.Sort(Arr, 3, 1), 2, -1), 1, 1)     'coller résultat après 3 triage dans la matrice avec le même but
     End With

     MsgBox Range("J1").Value
End Sub
 

Pièces jointes

- 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

Réponses
2
Affichages
197
  • Question Question
Microsoft 365 Fonction si
Réponses
7
Affichages
148
Retour