algorithme tri avec 2 critères

Bonjour à tous,
Comme je n'ai pas trouvé la possibilité d'enregistrer une macro sous
LibreOffice (contrairement à Excel), je voulais savoir si un d'entre
vous avait déjà été confronté à un tri avec 2 critères ?
Merci par avance de votre retour.
Excellent après midi.

Amicalement,

Philippe

Bonsoir Philippe,

Bonjour à tous,
Comme je n'ai pas trouvé la possibilité d'enregistrer une macro sous
LibreOffice (contrairement à Excel), je voulais savoir si un d'entre
vous avait déjà été confronté à un tri avec 2 critères ?
Merci par avance de votre retour.
Excellent après midi.

Amicalement,

Philippe

Par macro, on peut trier sur autant de critères qu'on veut.
Pour ça il faut deux outils : un descripteur des colonnes à trier (FieldDesc dans l'exemple) et un descripteur de tri (qui va recevoir le premier) (SortDesc dans l'exemple).

FieldDesc permet de donner le n° de la colonne de tri (.Field) et de spécifier le sens du tri (.IsAscending). Le sens du tri est ascendant par défaut, donc pas besoin a priori de mettre
FieldDesc(0).IsAscending = True
si ce n'est par souci de complétude.

L'exemple ci-dessous trie sur UNE seule colonne (col. G, position 6)

8< ----------------------------------------------------

Sub Trier()

Dim oDoc As Object
Dim oSheet As Object
Dim oRange As Object
Dim FieldDesc(0) As New com.sun.star.table.TableSortField
Dim SortDesc(2) As New com.sun.star.beans.PropertyValue

'récupérer la plage à trier
oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName("Feuille1")
oRange = oSheet.getCellRangeByName("A4:G100")
'on peut aussi mettre un nom défini par ailleurs (ex : "MaPlage")
'oRange = oSheet.getCellRangeByName("MaPlage")

FieldDesc(0).Field = 6 ' colonne G (on compte à partir de 0)
FieldDesc(0).IsAscending = True

SortDesc(0).name="IsSortColumns"
SortDesc(0).value=False
SortDesc(1).name="SortFields"
SortDesc(1).value=oConfigTri()

oRange.sort(SortDesc())

End Sub

8< ----------------------------------------------------

pour trier sur DEUX colonnes (la colonne C en 2e critère, descendant), il faut déclarer un FieldDesc de plus

Dim FieldDesc(1) As New com.sun.star.table.TableSortField

et ajouter la description pour la 2e colonne, par ex :

FieldDesc(1).Field = 2 ' colonne C
FieldDesc(1).IsAscending = False

etc. pour trier sur plus de lignes.

PS : je vois que tu te plonges dans les macros. C'est un vaste monde qui s'ouvre à toi. Je ne saurais trop te conseiller de te documenter sur ce sujet.

Les sources que je connais/pratique :

-- la Bible (en français) de Marcelly et Godard
https://www.eyrolles.com/Informatique/Livre/programmation-openoffice-org-et-libreoffice-9782212132472
existe en papier et en numérique

-- l'autre Bible (en anglais) par Andrew Pitonyak
http://www.pitonyak.org/OOME_3_0.odt

et plein de forums ou de listes de diffusion :wink:

Note que Ask est une excellente ressource aussi :

-- en anglais
https://ask.libreoffice.org/en/questions/

-- et depuis peu en français
https://ask.libreoffice.org/fr/questions/

Si vous répondez, merci de penser à utiliser la fonction "répondre à tous" de votre logiciel de courrier électronique de façon que la liste reçoive une copie de votre réponse.

Bien cordialement,

SortDesc(1).name="SortFields"
SortDesc(1).value=FieldDesc()

Grrr...