Wat ik bedoel is dat je misschien een andere oplossing kunt gebruiken .
Er is namelijk geen gebeurtenis in standaard Excel om kleurwijziging van een celaf te vangen. een worksheet_change event wordt niet getriggerd door het wijzigen van de kleur van een cel.
Bottomline: het kan niet automatisch
wat wel kan, is een variant met een change event, die de cel pas opkleurt als je nadat de cel is gekleurd de cel nog een keer selecteert.
namelijk deze manier:
Plaats deze code in de werkblad module van jouw keuze.
verander de waarde van constante MUTATIECEL naar de juiste kolom die je wilt wijzigen.
Code:
Option Explicit
Private Const MUTATIECEL As String = "X" 'pas aan naar behoefte
Private Const CHECK_RANGE As String = "A:A" 'kolom A ,pas aan naar behoefte
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo allesgeselecteerd:
'roept overflow error op als alle cellen worden geselecteerd.
' deze moet worden afgevangen
If Target.Cells.Columns > 1 Then
Exit Sub
End If
If Not Intersect(Target, CheckKolom) Is Nothing Then
'afvangen lege cellen (anders wordt alles wit)
ColorMutationCell Target
End If
On Error GoTo 0
allesgeselecteerd:
End Sub
Private Function CheckKolom() As Excel.Range
Set CheckKolom = ActiveSheet.Range(CHECK_RANGE)
End Function
Private Sub ColorMutationCell(ByVal Target As Range)
'Kleuren cel in rij "mutatierij" met kleur van doorgegeven cel
If Target.Interior.ColorIndex = xlNone Then
'deze check is nodig omdat anders cellen een witte achtergrond krijgen
ActiveSheet.Range(MUTATIECEL & Target.Row).Interior.ColorIndex = xlNone
Else
ActiveSheet.Range(MUTATIECEL & Target.Row).Interior.Color = Target.Interior.Color
End If
End Sub
deze methode is niet consistent en omslachtig, omdat je een cel nogmaals moet selecteren voordat een "selectionchange" event wordt getrigged, nadat de kleur is veranderd (een kleurverandering triggert geen "worksheet_change" event.)
Dan zou je de code kunnen uitbreiden door de volgende methode aan je macro toe te voegen, en deze toe te voegen aan de worksheet_Selectionchange:
Code:
Public Sub Color_all()
'roep deze functie aan om de
Dim cell as Excel.Range
For Each cell In Intersect(ActiveSheet.UsedRange, Range(CHECK_RANGE))
ColorMutationCell Cell
Next
End Sub
'voorbeeld:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
...
...
Color_all
End Sub
deze methode maakt gebruik van de methode ColorMutationCell uit het vorige codeblok. Nu worden alle cellen van de "mutatiekolom" gekleurd met de kleur van de cellen in kolom a die niet "leeg zijn". op deze manier worden de cellen wel gekleurd, maar worden ook alle cellen in kolom "A" van het gebruikte bereik van het werkblad doorlopen, om consistent te blijven(dat lijkt me wel het minste

)
Als echter alle cellen doorlopen worden met bovenstaande methode, rijst de vraag of de code in de gebeurtenismethode worksheet_change nog wel nodig is.
Ik denk van niet, maar dat zou inhouden dat je na elke verandering van een cel, alle cellen in kolom A zou kunnen laten opkleuren. Dat is niet leuk bij grotere werkbladen, want dat kan aanzienlijke vertraging van de bewerking als gevolg hebben.
Het kan, maar wil je het ook?
Wat ik wel aan kan raden is een knop die de methode "Color_all" aanroept. op die manier wordt het duidelijker wat er precies wanneer gebeurt, dat is ook altijd voor mij een heel fijn idee.
Dat zou dus resulteren met de volgende code in het werkblad:
Code:
Option Explicit
Private Const MUTATIECEL As String = "X" 'pas aan naar behoefte
Private Const CHECK_RANGE As String = "A:A" 'kolom A ,pas aan naar behoefte
Public Sub Color_all()
'roep deze functie aan om de
Dim cell As Range
For Each cell In Intersect(ActiveSheet.UsedRange, Range(CHECK_RANGE))
ColorMutationCell Cell
Next
End Sub
Private Sub ColorMutationCell(ByVal Target As Range)
'Kleuren cel in rij "mutatierij" met kleur van doorgegeven cel
If Target.Interior.ColorIndex = xlNone Then
'deze check is nodig omdat anders cellen een witte achtergrond krijgen
ActiveSheet.Range(MUTATIECEL & Target.Row).Interior.ColorIndex = xlNone
Else
ActiveSheet.Range(MUTATIECEL & Target.Row).Interior.Color = Target.Interior.Color
End If
End Sub
Rest er nog een knop kunnen toevoegen om de "Color_all" methode aan te roepen, en dan gebeurt het niet elke keer als je een celkleur wijzigt, maar wel als je op de knop drukt, wat opzich toch ook bevredigend moet kunnen zijn.
Groeten,
Mark