Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1188to1192
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

viele bedingte Formatierungen per VBA

viele bedingte Formatierungen per VBA
amintire
Hallo alle zusammen,
habe eine Tabelle die ca. 10 bedingte Formatierungen haben soll,
nun weiß ich nicht wie ich die Formeln die in bedingte Formatierungen enthalten sind in VBA Code umwandel.
Bei Excel funktionieren leider nur drei bedingte Formatierungen.
Bis jetzt hatte ich jeweils drei in einer Zeile, möchte aber per VBA die Formatierung festlegen, sodass ich die Zeilen nicht immer ändern und anpassen müsste.
Wenn es hilft kann ich ja die bedingten Formatierungen mal aufschreiben.
Bin dankbar für jede Hilfe und Lösung.
Gruß Amina
AW: viele bedingte Formatierungen per VBA
05.12.2010 10:28:02
amintire
Hallo Hajo,
vielen Dank für das Beispiel, ich würde so etwas wie in Tabelle1 benötigen oder ähnlich, aber mit meinen Null Erfahrungen was VBA betrifft weiß ich nicht wie ich Formeln in Code umwandel.
Gruß Amina
AW: viele bedingte Formatierungen per VBA
05.12.2010 10:44:13
Hajo_Zi
Hallo Ammina,
und ich mit den Null Informationen, kann Dir Leider nicht helfen.
Es wäre auch Intressant welche Datei?
Gruß Hajo
Anzeige
Tja, Amina, dann dürfte dir auch die...
06.12.2010 01:42:40
Luc:-?
…Herber-Archiv-Recherche nach dynamisiertes BedingtFormat nicht allzuviel bringen. Dieser Satz enthält ungefähr die gleiche Info-Menge wie deine Angaben… ;->
Gruß Luc :-?
AW: Beispielmappe
07.12.2010 13:38:47
amintire
Hallo Luc,
hallo Hajo,
hier z.B. hätte ich eine Beispielmappe
https://www.herber.de/bbs/user/72629.xls
Die Farben wie in der Tabelle gezeigt würde ich als VBA Code ab Zelle G6 - DD200 benötigen.
Ich denke aber dass das Hauptproblem da liegen wird, in den Zellen G6 - DD200 sind Formeln drinnen (in der Beispielmappe noch nicht). Durch das Ergebnis der Formeln entstehen die Einträge.
Evtl. hättet ihr Vorschläge wie ich die Zellen dann einfärben lassen kann. Mit bedingter Formatierung hätte es funktioniert aber habe fünf verschiedene Farben bei entsprechenden Ergebnissen.
Bin für jede Hilfe und Vorschläge dankbar.
Lieben Gruß Amina
Anzeige
Bedeutet dein Bsp, dass nur Zahlen auch...
07.12.2010 21:57:41
Luc:-?
…als solche angezeigt wdn sollen, Amina,
die gen. Buchstaben aber nur als Zellfarbe? Gibt's noch 'ne Farbe, bspw für Fehlerwerte oder sonstige Texte, die die Zellen normalerweise haben (z.B. automatisch farblos/weiß)?
Sei es wie es sei, für dynamisiertes Bedingt­Format (nur unter VBA) ist das ein Klacks! Dabei muss man im Ggsatz zu den sonst angebotenen Lösungen nicht wissen, welche Farbe die Zellen haben sollen, wenn keine der Farbänderungs­bedingungen erfüllt ist, weil die Farbe des Bedingt­Formats, nicht der Zelle, geändert (dynamisiert) wird. Hier hast du im Prinzip 2 Bedingungsfmltypen…
1. Ist Formel: =ISTZAHL(G6)
2. Ist Formel: =FINDEN(G6;"PFBM") bzw =SUCHEN(G6;"pfbm"), wenn GB/KB-Unterschied irrelevant ist
Mit den 2 Bedingungsfmln kommst du bei der Dynamisierung des BedingtFormats aus. Allerdings benötigst du noch Unter­bedingungen für die 2.Hpt­Bedingung, um per VBA die Bedingungsfarbe derselben in Abhän­gigkeit vom enthaltenen Buch­staben zu ändern. Dazu (aber nicht nur deshalb!) ist es zweck­mäßig, auf jedem betroffenen Blatt eine kleine Legende anzulegen, so wie es ja auch dein Bsp zeigt (die Leer­zeilen würde ich aber weglassen), die quasi diese Unter­bedingungen und die Farben enthält. All das zeigt dein Bsp ja schon. Selbst die Buch­staben stehen schon in den Farbzellen und sind gleichfarbig, womit sich wohl schon meine 1.Frage erledigt hat… ;-)
Mit einer Ereignis­prozedur greifst du nun auf die Legenden­zellen zu, wenn sich irgendwas am Blatt verändert, d.h., du müsstest beim 1.Mal (Initiierung) alle betroffenen Zellen anklicken bzw alle auswählen und irgendwas durch sich selbst ersetzen, wenn das nicht ohnehin für Handeingabe gedacht sein sollte. Bei Fmln ist das einfach, da nimmt man dafür am besten das Gleich­heits­zeichen, sonst hier eben erst alle P, dann F usw…
Dabei ist es prinzipiell egal, ob die 1.Bedingung bereits erfüllt ist (kannst du ja abfragen, wenn du willst), da ja stets die Farbe der 2.Bedingung in Abhängigkeit vom Zellinhalt von G6:DD200 und den ihm zugeordneten Farben der Legende geändert wird. Damit muss das entsprechend bereichs­eingeschränkte Target von Worksheet_Change also vgl wdn! Stimmt dessen Inhalt mit einer der Legenden­zellen überein, wdn sowohl Zell- (.Interior.Color) als auch Textfarbe (.Font.Color) der zutreffenden Legenden­zelle direkt in die gleich­lautenden Target.FormatConditions(2)-Eigen­schaften übernommen.
Falls der Inhalt einer so gefärbten Zelle mal irgendwann geändert wird, ändert sich auch die Farbe. Treffen beide HptBedingungen nicht mehr zu, ist automatisch die ursprüngl Zellfarbe wieder zu sehen ohne, dass rückgefärbt wdn muss wie bei den üblichen Ersatzlösungen, wie du sie auch auf Hajos WebSite findest. Ein ggf kleiner Nachteil — das Bedingt­Format kann nach Wirksamwdn nicht mehr für den ganzen, ursprüngl formatierten Bereich angezeigt wdn, weil das ja nun nicht mehr die gleichen Bedingungen sind (andere Farbwerte!). Aber, man erkennt, dass welche vorhanden sind.
Wenn du das alles soweit einigermaßen verstanden hast, Amina, und nur mit dem VBA-Code nicht zurechtkommst, melde dich noch mal und teile dann auch mit, wo die bewusste Legende endgültig stehen soll.
Gruß Luc :-?
Anzeige
Noch was vergessen! Die 2.Bedingung...
07.12.2010 22:03:47
Luc:-?
…muss =ISTZAHL(FINDEN(G6;"PFBM")) lauten bzw analog mit SUCHEN.
Luc :-?
AW: Noch was vergessen! Die 2.Bedingung...
08.12.2010 12:04:57
amintire
Hallo Luc,
Deine Nachricht muss ich schon einige Male durchlesen um zu verstehen, viele Infos aufeinmal ;))
Kann die Legende für den Code in der Tabelle auch ausgeblendet werden? Weil dann wäre es eigentlich egal wo die Legende in der Tabelle stehen soll, ansonsten würde ich ab Zelle G1 die Legende schreiben (Zeile1)
Ab Zelle G7 - DD200 sollen dann die Zellen je nach Ergebnis eingefärbt werden, aber die Ursprungsformatierung die über Zelle formatieren gemacht wurde soll bei keinem Ergebnis von der VBA Formatierung unberührt bleiben.
Uiii Du hast Recht, komme mit dem VBA Code nicht zurecht. Wenn du mir hierbei helfen kannst, bin ich dir wirklich dankbar.
Lieben Gruß
Amina
Anzeige
Verstehe diesen Teil-Satz nicht,...
08.12.2010 13:10:46
Luc:-?
…Amina,
…aber die Ursprungsformatierung, die über Zelle formatieren gemacht wurde, soll bei keinem Ergebnis von der VBA Formatierung unberührt bleiben.
Ergebnis noch was Anderes? Unberührt, also kein Eingriff in die Originalformatierung oder doch oder nur bedingt, bei keinem oder doch eher allen… Mir scheint, du hast hier 'ne doppelte Verneinung drin. Das irritiert!
Ansonsten sollte das auch mit 'ner verborgenen Legende gehen, allerdings ist der Sinn einer Legende ja gerade die Erklärung der Signierung, Farben oder was auch immer (wie beim Diagramm). Gehört in solchen Fällen eigentl zu einer guten Tabelle…
Durch die Dynamisierung wdn die ursprgl einheitl BedingtFormate von Excel nicht mehr als einheitl betrachtet, da die Farben wechseln. Das hatte ich bereits geschrieben. Aber die in der BedingtFormatierung eingestellten Fmln, also die HptBedingg, bleiben natürl gleich. Deshalb ist es ja auch erforderlich, eine gemeinsame HptBedingung für viele Unterbedingg zu finden. Das ist hier Bedingung2. Insofern ist dein Bsp eigentl sogar ein klassischer Anwendungsfall, weil das hier so einfach geht und deshalb dann auch recht anschaulich ist… ;-)
Code folgt demnächst; jetzt erst mal nur noch soviel: Es ist sicher günstig, für den relevanten Legendenbereich, also die Farbzellen mit Signierung, einen Namen zu vergeben, zB Legende. Dann ist der reale Standort letztlich schnurz. Deshalb werde ich mich dann auch darauf beziehen.
Gruß & bis später, Luc :-?
PS: Inzwischen kannst du ja mal im Archiv von diesem Jahr stöbern. Das muss mind 3 Threads mit 2 verschiedenen Bildern und 1er BspDatei zu diesem Thema enthalten… ;-)
Anzeige
AW: Verstehe diesen Teil-Satz nicht,...
08.12.2010 14:25:58
amintire
Hallo Luc,
Du hast Recht, also die Standartformatierung die über Formate gemacht worden ist, soll unberührt bleiben wenn die Zelle kein Ergebnis bringt. Also sprich die Zelle ist durch die Formel leer, enthält weder die Buchstaben noch eine Zahl, dann soll keine Formatierung durch VBA stattfinden. Ich hoffe jetzt war der Text richtig ;)
Das mit dem Namen Legende ist keine schlechte Idee. ;)
Gruß Amina
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 :-?
Anzeige
Eine Ergänzung habe ich doch noch,...
08.12.2010 22:46:35
Luc:-?
…Amina…
Wenn auch Buchstabenkombinationen vorkommen können, die zufällig so auch im Legendentext enthalten sind, wird das zwar im PgmCode abgefangen, nicht aber in der der 2.HptBedingung des BedingtFormats. Die sollte dann auch besser =UND(LÄNGE(G6)=1;ISTZAHL(FINDEN(G6;"BFMP"))) lauten. Die Reihenfolge der GB spielt hier allerdings keine Rolle.
Alternativ bestünde auch die Möglichkeit, das als sog Matrixkonstante zu formulieren und der ebenfalls einen Namen zu geben. Die könnte dann auch im Pgm ausgewertet und mit WorksheetFunction.Match vgl wdn. Die 2.HptBedingung könnte dann bspw =ISTZAHL(VERGLEICH(G6;LegSymbole;0)) lauten, wenn LegSymbole der Name der Konstanten ={"B"."F"."M"."P"} ist. Aber mit der o.g. Ergänzung geht's ja auch…
Gruß Luc :-?
Anzeige
AW: Eine Ergänzung habe ich doch noch,...
09.12.2010 19:53:09
amintire
Hallo Luc,
das sind wirklich viele Informationen aufeinmal. Habe es mal auf die schnelle versucht und bekomme es leider nicht hin. Werde es bei Gelegenheit mit mehr Zeit ausprobieren, verstehe nicht wirklich alles was du beschrieben hast aber ich hoffe das ich es hinbekommen werde.
Vielen Dank für deine Mühe und Hilfe.
Gruß Amina
Wenn du das so machst wie beschrieben,...
09.12.2010 21:47:56
Luc:-?
…Amina,
nämlich 1.⇒2.⇒3. wird's schon klappen… ;-)
Gruß, Luc :-?

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige