Ciao Ale il listato presente nel file .bas è esattamente quello del foglio di esempio
'Funzione e procedura per applicare gli stessi filtri presenti in un foglio "principale" ad un foglio secondario
Option Private Module
Option Explicit
Sub ImpostaFiltriMain()
Dim vFilters As Variant
Const sFoglioPrincipale As String = "FoglioPrincipale"
Const sFoglioSecondario As String = "FoglioSecondario"
Const sPrimaCella As String = "A6"
vFilters = Memorizza_Filtri_Foglio_Principale(sFoglioPrincipale)
Call Imposta_Filtri_Foglio_Secondario(sFoglioSecondario, sPrimaCella, vFilters)
End Sub
Function Memorizza_Filtri_Foglio_Principale(sNomeFoglioPrincipale As String) As Variant
Dim Ws As Worksheet
Dim arrFilters As Variant
Dim i As Long, iFilters As Long
Set Ws = ThisWorkbook.Worksheets(sNomeFoglioPrincipale)
With Ws
If .AutoFilterMode Then
iFilters = .AutoFilter.Filters.Count
ReDim arrFilters(1 To iFilters, 1 To 3)
On Error Resume Next
For i = 1 To iFilters
With .AutoFilter.Filters(i)
If .On Then
arrFilters(i, 1) = .Criteria1
arrFilters(i, 2) = .Operator
arrFilters(i, 3) = .Criteria2
End If
End With
Next i
On Error GoTo 0
End If
End With
Memorizza_Filtri_Foglio_Principale = arrFilters
End Function
Sub Imposta_Filtri_Foglio_Secondario(sNomeFoglioSecondario As String, _
sPrimaCella As String, _
vFilters As Variant)
Dim Ws As Worksheet
Dim i As Long, iFilters As Long, iMinFilters As Long
Set Ws = ThisWorkbook.Worksheets(sNomeFoglioSecondario)
With Ws
If IsEmpty(vFilters) Then
If .AutoFilterMode Then
If .FilterMode Then .ShowAllData
End If
Exit Sub
End If
If Not .AutoFilterMode Then .Range(sPrimaCella).AutoFilter
iFilters = .AutoFilter.Filters.Count
iMinFilters = Application.Min(iFilters, UBound(vFilters, 1))
With .Range(sPrimaCella)
For i = 1 To iMinFilters
.AutoFilter Field:=i
If Not IsEmpty(vFilters(i, 1)) Then
If vFilters(i, 2) <> 0 Then
.AutoFilter Field:=i, _
Criteria1:=vFilters(i, 1), _
Operator:=vFilters(i, 2), _
Criteria2:=vFilters(i, 3)
Else
.AutoFilter Field:=i, _
Criteria1:=vFilters(i, 1)
End If
End If
Next i
End With
End With
End Sub
Per replicare su più fogli i filtri applica l'evento Activate per i fogli per cui desideri l'applicazione facendo in modo che il nome del foglio sia lo stesso di quello che viene attivato.
in pratica applicare questo listato:
Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Call Imposta_Filtri_Foglio_Secondario(Me.Name, "A3", arrFiltri)
Application.ScreenUpdating = True
End Sub
ai moduli di classe dei fogli di lavoro.
In alternativa se i fogli sono molti potresti sfruttare l'evento della cartella di lavoro (ThisWorkbook o Questa_cartella_di_cavoro)
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
dove sh è il foglio che viene attivato
Esempio
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Const sFogliDaFiltrare As String = "Foglio2,Foglio3"
Dim arrFogliDaFiltrare As Variant
arrFogliDaFiltrare = Split(sFogliDaFiltrare, ",")
If Not IsError(Application.Match(Sh.Name, arrFogliDaFiltrare, 0)) Then
Application.ScreenUpdating = False
Call Imposta_Filtri_Foglio_Secondario(Sh.Name, "A3", arrFiltri)
Application.ScreenUpdating = True
End If
End Sub
Ovviamente i fogli da filtrare dovrebbero avere la prima cella della "tabella" comune.
Diversamente occorrerebbe andare a distinguere tra i nomi dei fogli selezionati utilizzando Select Case nel caso.
Al solito link trovi il file excel modificato con questa modifica.
ciao