LibreOffice Calc Plage Base de DonneesÀ 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 = msg
End Sub