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
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
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
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!
Danke Primut!

