Donc, dans ce cas, deux solutions, soit sur la procédure événementielle "SelectionChange()" et tu appelles ma procédure de cette façon :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Test
End Sub
Quelle que soit la cellule sélectionnée la procédure sera exécutée.
Si tu veux que ça ne soit exécuté que quand tu sélectionnes une cellule de la plage, tu peux la définir avec cette petite fonction que je me suis créée pour définir une plage quand elle se trouve en milieu de feuille (attention, ça prend la cellule la plus en haut à gauche et la cellule la plus en bas à droite) :
Function DefPlageMilieuFeuille(Fe As Worksheet) As Range
On Error GoTo Fin
With Fe
Set DefPlage = .Range(.Cells(.Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 2, 2).Row, _
.Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 2, 1).Column), _
.Cells(.Cells.Find("*", .Cells(1, 1), -4123, , _
1, 2).Row, .Cells.Find("*", .Cells(1, 1), -4123, , _
2, 2).Column))
End With
Exit Function
Fin:
Set DefPlage = Nothing
End Function
Donc, voici le code complet à mettre dans le module de la feuille :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Plage As Range
Set Plage = DefPlageMilieuFeuille(ActiveSheet)
If Not Intersect(Target, Plage) Is Nothing Then Test
End Sub
Sub Test()
Dim PlgEntete As Range
Dim PlgVal As Range
Dim Cel As Range
Dim CelDeb As Range
Dim CelFin As Range
With ActiveSheet: Set PlgEntete = .Range(.Cells(3, 1).End(xlToRight), .Cells(3, .Columns.Count).End(xlToLeft)): End With
With ActiveSheet: Set PlgVal = .Range(.Cells(1, 6).End(xlDown), .Cells(.Rows.Count, 6).End(xlUp)): End With
PlgEntete.Resize(PlgVal.Rows.Count + 1, PlgEntete.Columns.Count).Interior.ColorIndex = 0
For Each Cel In PlgVal
Set CelDeb = PlgEntete.Find(Cel.Value, , xlValues, xlWhole)
If Not CelDeb Is Nothing Then
Set CelFin = PlgEntete.Find(Cel.Offset(, 1).Value, , xlValues, xlWhole)
If Not CelFin Is Nothing Then: Range(Cells(Cel.Row, CelDeb.Column), Cells(Cel.Row, CelFin.Column)).Interior.ColorIndex = 33
End If
Next Cel
End Sub
Function DefPlageMilieuFeuille(Fe As Worksheet) As Range
On Error GoTo Fin
With Fe
Set DefPlage = .Range(.Cells(.Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 2, 2).Row, _
.Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 2, 1).Column), _
.Cells(.Cells.Find("*", .Cells(1, 1), -4123, , _
1, 2).Row, .Cells.Find("*", .Cells(1, 1), -4123, , _
2, 2).Column))
End With
Exit Function
Fin:
Set DefPlage = Nothing
End Function
Soit sur la procédure événementielle "Change()" et dans ce cas, il faudrait savoir quelles sont les valeurs modifiées ?
Petite correction dans ma fonction, supprimer et remplacer par :
Function DefPlageMilieuFeuille(Fe As Worksheet) As Range
On Error GoTo Fin
With Fe
Set DefPlageMilieuFeuille = .Range(.Cells(.Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 2, 2).Row, _
.Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 2, 1).Column), _
.Cells(.Cells.Find("*", .Cells(1, 1), -4123, , _
1, 2).Row, .Cells.Find("*", .Cells(1, 1), -4123, , _
2, 2).Column))
End With
Exit Function
Fin:
Set DefPlageMilieuFeuille = Nothing
End Function