So, OK! Na, dann wollnwamaa,...
08.12.2010 21:12:19
Luc:-?
…Amina,
also der Reihe nach…
1. Zuerst richtest du den Legendenbereich ein, wo auch immer ist egal, wenn du einen Namen, zumindest für die Farbzellen mit den Buchstaben, vergibst. Auf jeden Fall sollte die Legende mit diesen beginnen, sonst muss der unten folgende PgmCode angepasst wdn (LIdx entsprechend erhöhen!). Der LegBereich darf auch versteckt wdn, denn er muss ja nur (vom Pgm) gelesen wdn, sollte sich aber auf dem selben Blatt befinden, sonst muss im PgmCode LBer entsprechend angepasst wdn — Me ginge dann nicht, sondern müsste durch Sheets(name) ersetzt wdn.
2. Dann formatierst du den infrage kommenden Bereich bedingt mit den Fmln der beiden HptBedingg (wie man sieht bleibt sogar noch 1 Bedingung frei, wofür auch immer → könntest damit bspw noch Leerzellen grau füllen → dann aber logische Reihenfolge der Bedingg beachten!). Dabei stellst du für Bedingung 2 die Musterfarbe auf deine Grundfarbe ein, bspw automatisch bzw keine — irgendwas sollte angegeben wdn, damit die Bedingung akzeptiert wird. Kann auch die Textfarbe sein — eines von beiden reicht. Wenn Kleinbuchstaben (KB) die selbe Wirkung wie GB haben sollen, SUCHEN verwenden, sonst FINDEN. ISTZAHL davor nicht vergessen! Damit wäre für Zahlen der Fall schon erledigt. Bleiben die GB-Symbole…
3. Die Ereignisprozedur anlegen. Dazu im VBEditor auf das zutreffende TabBlatt _
doppelklicken, damit sich quasi seine „Rückseite“, nämlich das sog Dokument-Klassenmodul der Tabelle öffnet. Hast du zuvor in den VBE-Optionen Variablendeklaration erforderlich angehakt, steht jetzt schon etwas im Modul, nämlich Option Explicit. Das sorgt dafür, dass keine undeklarierten Variablen (mit Dim, Const usw) akzeptiert wdn. Jetzt öffnest du den linken Kopfreiter und wählst Worksheet aus. Prompt wird auf dem Blatt der Rahmen der Ereignisprozedur Worksheet_SelectionChange angelegt. Den könntest du, aber musst ihn nicht behalten. Lege zusätzlich oder an seiner Stelle (Löschen von Selection im Titel reicht, ist sonst dasselbe) Worksheet_Change an (rechten Kopreiter öffnen → auswählen!). Mit dieser Methode haben die Ereignisproz-Köpfe immer die für deine xlVersion richtige Form. Dann die Leerzeile zwischen Kopf und Fuß der Prozedur durch folgd Code ersetzen (einfach einkopieren!)…
Const LegSymb As String = "BFMP", LegAdr As String = "Legende", _
ZBerAdr = "D…:…"
Dim LIdx As Long, LBer As Range, ZBer As Range
On Error Resume Next
Set LBer = Me.Range(LegAdr): Set ZBer = Me.Range(ZBerAdr)
If Not Intersect(Target, ZBer) Is Nothing Then
With Target.FormatConditions
If Not IsError(Target) And Not IsNumeric(Target) And Len(Target) = 1 Then _
LIdx = Instr(LegSymb, UCase(Target))
If .Count > 1 And CBool(LIdx) Then
.Item(2).Interior.Color = LBer.Cells(LIdx).Interior.Color
.Item(2).Font.Color = LBer.Cells(LIdx).Font.Color
End If
End With
End If
Set LBer = Nothing: Set ZBer = Nothing
Natürlich musst du die 1.PgmZeile noch anpassen, aber auch nur diese, wenn du die Legende nicht sonstwo untergebracht hast. Das ist der Vorteil, wenn man mit Konstanten am PgmAnfang arbeitet → man muss bei Änderungen idR nicht das ganze Pgm durchsuchen! Also den Text von LegSymb so abfassen wie du ihn brauchst → Buchstaben in gleicher Reihenfolge wie in der Legende und natürlich auch die gleichen Buchstaben. Als LegAdr-Text den von dir für die Legende(nbuchstaben) vergebenen Namen eintragen und als ZBerAdr-Text natürl die Adresse des dynamisiert bedingt zu formatierenden Zielbereichs (ist mir momentan nicht gewärtig). Wenn du in der 2.HptBedingung FINDEN verwendet hast, weil KB nicht dieselbe Wirkung haben sollen wie GB, musst du außerdem noch bei der LIdx-Zuweisung UCase(Target) durch Target ersetzen. Das wär's dann schon…
Wenn du diese Fktionalität auch bei einfacher Zellauswahl haben willst, kannst du diesen Code auch zusätzl in den Rahmen der Ereignisprozedur Worksheet_SelectionChange stellen.
Resümee: Dein Bsp ist so herrlich einfach, dass man daran gut die Wirkungsweise der dynamisierten BedingtFormatierung erklären kann, so dass auch ein Nutzer mit etwas rudimentäreren VBA-Kenntnissen das verstehen kann. Auf jeden Fall ist das doch viel klarer als die langen Select Case-Konstruktionen, die man sonst so findet, zumal die sich ja stets darauf konzentrieren, die Zelle direkt zu färben, was hier nicht der Fall ist. Insofern ist das auch kein BedingtFormat-Ersatz, sondern eine echte Erweiterung des BedingtFormats mit VBA-Mitteln. Wenn man seine BedingtFormatierungswünsche in max 3 HptBedingungen zusammenfassen kann, kann man auch vor Xl12 so viele Unterbedingg anlegen wie man will. Meinethalben könntest du auch das ganze Alfabet nach diesem Schema durchgehen. Es ist alles erweiterungsfähig…!
Das Ganze ist eigentl so einfach, dass ich mich doch sehr wundern muss, dass ich das noch nicht längst irgendwo gelesen habe. Im Grunde genommen ist damit alles, was bspw auch auf Hajos Website steht, schon vor Xl12 überflüssig… ;-)
Viel Erfolg + Spaß beim Ausprobieren!
Gruß Luc :-?