À l'heure où j'écris (version LibreOffice 25.8.3), il n'existe pas d'accès direct à l'autofiltre d'une feuille par macro.
Il est donc nécessaire de déclarer la plage de cellules bénéficiant de l'autofiltrage (avec les en-têtes de colonnes) en tant que plage de base de données via le menu "Données" → "Définir la plage..." (bien vérifier dans les options que "Contient des étiquettes de colonne" soit coché comme dans la capture ci-contre).
Rem : Ne pas confondre les plages de base de données avec les plages nommées mais rien n'empêche d'avoir une plage nommée correspondant à une plage de base de données (c'est ce que je fais pour faciliter leur répérage).
Cela a pour effet de peupler la propriété "DatabaseRanges" qu'on utilisera pour récupérer les informations sur le filtrage.
Dans la macro on utilise les fonctions "FilterDescriptor" et "FilterFields3" pour récupérer les info de filtrage. "FilterFields3" permet, contrairement aux autres propriétés FilterFields1 et FilterFields2, de récupérer plusieurs critères sélectionnés.
Voici ci-dessous un exemple de macro permettant de récupérer les informations sur l'autofiltrage appliquée à une feuille et de les insérer dans la cellule W2 de la feuille "oFeuilleGraphique" :
REM ***** BASIC *****
' Permet de récupérer les informations sur l'Autofiltre de la feuille "Récap"' à condition qu'on ait une PLAGE DE DONNÉES définie préalablement' ici il s'agit de la plage nommée "Tableau_Récap_Daudet" qu'on a mis en' plage de données "Tableau_Récap"Sub RecupererInfoAutofiltre(nomFeuille As String) Dim monDoc As Object, oFeuille As Object Dim oDBRanges As Object, oPlage As Object Dim oFilterDesc As Object, aChampsFiltrage As Variant Dim i As Long, i2 as Long, aCriteres As Variant, nom As String Dim colChampFiltrage as integer, oCritere As Object, critereNo1 As Boolean Dim msg As String, separateur as String, idx As Long
monDoc = ThisComponent oFeuilleData = monDoc.Sheets.getByName(nomFeuille) oFeuilleGraphique = monDoc.Sheets.getByName("Courbe Journées École") oFeuilleGraphique.getCellRangeByName("W2").String="" 'Supprime les info précédentes du filtre (cellule non protégée) oDBRanges = monDoc.DatabaseRanges
For idx = 0 To oDBRanges.getCount() - 1 oPlage = oDBRanges.getByIndex(idx) nom = oPlage.Name ' Vérifier si la plage du DatabaseRange se trouve sur la feuille ciblée If nom = "Tableau_Récap_DAUDET" Then oFilterDesc = oPlage.FilterDescriptor aChampsFiltrage = oFilterDesc.FilterFields3() 'Tableau recensant l'ensemble des critères de filtrage If UBound(aChampsFiltrage) >= 0 Then msg = "Filtre :" For i = LBound(aChampsFiltrage) To UBound(aChampsFiltrage) colChampFiltrage=aChampsFiltrage(i).Field nomChampFiltrage=oFeuilleData.getCellByPosition(colChampFiltrage,5).String msg = msg & " " & nomChampFiltrage & " = " aCriteres = aChampsFiltrage(i).Values separateur="" critereNo1=True For i2 = LBound(aCriteres) To UBound(aCriteres) oCritere=aCriteres(i2) If oCritere.StringValue <>"" Then If critereNo1=False Then separateur=", " If oCritere.IsNumeric Then msg = msg & separateur & oCritere.NumericValue Else msg = msg & separateur & oCritere.StringValue End If critereNo1=False End If Next i2 if i < UBound(aChampsFiltrage) Then msg = msg & " / " Next i End If End If Next idx
'MsgBox msg If msg="" Then msg="École entière" oFeuilleGraphique.getCellRangeByName("W2").String = msgEnd Sub