Manchmal gibt es lange Tabellen oder auch Tabellen, die am Anfang Zellbereiche haben, die zusammengefasst über mehrere Zeilen gehen. Wenn das der Fall ist, ist es manchmal gar nicht so einfach zu erfassen, in welcher Zeile man eigentlich genau ist und ob man die richtige Zeile erwischt hat. Um hier etwas mehr Licht ins Dunkel zu bringen, habe ich mir ein kleines Makro programmiert, welches automatisch die Hintergrundfarbe ändert. Und wenn in eine andere Zeile geklickt wird, muss natürlich der Ursprungszustand wieder hergestellt werden. Ebenso muss dieses geschehen, wenn die Tabelle verlassen wird oder Excel geschlossen werden soll.
Dafür gibt es verschiedene Ereignisse in Excel, die all dieses ermöglichen. In diesem Tutorial zeige ich, welche Ereignisse dafür benötigt werden.
Für Nichtprogrammierer habe ich hier ein kleines Tutorial, wo man diesen Code hinkopieren oder programmieren muss:
https://www.time4joomla.de/ms-excel/314-fuer-nicht-programmierer-wie-und-wo-wird-vba-untergebracht.html
Der Code ist recht übersichtlich, muss aber an verschiedenen Orten eingegeben werden.
Excel selber bietet eine recht interessante und auch umfangreiche Ereignissteuerung. Damit kann ich bequem solcherlei umsetzen, da ich auf verschiedene Zustände reagieren kann.
In unserem Fall nutze ich das Ereignis "Neue Zelle selektioniert" (Worksheet_SelectionChange
), Tabellenwechsel (Worksheet_Deactivate
) und das Ereignis bevor Excel geschlossen wird (Workbook_BeforeClose
).
Noch eine Anmerkung: Wenn Sie einen Blattschutz aktiviert haben, dann wird dieser Code Fehlermeldungen ausgeben oder einfach nicht funktionieren. Das können Sie aber mit dieser Zeile umgehen:
Worksheets("Tabelle1").Protect Password:="...", UserInterfaceOnly:=True
Eintragen müssen Sie das in das Ereignis "Excel öffnen": Workbook_Open
Der Code sorgt dafür, dass der User nichts verändern darf - beispielsweise sind die Formatierungen im Startmenü ausgegraut, was durch den Blattschutz kommt - die Programmierung aber, der Makrocode darf das ändern!
Public AlteZeile As Long
Public AlteFarbe As Double
Als Erstes müssen zwei globale Public-Variablen definiert werden. Der Code dieser beiden Variablen gehört in den Kopf eines Moduls.
AlteZeile
merkt sich die Stelle, wo aktuell gerade das Highlighting stattfindet und kann nach einem Klick in eine neue Zeile damit den alten Zustand wiederherstellen. Was denn auch genau mit der AltenFarbe
geschieht, die zwischengespeichert werden muss, bevor der neue Hintergrund übertragen wird.
Damit funktioniert der Code im übrigen auch, wenn in der Tabelle unterschiedliche Hintergrundfarben benutzt werden
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Cells(ActiveCell.Row, 7).Value = "" And AlteFarbe = 0 Then Exit Sub
If AlteZeile <> 0 Then Cells(AlteZeile, 7).Interior.Color = AlteFarbe
AlteFarbe = Cells(ActiveCell.Row, 7).Interior.Color
Cells(ActiveCell.Row, 7).Interior.Color = 65535
AlteZeile = ActiveCell.Row
End Sub
Nun wechseln Sie bitte direkt in die Tabelle im VBA-Editor und geben dort diesen Code ein.
Sie können das Ereignis selber auch auswählen, wenn Sie oben links, wo "(Allgemein)" steht Worksheet auswählen und dann rechts daneben das Ereignis SelectionChange.
SelectionChange
wird immer automatisch von Excel aufgerufen, wenn Sie in eine Zelle klicken oder Sie eine Zelle mit Enter oder TAB verlassen. Also immer, wenn Sie eine neue Zelle aktivieren.
Bei mir wird das Zellen-Highlight in Spalte 7 durchgeführt, weshalb ich hier die Zelle per aktiver Zeile (ActvieCell.Row
) und Spalte 7 anspreche.
Zunächst prüfe ich ab, ob überhaupt etwas in der Zeile steht, da ich zwischendurch immer wieder leere Zeilen habe und so aber Klicks außerhalb meiner Tabelle ignorieren kann.
Wenn ich nicht beim Programmstart bin, dann stehen Werte in AlteZeile
und AlteFarbe
, andernfalls stehen hier Standardmäßig die Werte 0. Und wenn das nicht der Fall ist, wird die alte Farbe an der vorherigen Zelle zurückgeschrieben. Zur Erinnerung: Dieses Ereignis wird nur aufgerufen, wenn Sie in eine neue Zelle geklickt haben. Ergo muss es davor eine Zeile gegeben haben, die nun das Highlighting verlieren muss, in dem der Urzustand wieder hergestellt wird. Genau das geschieht in dieser Code-Zeile:
If AlteZeile <> 0 Then Cells(AlteZeile, 7).Interior.Color = AlteFarbe
Danach wird in die Variable AlteFarbe der Wert der Hintergrundfarbe dieser Zelle geschrieben und somit zwischengespeichert und die Zeile nun mit einer gelben Hintergrundfarbe versehen. .Interior.Color
ist für die Hintergrundfarbe zuständig und 65535
ist die gelbe Farbe. Alternativ geht auch: ... .Interior.ColorIndex = vbYellow
Zu guter Letzt muss noch die aktuelle Zeile in die Variable AlteZeile
zwischengespeichert werden.
Private Sub Worksheet_Deactivate()
If AlteZeile <> 0 And AlteFarbe <> 0 Then Cells(AlteZeile, 7).Interior.Color = AlteFarbe
AlteFarbe = 0
AlteZeile = 0
End Sub
Wenn mehrere Tabellen vorhanden sind, dann muss Excel bei Tabellenwechsel mitgeteilt werden, dass der Ursprung wieder hergestellt werden muss. Dazu kann das Ereignis Worksheet_Deactivate
benutzt werden. Immer wenn die Tabelle gewechselt wird, wird die jeweils aktuelle deaktiviert. Und somit können wir einfach die alte Hintergrundfarbe zurückschreiben.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If AlteZeile <> 0 Then Cells(AlteZeile, 7).Interior.Color = AlteFarbe
AlteZeile = 0
AlteFarbe = 0
End Sub
Damit die Ursprungsfarbe wieder hergestellt wird, wenn Excel beendet wird, können wir dafür das Ereignis Workbook_BeforeClose
benutzen. Dazu ist es aber erforderlich, dass Sie zunächst im Projekt-Editor "DieseArbeitsmappe" auswählen. Dort können Sie oben auch wieder in "(Allgemein)" das "Workbook
" auswählen und rechts daneben das Ereignis aufrufen.
Der Code selber ist identisch mit dem Tabellenwechsel.