Bonjour,
Citation Envoyé par Philippe Tulliez Voir le message
et aussi en faisant référence à une cellule externe mais je n'avais pas le temps hier d'apporter une réponse et la tester.
Pourriez-vous m'en dire plus ?
Semaine chargée, voici l'explication par rapport à ma réponse de jeudi
J'ai tendance à toujours privilégier ce qui est natif dans Excel et utiliser les cellules de celui-ci comme paramètres et n'utiliser le VBA que pour la partie à automatiser ce qui a pour avantage de faciliter la maintenance et de ne plus toucher aux procédures
Ainsi la date à filtrer dans cet exemple se trouve dans une cellule nommée pCriteria et la cellule contenant la valeur permettant de calculer la date à filtrer (soit -1 pour hier, 0 pour aujourd'hui et 1 pour demain) se nomme pDateGap
La cellule pCriteria contient la formule permettant ainsi de calculer les dates sans les week-end (on pourrait bien entendu ajouter les jours fériés)
La cellule nommée pDateGap est modifiée par les boutons
Pour la démonstration, J'ai figé la date du jour dans une formule nommée CurrentDate
Code de la procédure qui filtre la table
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Function FilterByDate(TableName As String, FieldName As String, SerialDate As Long)
' Autofiltre d'une date
' Arguments
' TableName Nom de la table à filter
' FieldName Nom de l'étiquette de colonne
' SerialDate N° de série de la date
Dim l As ListObject
Dim f As Integer
Set l = Range(TableName).ListObject
f = l.ListColumns(FieldName).Index
l.Range.AutoFilter Field:=f, _
Criteria1:=">=" & SerialDate, _
Operator:=xlAnd, _
Criteria2:="<=" & SerialDate
Set l = Nothing
End Function |
Code de la procédure qui l'invoque et modifie la cellule pDateGap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Sub OnAction()
Const t As String = "t_Data" ' Nom de la table
Const l As String = "Date" ' Colonne à filtrer
Const c As String = "pCriteria" ' Cellule contenant la date à filtrer
Const g As String = "pDateGap" ' Cellule contenant l'écart
Dim b As String
Dim e As Integer
Dim f As Boolean
b = Application.Caller
Select Case b
Case "btnYesterday": e = -1
Case "btnToday": e = 0
Case "btnTomorrow": e = 1
Case "btnClearFilter": f = True
Case Else
MsgBox "Le bouton [" & b & "] n'est associé à aucune procédure"
End Select
If f Then
Range(t).ListObject.AutoFilter.ShowAllData
Else
Range(g).Value = e
FilterByDate t, l, Range(c).Value
End If
End Sub |
Amélioration
On pourrait réduire cette procédure et augmenter les possibilités de filtrage avec les jours, semaines et mois, etc. en créant une table à deux colonnes (Texte + Ecart) en sélectionnant la date à filtrer par une liste déroulante dont la source serait cette table.
L'appel à la procédure FilterByDate serait faite alors par la procédure événementielle Worksheet_SelectionChange
Illustration
Partager