Code VBA qui ne fonctionne pas si filtre auto activé
Bonjour à tous,
J'ai un fichier en PJ avec un code VBA, réalisé par GMB qui fonctionne parfaitement (merci à lui) si pas de filtre auto activé.
Le code s'active quand l'onglet "Tableau" s'active.
Est'il possible que si l'onglet "Tableau" comporte des filtres auto activés, ca ne foire pas la fonction du code? du genre que ca ignore les filtres
Merci
Losand
Il faut enlever les filtres pour que cela marche
Option Explicit
Sub aa()
On Error Resume Next
ActiveSheet.ShowAllData
End Sub
Tout cela doit être sur le code de la FEUILLE filtrée
Et appeler cette sub avant le traitement
Cdt
Bonsoir
Juste avant la ligne dercol=..., mettez ceci -->
On error resume next
fT.ShowAllData
Une remarque sur la déclaration des variables. Je mettrais plutôt cela juste en dessous de "Private Sub Worksheet_Activate()"
Comme ceci :
Private Sub Worksheet_Activate()
Dim fI As Worksheet, fT As Worksheet, tabloT, tabloI, tabloR()
Dim it As Integer, ii As Integer, k As Integer, derln As Integer, dercol As Integer
Dim flag As Boolean
....
J'ai supprimé les variables i et j, qui ne servent pas
Cordialement
Bonjour
Attention à l'utilisation du
on error resume next
Si on utilise ce genre d'instruction car on sait que cela risque d'engendré une erreur il ne faut pas oublier de desactivé cela pour la suite du code sinon en cas d'erreur plus tard dans l’exécution du code, le programme ne fera pas ce que l'on souhaite sans message d'erreur ...
donc ajouter ensuite :
On error goto 0
Sinon pour le sujet du jour moi j'utiliserais plutôt ceci pour désactivé les filtres :
If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilterMode = False
il faut évidemment être sur la feuille
Fred
Re
Exact Fred2406, c'est encore mieux comme cela.
Dans son code, cela peut devenir ceci -->
If ft.AutoFilterMode = True Then ft.AutoFilterMode = False
Pour ce qui est d'être sur la feuille, il y sera puisque le code fonctionne à la sélection de l'onglet et le code se trouve placé dans cette feuille.
Cordialement
Bonsoir à tous,
merci de vos réponses, mais ma demande est différente.
Je souhaiterais que mon filtre reste activé et que le code fasse comme si ce n'était pas le cas.
je connais pas vraiment le VBA, Gmb m'a beaucoup aidé pour ce code mais si j'essaye d'exprimer ma demande je dirais :
Les variables Tablo ne peuvent t'elles pas ignorer le filtre et prendre en compte l'ensemble des lignes malgré le filtre.
Le filtre étant juste visuel pour l'utilisateur.
Losand
Bonjour
merci de vos réponses, mais ma demande est différente.
Je souhaiterais que mon filtre reste activé et que le code fasse comme si ce n'était pas le cas.
Je pense que vous n'avez pas essayé ce qui était proposé.
Remplacez le début du code par celui ci-dessous
Option Explicit
Private Sub Worksheet_Activate()
Dim fI As Worksheet, fT As Worksheet, tabloT, tabloI, tabloR()
Dim it As Integer, ii As Integer, k As Integer, derln As Integer, dercol As Integer
Dim flag As Boolean
Set fI = Sheets("Import") 'On repére la feuille "Import" par une variable
Set fT = Sheets("Tableau") 'On repère la feuille "Tableau" par une variable
tabloI = fI.Range("A1").CurrentRegion 'On met les données du tableau de la feuille "Import" dans une variable tableau
'tabloT = Range("A14").CurrentRegion 'On met les données du tableau de la feuille "Tableau" dans une variable tableau
On Error Resume Next
fT.ShowAllData
On Error GoTo 0
dercol....
Veillez à supprimer les Dim qui se trouve juste en dessous de Option explicit puisqu'elles sont reprises dans le code que je vous propose
Cordialement
Bonjour Dan,
J'ai bien changé le code, mais je dois mal m'exprimer.
Je souhaite que mon tableau! reste filtré mais que le code ne soit pas perturbé par les filtres.
J'ai mis une explication en exemple sur le fichier en PJ.
En cherchant un peu, cela pourrait revenir à :
1- Memoriser les filtres actifs
2- Le filtrage se desactive
3- mon code s'execute
4- Le filtrage se reactive (avec les filtres mémorisés)
Losand
Bonjour,
Un essai ... Restriction d'un maximum de 2 paramètres de filtrage ...
Un sénior pourrait éventuellement améliorer pour avoir plus de 2 paramètres de filtrage ...
Option Explicit
Dim fI As Worksheet, fT As Worksheet, tabloT, tabloI, tabloR()
Dim i&, it&, ii&, j&, k&, derln&, dercol&, flag&
Dim filterArray()
Dim currentFiltRange As String
Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Set fI = Sheets("Import") 'On repére la feuille "Import" par une variable
Set fT = Sheets("Tableau") 'On repère la feuille "Tableau" par une variable
tabloI = fI.Range("A1").CurrentRegion 'On met les données du tableau de la feuille "Import" dans une variable tableau
'tabloT = Range("A14").CurrentRegion 'On met les données du tableau de la feuille "Tableau" dans une variable tableau
Call MemoriseFiltres
dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14
derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
tabloT = Range(Cells(14, 1), Cells(derln, dercol))
ReDim tabloR(1 To UBound(tabloI, 1) - 1, 1 To UBound(tabloT, 2)) 'On définit la variable tableau du résultat
k = 0
For ii = 3 To UBound(tabloI, 1) 'Om passe toutes les lignes de la variable tabloI
flag = 0
For it = 2 To UBound(tabloT, 1) 'pour chacune de ces lignes, on passe toutes les lignes de la variable tabloT
If UCase(tabloT(it, 1)) = UCase(tabloI(ii, 1)) Then 'On recherche les lignes qui ont le même nom en colonne A
'sur les 2 tableaux
flag = 1 'on indique qu'on en a trouvé une et
'on recopie à la même ligne les données de la feuille Import
'au cas ou une données ait changé sur les colonne B,C, ou D
tabloT(it, 2) = tabloI(ii, 2)
tabloT(it, 4) = Year(tabloI(ii, 3))
tabloT(it, 6) = Month(tabloI(ii, 3))
tabloT(it, 8) = tabloI(ii, 4)
End If
Next it
If flag = 0 Then 'si flag = 0, aucune valeur en colonne A de tabloI ne corresopond
'à une valeur de la colonne A de TabloT. C'est donc qu'il faut
'ajouter la ligne du tabloI au tabloRon reporte dans tabloR les
'nouvelles données de tabloI
tabloR(k + 1, 1) = tabloI(ii, 1)
tabloR(k + 1, 2) = tabloI(ii, 2)
tabloR(k + 1, 4) = Year(tabloI(ii, 3))
tabloR(k + 1, 6) = Month(tabloI(ii, 3))
tabloR(k + 1, 8) = tabloI(ii, 4)
k = k + 1
End If
Next ii
'on reécrit le tabloT au bas du tableau de la feuille Tableau qui a pris en compte les lignes modifiées
Range("A14").Resize(UBound(tabloT, 1), UBound(tabloT, 2)) = tabloT
'on ajoute le tabloR (nouvelles lignes) au bas du tableau de la feuille Tableau
Range("A" & UBound(tabloT, 1) + 14).Resize(UBound(tabloI, 1) - 1, UBound(tabloT, 2)) = tabloR
'on classe les données du tableau de la feuille Tableau
dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14
derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
tabloT = Range(Cells(14, 1), Cells(derln, dercol))
'With Range("A14").CurrentRegion
With Range(Cells(14, 1), Cells(derln, dercol))
.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes
'et on y met le quadrillage
'For i = 7 To 12
'.Resize(Range("A14").CurrentRegion.Rows.Count, UBound(tabloR, 2)).Borders(i).LineStyle = xlContinuous
'Next i
End With
Call ReAppliqueFiltres
End Sub
Sub MemoriseFiltres() ''' kjin < de l'autre forum
Dim F As Integer
Application.ScreenUpdating = False
Set fT = ActiveSheet
With fT.AutoFilter
currentFiltRange = .Range.Address
With .Filters
ReDim filterArray(1 To .Count, 1 To 3)
For F = 1 To .Count
With .Item(F)
If .On Then
filterArray(F, 1) = .Criteria1
If .Operator Then
filterArray(F, 2) = .Operator
filterArray(F, 3) = .Criteria2
End If
End If
End With
Next
End With
End With
fT.AutoFilterMode = False 'suppression du filtre
End Sub
Sub ReAppliqueFiltres() ''' kjin < de l'autre forum
Dim Col As Integer
Application.ScreenUpdating = False
fT.AutoFilterMode = False
For Col = 1 To UBound(filterArray(), 1)
If Not IsEmpty(filterArray(Col, 1)) Then
If filterArray(Col, 2) Then
fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1), _
Operator:=filterArray(Col, 2), Criteria2:=filterArray(Col, 3)
Else
fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1)
End If
End If
Next
End Sub
ric
Merci Ric,
On s'approche du but mais il y a bug.
Lorsque tableau n'est pas filtré, je vais sur Import et revient sur Tableau, le filtre auto à disparu (plus de fleches grise)
et si je retourne sur import et revient encore sur tableau alors "Erreur d'execution 91"
Sinon ca fonctionne bien quand des filtres sont activés.
Bonjour,
Un essai ... Restriction d'un maximum de 2 paramètres de filtrage ...
Un sénior pourrait éventuellement améliorer pour avoir plus de 2 paramètres de filtrage ...
Option Explicit Dim fI As Worksheet, fT As Worksheet, tabloT, tabloI, tabloR() Dim i&, it&, ii&, j&, k&, derln&, dercol&, flag& Dim filterArray() Dim currentFiltRange As String Private Sub Worksheet_Activate() Application.ScreenUpdating = False Set fI = Sheets("Import") 'On repére la feuille "Import" par une variable Set fT = Sheets("Tableau") 'On repère la feuille "Tableau" par une variable tabloI = fI.Range("A1").CurrentRegion 'On met les données du tableau de la feuille "Import" dans une variable tableau 'tabloT = Range("A14").CurrentRegion 'On met les données du tableau de la feuille "Tableau" dans une variable tableau Call MemoriseFiltres dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14 derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A tabloT = Range(Cells(14, 1), Cells(derln, dercol)) ReDim tabloR(1 To UBound(tabloI, 1) - 1, 1 To UBound(tabloT, 2)) 'On définit la variable tableau du résultat k = 0 For ii = 3 To UBound(tabloI, 1) 'Om passe toutes les lignes de la variable tabloI flag = 0 For it = 2 To UBound(tabloT, 1) 'pour chacune de ces lignes, on passe toutes les lignes de la variable tabloT If UCase(tabloT(it, 1)) = UCase(tabloI(ii, 1)) Then 'On recherche les lignes qui ont le même nom en colonne A 'sur les 2 tableaux flag = 1 'on indique qu'on en a trouvé une et 'on recopie à la même ligne les données de la feuille Import 'au cas ou une données ait changé sur les colonne B,C, ou D tabloT(it, 2) = tabloI(ii, 2) tabloT(it, 4) = Year(tabloI(ii, 3)) tabloT(it, 6) = Month(tabloI(ii, 3)) tabloT(it, 8) = tabloI(ii, 4) End If Next it If flag = 0 Then 'si flag = 0, aucune valeur en colonne A de tabloI ne corresopond 'à une valeur de la colonne A de TabloT. C'est donc qu'il faut 'ajouter la ligne du tabloI au tabloRon reporte dans tabloR les 'nouvelles données de tabloI tabloR(k + 1, 1) = tabloI(ii, 1) tabloR(k + 1, 2) = tabloI(ii, 2) tabloR(k + 1, 4) = Year(tabloI(ii, 3)) tabloR(k + 1, 6) = Month(tabloI(ii, 3)) tabloR(k + 1, 8) = tabloI(ii, 4) k = k + 1 End If Next ii 'on reécrit le tabloT au bas du tableau de la feuille Tableau qui a pris en compte les lignes modifiées Range("A14").Resize(UBound(tabloT, 1), UBound(tabloT, 2)) = tabloT 'on ajoute le tabloR (nouvelles lignes) au bas du tableau de la feuille Tableau Range("A" & UBound(tabloT, 1) + 14).Resize(UBound(tabloI, 1) - 1, UBound(tabloT, 2)) = tabloR 'on classe les données du tableau de la feuille Tableau dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14 derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A tabloT = Range(Cells(14, 1), Cells(derln, dercol)) 'With Range("A14").CurrentRegion With Range(Cells(14, 1), Cells(derln, dercol)) .Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes 'et on y met le quadrillage 'For i = 7 To 12 '.Resize(Range("A14").CurrentRegion.Rows.Count, UBound(tabloR, 2)).Borders(i).LineStyle = xlContinuous 'Next i End With Call ReAppliqueFiltres End Sub Sub MemoriseFiltres() ''' kjin < de l'autre forum Dim F As Integer Application.ScreenUpdating = False Set fT = ActiveSheet With fT.AutoFilter currentFiltRange = .Range.Address With .Filters ReDim filterArray(1 To .Count, 1 To 3) For F = 1 To .Count With .Item(F) If .On Then filterArray(F, 1) = .Criteria1 If .Operator Then filterArray(F, 2) = .Operator filterArray(F, 3) = .Criteria2 End If End If End With Next End With End With fT.AutoFilterMode = False 'suppression du filtre End Sub Sub ReAppliqueFiltres() ''' kjin < de l'autre forum Dim Col As Integer Application.ScreenUpdating = False fT.AutoFilterMode = False For Col = 1 To UBound(filterArray(), 1) If Not IsEmpty(filterArray(Col, 1)) Then If filterArray(Col, 2) Then fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1), _ Operator:=filterArray(Col, 2), Criteria2:=filterArray(Col, 3) Else fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1) End If End If Next End Sub
ric
Bonjour à tous,
Je n'ai pas explorer ce cas de figure.
Je regarde la chose ...
ric
Bonjour à tous,
Un essai ... qui, je crois, répond à la demande ... et coquille corrigée ...
Option Explicit
Dim fI As Worksheet, fT As Worksheet, tabloT, tabloI, tabloR()
Dim i&, it&, ii&, j&, k&, derln&, dercol&, flag&
Dim filterArray()
Dim currentFiltRange As String
Dim Af As Boolean, AfActif As Boolean
Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Set fI = Sheets("Import") 'On repére la feuille "Import" par une variable
Set fT = Sheets("Tableau") 'On repère la feuille "Tableau" par une variable
tabloI = fI.Range("A1").CurrentRegion 'On met les données du tableau de la feuille "Import" dans une variable tableau
With fT.AutoFilter
If Not AutoFilter Is Nothing Then
Call MemoriseFiltres
Af = True
Else
Af = False
End If
End With
dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14
derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
tabloT = Range(Cells(14, 1), Cells(derln, dercol))
ReDim tabloR(1 To UBound(tabloI, 1) - 1, 1 To UBound(tabloT, 2)) 'On définit la variable tableau du résultat
k = 0
For ii = 3 To UBound(tabloI, 1) 'Om passe toutes les lignes de la variable tabloI
flag = 0
For it = 2 To UBound(tabloT, 1) 'pour chacune de ces lignes, on passe toutes les lignes de la variable tabloT
If UCase(tabloT(it, 1)) = UCase(tabloI(ii, 1)) Then 'On recherche les lignes qui ont le même nom en colonne A
'sur les 2 tableaux
flag = 1 'on indique qu'on en a trouvé une et
'on recopie à la même ligne les données de la feuille Import
'au cas ou une données ait changé sur les colonne B,C, ou D
tabloT(it, 2) = tabloI(ii, 2)
tabloT(it, 4) = Year(tabloI(ii, 3))
tabloT(it, 6) = Month(tabloI(ii, 3))
tabloT(it, 8) = tabloI(ii, 4)
End If
Next it
If flag = 0 Then 'si flag = 0, aucune valeur en colonne A de tabloI ne corresopond
'à une valeur de la colonne A de TabloT. C'est donc qu'il faut
'ajouter la ligne du tabloI au tabloRon reporte dans tabloR les
'nouvelles données de tabloI
tabloR(k + 1, 1) = tabloI(ii, 1)
tabloR(k + 1, 2) = tabloI(ii, 2)
tabloR(k + 1, 4) = Year(tabloI(ii, 3))
tabloR(k + 1, 6) = Month(tabloI(ii, 3))
tabloR(k + 1, 8) = tabloI(ii, 4)
k = k + 1
End If
Next ii
'on reécrit le tabloT au bas du tableau de la feuille Tableau qui a pris en compte les lignes modifiées
Range("A14").Resize(UBound(tabloT, 1), UBound(tabloT, 2)) = tabloT
'on ajoute le tabloR (nouvelles lignes) au bas du tableau de la feuille Tableau
Range("A" & UBound(tabloT, 1) + 14).Resize(UBound(tabloI, 1) - 1, UBound(tabloT, 2)) = tabloR
'on classe les données du tableau de la feuille Tableau
dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14
derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
tabloT = Range(Cells(14, 1), Cells(derln, dercol))
'With Range("A14").CurrentRegion
With Range(Cells(14, 1), Cells(derln, dercol))
.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes
'et on y met le quadrillage
'For i = 7 To 12
'.Resize(Range("A14").CurrentRegion.Rows.Count, UBound(tabloR, 2)).Borders(i).LineStyle = xlContinuous
'Next i
End With
If Af = True Then Call ReAppliqueFiltres
End Sub
Sub MemoriseFiltres()
Dim F As Integer
Application.ScreenUpdating = False
AfActif = False
Set fT = ActiveSheet
With fT.AutoFilter
currentFiltRange = .Range.Address
With .Filters
ReDim filterArray(1 To .Count, 1 To 3)
For F = 1 To .Count
With .Item(F)
If .On Then
AfActif = True
filterArray(F, 1) = .Criteria1
If .Operator Then
filterArray(F, 2) = .Operator
filterArray(F, 3) = .Criteria2
End If
End If
End With
Next
End With
End With
fT.AutoFilterMode = False 'suppression du filtre
End Sub
Sub ReAppliqueFiltres()
Dim Col As Integer
Application.ScreenUpdating = False
fT.AutoFilterMode = False
If AfActif = True Then
For Col = 1 To UBound(filterArray(), 1)
If Not IsEmpty(filterArray(Col, 1)) Then
If filterArray(Col, 2) Then
fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1), _
Operator:=filterArray(Col, 2), Criteria2:=filterArray(Col, 3)
Else
fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1)
End If
End If
Next Col
End If
If Af = True And AfActif = False Then
With fT.AutoFilter
On Error Resume Next
fT.Range("A14:" & dercol & "14").Select
Selection.AutoFilter = True
On Error GoTo 0
End With
End If
End Sub
ric
Ric,
Malheureusement si pas de filtre, les fleches disparaissent toujours.
Mais plus de message d'erreur
Bonjour à tous,
Un essai ... qui, je crois, répond à la demande...
Option Explicit Dim fI As Worksheet, fT As Worksheet, tabloT, tabloI, tabloR() Dim i&, it&, ii&, j&, k&, derln&, dercol&, flag& Dim filterArray() Dim currentFiltRange As String Dim Af As Boolean, AfActif As Boolean Private Sub Worksheet_Activate() Application.ScreenUpdating = False Set fI = Sheets("Import") 'On repére la feuille "Import" par une variable Set fT = Sheets("Tableau") 'On repère la feuille "Tableau" par une variable tabloI = fI.Range("A1").CurrentRegion 'On met les données du tableau de la feuille "Import" dans une variable tableau With fT.AutoFilter If Not AutoFilter Is Nothing Then Call MemoriseFiltres Af = True Else Af = False End If End With dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14 derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A tabloT = Range(Cells(14, 1), Cells(derln, dercol)) ReDim tabloR(1 To UBound(tabloI, 1) - 1, 1 To UBound(tabloT, 2)) 'On définit la variable tableau du résultat k = 0 For ii = 3 To UBound(tabloI, 1) 'Om passe toutes les lignes de la variable tabloI flag = 0 For it = 2 To UBound(tabloT, 1) 'pour chacune de ces lignes, on passe toutes les lignes de la variable tabloT If UCase(tabloT(it, 1)) = UCase(tabloI(ii, 1)) Then 'On recherche les lignes qui ont le même nom en colonne A 'sur les 2 tableaux flag = 1 'on indique qu'on en a trouvé une et 'on recopie à la même ligne les données de la feuille Import 'au cas ou une données ait changé sur les colonne B,C, ou D tabloT(it, 2) = tabloI(ii, 2) tabloT(it, 4) = Year(tabloI(ii, 3)) tabloT(it, 6) = Month(tabloI(ii, 3)) tabloT(it, 8) = tabloI(ii, 4) End If Next it If flag = 0 Then 'si flag = 0, aucune valeur en colonne A de tabloI ne corresopond 'à une valeur de la colonne A de TabloT. C'est donc qu'il faut 'ajouter la ligne du tabloI au tabloRon reporte dans tabloR les 'nouvelles données de tabloI tabloR(k + 1, 1) = tabloI(ii, 1) tabloR(k + 1, 2) = tabloI(ii, 2) tabloR(k + 1, 4) = Year(tabloI(ii, 3)) tabloR(k + 1, 6) = Month(tabloI(ii, 3)) tabloR(k + 1, 8) = tabloI(ii, 4) k = k + 1 End If Next ii 'on reécrit le tabloT au bas du tableau de la feuille Tableau qui a pris en compte les lignes modifiées Range("A14").Resize(UBound(tabloT, 1), UBound(tabloT, 2)) = tabloT 'on ajoute le tabloR (nouvelles lignes) au bas du tableau de la feuille Tableau Range("A" & UBound(tabloT, 1) + 14).Resize(UBound(tabloI, 1) - 1, UBound(tabloT, 2)) = tabloR 'on classe les données du tableau de la feuille Tableau dercol = Cells(14, Columns.Count).End(xlToLeft).Column 'dernière colonne de la ligne 14 derln = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A tabloT = Range(Cells(14, 1), Cells(derln, dercol)) 'With Range("A14").CurrentRegion With Range(Cells(14, 1), Cells(derln, dercol)) .Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes 'et on y met le quadrillage 'For i = 7 To 12 '.Resize(Range("A14").CurrentRegion.Rows.Count, UBound(tabloR, 2)).Borders(i).LineStyle = xlContinuous 'Next i End With If Af = True Then Call ReAppliqueFiltres End Sub Sub MemoriseFiltres() Dim F As Integer Application.ScreenUpdating = False Set fT = ActiveSheet With fT.AutoFilter currentFiltRange = .Range.Address With .Filters ReDim filterArray(1 To .Count, 1 To 3) For F = 1 To .Count With .Item(F) If .On Then AfActif = True filterArray(F, 1) = .Criteria1 If .Operator Then filterArray(F, 2) = .Operator filterArray(F, 3) = .Criteria2 End If End If End With Next End With End With fT.AutoFilterMode = False 'suppression du filtre End Sub Sub ReAppliqueFiltres() Dim Col As Integer Application.ScreenUpdating = False fT.AutoFilterMode = False If AfActif = True Then For Col = 1 To UBound(filterArray(), 1) If Not IsEmpty(filterArray(Col, 1)) Then If filterArray(Col, 2) Then fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1), _ Operator:=filterArray(Col, 2), Criteria2:=filterArray(Col, 3) Else fT.Range(currentFiltRange).AutoFilter field:=Col, Criteria1:=filterArray(Col, 1) End If End If Next Col End If If Af = False And AfActif = False Then With fT.AutoFilter On Error Resume Next fT.Range("A14:" & dercol & "14").Select Selection.AutoFilter = True On Error GoTo 0 End With End If End Sub
ric
Bonjour,
Désolé pour les coquilles ...
Mieux testé ...
Ça semble bien fonctionner ...
J'ai corrigé le code de mon post précédent ...
https://forum.excel-pratique.com/viewtopic.php?p=872956#p872956
ric
Bonjour Ric,
J'ai copié ton code corrigé (en PJ) mais les flèches grises du filtre auto disparaissent toujours.
Losand
Bonjour,
Désolé pour les coquilles ...
Mieux testé ...
Ça semble bien fonctionner ...
J'ai corrigé le code de mon post précédent ...
https://forum.excel-pratique.com/viewtopic.php?p=872956#p872956
ric
Bonjour,
Je constate que ... si j'enlève le filtre et que je le remets ... le premier coup ça fonctionne, mais plus par la suite ...
Désolé ...
Je vais tenter de trouver un solution ...
ric
Bonjour,
Enfin ... une solution qui semble durable ...
J'ai constaté que si la cellule active de la feuille "Tableau" est dans la plage de tes données filtrées (une cellule non vide), le filtre revient actif.
Si la cellule active est en dehors de la plage des données filtrées, le filtre ne se réapplique pas.
L'explication est simple ... en VBA, l'on ne peut pas activer un filtre si la cellule active n'est pas dans la plage à filtrer. Je propose de ne sélectionner qu'une seule cellule et idéalement dans l'en-tête.
Je suggère donc ....
Sub ReAppliqueFiltres()
Dim Col As Integer
Application.ScreenUpdating = False
Cells(14, "A").Select ' << une cellule quelconque dans la plage des données filtrées
fT.AutoFilterMode = False
...
...
...
ric
Bonsoir Ric,
Merci beaucoup, la solution ne me convient pas mais la précision de tes explications m'à permis de contourner le problème.
En effet, dans mon fichier final, le code sera actif lors de la sélection d'une cellule afin d’être dynamique (et pas en sélectionnant la feuille)
Je te remercie pour ton aide précieuse
Résolu
Losand
Bonjour,
Enfin ... une solution qui semble durable ...
J'ai constaté que si la cellule active de la feuille "Tableau" est dans la plage de tes données filtrées (une cellule non vide), le filtre revient actif.
Si la cellule active est en dehors de la plage des données filtrées, le filtre ne se réapplique pas.
L'explication est simple ... en VBA, l'on ne peut pas activer un filtre si la cellule active n'est pas dans la plage à filtrer. Je propose de ne sélectionner qu'une seule cellule et idéalement dans l'en-tête.
Je suggère donc ....
Sub ReAppliqueFiltres() Dim Col As Integer Application.ScreenUpdating = False Cells(14, "A").Select ' << une cellule quelconque dans la plage des données filtrées fT.AutoFilterMode = False ... ... ...
ric