Mise en forme conditionnelle sournoise
Bonjour,
je souhaite faire une MFC sur un tableau qui s'affiche lorsqu'on réalise une recherche (feuille "ACCUEIL").
J'aimerai que toutes les lignes du tableau qui apparaît dont la valeur de la colonne L est "VRAI" soient écrites en rouge..
J'ai donc crée une règle de MFC. Pour être certain que mon tableau soit inclut dans cette règle, j'ai définit des plages larges "A1:L500".
Le problème est que des que je réalise une recherche, les valeurs de cette zone réglementée changent toutes seules, et définissent de nouvelles plages qui contournent parfaitement mon tableau !
Du coup pour éviter ce problème, je me suis dit que j'allais appliquer cette règle directement sur mon tableau source (feuille "SYNTHESE"). Le problème est que la règle n'est pas copiée avec les résultats de la recherche. Cette solution ne fonctionne pas.
Qu'en pensez-vous ?
Bonjour,
Il te suffit simplement d'appliquer ta MFC en fin de procédure. Ici, la condition porte sur la colonne L qui a la valeur "FAUX" :
Private Sub Textbox1_change()
Application.ScreenUpdating = False
Dim Plage As Range '<--- la plage est défini en fin de procédure à partir de B16
Dim cell As Range, cell1 As Range, résultat As Range
Dim i As Integer
If TextBox1 = Empty Then Exit Sub
'// Stockage des lignes sélectionnées
With Feuil2.ListObjects(1)
Set résultat = .HeaderRowRange 'entête sélection
Set cell = .Range.Find(TextBox1, LookIn:=xlValues, lookat:=xlPart)
If Not cell Is Nothing Then
Set cell1 = cell
Do
i = cell.Row - .HeaderRowRange.Row 'indice ligne données du tableau
Set résultat = Union(résultat, .DataBodyRange.Rows(i))
Set cell = .Range.FindNext(cell)
Loop Until cell.Address = cell1.Address
End If
End With
'// Affichage et tri du résultat
Me.Range(adresse_début).CurrentRegion.Clear
résultat.Copy Me.Range(adresse_début)
Me.Range(adresse_début).CurrentRegion.Sort Key1:=Range("D16"), Order1:=xlAscending, Header:=xlYes
'// Réinitialisation de la recherche
TextBox1.Activate
'***********************************************************
Set Plage = DefPlage(Worksheets("ACCUEIL"), 16, 2) 'utilise une fonction qui cherche la valeur la plus basse et la plus à droite (pas forcément la même)
If Not Plage Is Nothing Then
Plage.FormatConditions.Add xlExpression, , "=$L14=FAUX"
Plage.FormatConditions(1).Interior.Color = 255
Plage.FormatConditions(1).StopIfTrue = False
End If
'***********************************************************
End Sub
Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range
On Error GoTo Fin
With Fe
Set DefPlage = .Range(.Cells(L, C), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column))
End With
Exit Function
Fin:
Set DefPlage = Nothing
End Function
Merci beaucoup Theze !!
Bonne journée !!