La modération vous a écrit: Vous postez en section Macros et API. Le terme Macro est inutile dans le titre. Nous l'avons supprimé.
Bonjour.
Mon précédent sujet a été verrouillé et je ne peux le rouvrir.
Je dois donc en poster un nouveau.
J'ai fait une nouvelle tentative hier, en installant la version 6.2.4. sous Win 10. (en remplacement de la 5.4.7.2).
C'est celle que j'ai sous Linux, et elle ne pose aucun souci.
La macro de tri est interminable (plusieurs minutes) sous LibO6, alors qu'elle est bouclée en 2 secondes sous LibO5.
Je sais que l'on va me demander le fichier... J'ai bien compris.
Cependant, je dois l'anonymiser ; c'est un travail qui, à ce jour, me semble énorme.
Il y a beaucoup de données, connectées entre elles... Bref....
Je ne peux pas supprimer les données, parce que le problème de lenteur disparaît (quand je conserve 10 lignes sur les 300 et plus de mon tableau, le tri est fait à une vitesse normale).
J'émets donc l'hypothèse d'abord, avant de penser qu'il y a un souci dans le tableau et de passer du temps à le vider pour l'envoyer, qu'il y a peut-être eu des changements au niveau du code des macros, je ne sais pas. C'est pour cela que je soumets prioritairement un exemple de macro de tri à votre analyse.
Je précise que ce tableau et ces macros ont toujours fonctionné sous LibO5, en suivant l'évolution des versions.
Merci de vos retours.
Code : Tout sélectionner
Sub tri_alphabetique() 'trie tous les noms de la liste en distinguant actifs et inactifs ----- validé v5 -----
rem déclaration variables
dim classeur as object, fenetre as object, feuilles as object, feuille as object, cellule_compteur as object, cellule_test as object, zone_tri as object
dim dossiers as integer
dim configTri(1) as new com.sun.star.table.TableSortField
dim descTri as variant
dim nom_test as string
classeur = ThisComponent
fenetre = classeur.CurrentController.Frame.ContainerWindow
feuilles = classeur.Sheets
feuille = feuilles.getByName("REFERENT")
cellule_compteur = feuille.getCellByPosition(0,1) rem lit le nombre de dossiers dans la base
dossiers = cellule_compteur.value
rem tout bloquer
classeur.lockControllers
classeur.addActionLock
classeur.enableAutomaticCalculation(false)
fenetre.Enable = false
if dossiers > 1 then rem il y a au moins deux noms saisis
cellule_test = feuille.getCellByPosition(2, (6 + dossiers - 1)) rem lit le nom de la dernière ligne
nom_test = cellule_test.string
if nom_test<>"" then rem si dernière ligne pas vide : tri
zone_tri = feuille.getCellRangeByPosition(0, 6, 230, (6 + dossiers - 1))
with configTri(0) rem actif
.Field = 7
.IsAscending = false
end with
with configTri(1) rem nom et prénom
.Field = 119
.IsAscending = true
end with
descTri = zone_tri.createSortDescriptor
setPropVal(descTri, "SortFields", configTri())
setPropVal(descTri, "IsSortColumns", false)
setPropVal(descTri, "CopyOutputData", false)
setPropVal(descTri, "IsUserListEnabled", false)
setPropVal(descTri, "BindFormatsToContent", true)
setPropVal(descTri, "ContainsHeader", false)
zone_tri.Sort(descTri())
MsgBox("Demande réalisée.", 64, "")
else
MsgBox("Complétez d'abord la dernière ligne.", 16, "")
endif
end if
if dossiers = 1 then rem il y a un seul nom saisi
MsgBox("Une seule entrée. Pas de tri.", 16, "")
end if
if dossiers = 0 then rem il n'y a pas de nom saisi
MsgBox("Pas d'entrée. Pas de tri.", 16, "")
end if
rem tout débloquer
fenetre.Enable = true
classeur.enableAutomaticCalculation(true)
classeur.removeActionLock
classeur.unlockControllers
classeur.calculate
End Sub