Function ValeursFiltrées(Optional ByVal F As Worksheet) As Variant()
If F Is Nothing Then Set F = ActiveSheet ' Assume la feuille active si elle n'est pas précisée.
ValoriserFiltre ValeursFiltrées, F ' Exécute la procédure pour le tableau à retourner.
End Function
Sub ValoriserFiltre(TSorti() As Variant, ByVal F As Worksheet)
Dim PlgF As Range, LMax As Long, CMax As Long, Zone As Range, TEntré() As Variant, L As Long, C As Long
Set PlgF = F.AutoFilter.Range ' L'initialise à l'unique plage possible de la feuille couverte par un filtre auto.
Set PlgF = PlgF.Rows(2).Resize(PlgF.Rows.Count - 1) ' La réinitialise de façon à en sauter les entêtes.
Set PlgF = PlgF.SpecialCells(xlCellTypeVisible) ' La réinitialise de façon à n'en prendre que les cellules visibles.
Rem. Ceci aboutit dans le cas général à une plage multi-zones, tout comme une union ou une sélection multiple.
LMax = 0: CMax = PlgF.Columns.Count ' Nombre de lignes de sortie à 0, et nombre de colonnes de la plage filtrée noté.
For Each Zone In PlgF.Areas ' Pour chaque zone:
LMax = LMax + Zone.Rows.Count ' Ajoute au nombre de lignes total celui de la zone.
Next Zone
ReDim TSorti(1 To LMax, 1 To CMax) As Variant ' Redimensionne convenablement le tableau à produire.
LMax = 0 ' Numéro de ligne de sortie courant remis à 0.
For Each Zone In PlgF.Areas ' Pour chaque zone:
TEntré = Zone.Value ' en récupère l'intégralité des valeurs.
For L = 1 To UBound(TEntré, 1): LMax = LMax + 1 ' Pour chacune des lignes, le N° de ligne de sortie est incrémenté
For C = 1 To CMax: TSorti(LMax, C) = TEntré(L, C): Next C ' et on y copie la valeur de chaque colonne.
Next L
Next Zone
End Sub