Sub CaptureFiltresEtCopieFeuille()
Dim ws As Worksheet, wsResult As Worksheet
Dim af As AutoFilter
Dim colFiltres As New Collection
Dim oFiltre As clsFiltre
Dim f As Filter
Dim crit As Variant
Dim i As Long, j As Long
Dim lastRow As Long
Dim cell As Range
Dim dict As Object
Dim estFiltre As Boolean
Dim ligne As Long
Set ws = ActiveSheet
Set af = ws.AutoFilter
' Créer ou nettoyer la feuille de résultat
On Error Resume Next
Set wsResult = ThisWorkbook.Sheets("FiltreSansParcourirColonne")
If wsResult Is Nothing Then
Set wsResult = ThisWorkbook.Sheets.Add
wsResult.Name = "FiltreSansParcourirColonne"
Else
wsResult.Cells.Clear
End If
On Error GoTo 0
ligne = 1
' Boucle sur toutes les colonnes de la plage utilisée
For i = 1 To ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
Set oFiltre = New clsFiltre
oFiltre.NomColonne = ws.Cells(1, i).Value
Set dict = CreateObject("Scripting.Dictionary")
estFiltre = False
' Vérifier si un filtre existe et est actif sur cette colonne
If Not af Is Nothing Then
Set f = af.Filters(i)
If f.On Then
estFiltre = True
' Valeurs sélectionnées uniquement
If IsArray(f.Criteria1) Then
For Each crit In f.Criteria1
oFiltre.AddValeur crit
Next crit
Else
oFiltre.AddValeur f.Criteria1
If f.Operator > 0 Then
oFiltre.AddValeur f.Criteria2
End If
End If
End If
End If
' Si la colonne n'est pas filtrée, on ajoute toutes les valeurs uniques
If Not estFiltre Then
lastRow = ws.Cells(ws.Rows.Count, i).End(xlUp).Row
For Each cell In ws.Range(ws.Cells(2, i), ws.Cells(lastRow, i))
If Not dict.exists(cell.Value) Then
oFiltre.AddValeur cell.Value
dict(cell.Value) = True
End If
Next cell
End If
' Ajouter l'objet filtre à la collection principale
colFiltres.Add oFiltre, oFiltre.NomColonne
' === Affichage dans la feuille ===
If estFiltre Then
wsResult.Cells(ligne, 1).Value = "Colonne (Filtré) : " & oFiltre.NomColonne
Else
wsResult.Cells(ligne, 1).Value = "Colonne (Non Filtré) : " & oFiltre.NomColonne
End If
ligne = ligne + 1
For j = 1 To oFiltre.Valeurs.Count
wsResult.Cells(ligne, 1).Value = " - " & oFiltre.Valeurs(j)
ligne = ligne + 1
Next j
wsResult.Cells(ligne, 1).Value = String(40, "*") ' Séparateur
ligne = ligne + 1
Next i
wsResult.Columns(1).AutoFit
MsgBox "Résultat copié sur la feuille 'FiltreSansParcourirColonne'.", vbInformation
End Sub