Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

VBA-Code für bedingte Formatierung funzt nur bedingt





Frage

Vorab: Ich kenne mich gut in Excel aus, allerdings 0 mit VBA etc. Ich benutze folgenden Code von excelbeispiele.de für eine bedingte Formatierung in Excel: ________________________________________________ Private Sub Worksheet_Change(ByVal Target As Excel.Range) ´Wenn mehr als eine Zelle markiert wurde dann Makro beenden If Target.Cells.Count > 1 Then Exit Sub Select Case Target.Value ´bei Buchstabe "A" keine Hintergrundfarbe Case "A" Target.Interior.ColorIndex = xlNone ´bei Buchstabe "K" Hintergrundfarbe rot Case "K" Target.Interior.ColorIndex = 3 ´bei Buchstabe "U" Hintergrundfarbe grün Case "U" Target.Interior.ColorIndex = 4 ´bei Buchstabe "G" Hintergrundfarbe blau Case "G" Target.Interior.ColorIndex = 37 ´bei Buchstabe "UN" Hintergrundfarbe grau Case "UN" Target.Interior.ColorIndex = 15 ´bei Buchstabe "R" Hintergrundfarbe gelb Case "R" Target.Interior.ColorIndex = 19 ´bei Buchstabe "UF" Hintergrundfarbe rosa Case "UF" Target.Interior.ColorIndex = 38 ´bei Buchstabe "BF" Hintergrundfarbe gelb Case "BF" Target.Interior.ColorIndex = 27 ´bei Buchstabe "!" Hintergrundfarbe lila Case "!" Target.Interior.ColorIndex = 39 End Select End Sub ________________________________________________ funktioniert wunderbar solange ich ihn für jedes einzelne Tabellenblatt reinkopiere. Kopiere ich ihn einmal in "DieseArbeitsmappe" und lösche ihn in den Blättern, dann funkt er nicht mehr. Wäre dankbar wenn mir jemand erklären könnte was ich tun muss damit ich den Code nicht für jedes Arbeitsblatt einzeln reinfriemeln muss.

Antwort 1 von CaroS

Hallo Scudo,

bisher hast Du alles richtig gemacht, wenn Du den Code in jedes einzelne Tabellen-blatt reinkopiert hast. Nur so kann es funktionieren! Und das liegt daran, dass die Abarbeitung dieses Codes überhaupt nur durch eine Änderung in der einer Tabelle ausgelöst wird: Sub Worksheet_Change(ByVal Target As Excel.Range)

(1) Wenn Du auf diesen Automatismus verzichten kannst und stattdessen lieber auf eine Schaltfläche klicken willst, um ein entsprechendes Makro zu starten, dann kannst Du auch alles so ändern, wie Du Dir das vorgestellt hast. (Den VBA-Code etwas ändern und zentral speichern, in jeder Tabelle eine Schaltfläche anlegen und mit dem Code verknüpfen.)

(2) Eine kleinere Änderungsmöglichkeit gibt es auch innerhalb der jetzigen Funktionsweise, die würde allerdings kaum zu einer Vereinfachung führen, denn Du müsstest trotzdem noch einen bestimmten Code in den VBA-Bereich jeder Tabelle kopieren. Vereinfacht könnte das so aussehen: Innerhalb von

Sub Worksheet_Change(ByVal Target As Excel.Range) ... Call Makro_2 End Sub

wird erst der von der Änderung betroffene Bereich ermittelt und dann beim Aufruf eines zweiten Makros (Call Makro_2) als Parameter an dieses übergeben. Das zweite Makro braucht dann nur einmal im VBA-Bereich der Arbeitsmappe stehen. Es enthält zu 95% den oben angegebenen Code und tut - wie bisher - den wesentlichen Teil der Arbeit. (Kopierarbeit wird aber erst ab dem Moment gespart, wenn das Makro_2 nachträglich geändert werden muss.)

Bei der von Dir gewünschten Änderung (1) wird es auf jeden Fall komplizierter, den Bereich (die Bereiche) zu identifizieren, in dem gerade die Änderung(en) stattgefunden hat (haben). Man würde wohl "die gesamte Gegend großflächig absuchen" müssen. Bei der "kleinen" Änderung (2) fällt die Übergabe des Bereichs zusätzlich an.

Überleg Dir mal genau, ob (und warum) diese Varianten für Dich interessant sind. Und wenn ja welche, dann sehen wir weiter.

Gruß,
CaroS

Antwort 2 von Primut

Hi Scudo,

daß dieser Code nur in den Tabellenblättern funzt, liegt daran, daß er nur für die Tabellenblätter geschrieben ist!

Du kannst ihn gerne in "Diese Arbeitsmappe" hineinkopieren,

mußt dann aber die Zeile

Private Sub Worksheet_Change(ByVal Target As Excel.Range)


durch

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

ersetzen.
Dann läuft es für alle Blätter gleichzeitig.

Gruß Primut

Antwort 3 von Scudo

Super, klappt

Danke Primut!