1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Dim iLastRow As Long
Dim rRange As Range
With ActiveSheet ' Comme on travaille sur clic dans la feuille, on peut travailler avec ActiveSheet
If Not Intersect(.Columns(1), Target) Is Nothing Then ' Si on a modifié une cellule de la colonne A
Set rRange = Range(.Cells(Target.Row, 3), .Cells(Target.Row, iLastCol)) ' On définit un range des cellules renseignées de la ligne modifiée
If Target.Value = vbNullString Then
' Si la cellule modifiée à été mise à "vide"
For Each c In rRange
' On montre toutes les colonnes
Columns(c.Column).Hidden = False
Next c
Else
' On a mis une valeur de filtrage dans une cellule
For Each c In rRange
' Pour chaque cellule (c) de la ligne concernée
If c.Value = Target.Value Then
' Si la valeur de la cellule modifiée (Target) = la valeur de la cellule c
' On montre la colonne
Columns(c.Column).Hidden = False
Else
' Si valeurs différentes, on cache la colonne
Columns(c.Column).Hidden = True
End If
Next c
End If
End If
' La suite sert à effacer toutes les cellules de la colonne A sauf celle qui vient d'être modifiée
iLastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
Set rRange = Range(.Cells(1, 1), .Cells(iLastRow, 1))
Application.EnableEvents = False ' Indispensable pour éviter de retomber dans l'Event Worksheet_Change
For Each c In rRange
If Not c.Row = Target.Row Then
c.Value = vbNullString
End If
Next c
Application.EnableEvents = True
End With
End Sub |
Partager