Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bedingte Formatierung auslesen

Bedingte Formatierung auslesen
Markus
Hallo liebes Forum,
ich stehe gerade auf dem Schlauch... :-)
Ich habe eine Tabelle mit bedingten Formatierungen in jeder Zelle (als Formelabfrage).
Ich möchte in der aktiven Zeile i im Bereich "A(i):AV(i)" die in den einzelnen Zellen hinterlegten Formeln der bedingten Formatierung per VBA auslesen und in einer Variablen zwischenspeichern und anschließend diese dann übergangsweise löschen.
Später möchte ich die Zeile dann wieder mit den zwischengespeicherten Bedingten Formatierungen befüllen.
Ich habe es mit folgendem Code versucht, der Compiler meckert dabei aber...
Dim strBedingteFormatierung(1 To 256) As String
Set ranAltBereich = _
Range("A" & Target.Row & ":IV" & Target.Row)
x = 0
For Each ranZelle In ranAltBereich
x = x + 1
strBedingteFormatierung(x) = ranZelle.FormatConditions(1).Formula1
Next

Hier im Forum habe ich leider nichts gefunden, das dazu passen würde.
Kann mir hier vielleicht jemand von Euch weiterhelfen?
Vielen Dank vorab!
Grüße aus der grauen Kölner Bucht :-)
Markus
Anzeige
AW: Bedingte Formatierung auslesen
10.12.2010 11:57:02
Rudi
Hallo,
der Compiler meckert dabei aber...

Was meckert er an? Fehlermeldung!
Ist das in einer Ereignisprozedur? Wenn nicht, ist Target=Nothing.
Vllt. Target durch ActiveCell ersetzen.
Weiter solltest du prüfen, ob überhaupt bed.Formate definiert sind.
If ranZelle.FormatConditions.Count > 0 Then
strBedingteFormatierung(x) = ranZelle.FormatConditions(1).Formula1
End If

Gruß
Rudi
Anzeige
AW: Bedingte Formatierung auslesen
10.12.2010 12:51:26
Markus
Hallo Rudi,
erstmal vielen Dank für Deine Antwort! :-)
Ich hatte gehofft, ich muss nicht so weit ausholen, aber das Ganze ist wohl zu unverständlich ohne den Kontext.
Ich möchte eigentlich die Zeile, in der sich der Cursor aktuell befindet, markieren. Dazu habe ich auch etwas in den Foren gefunden und in meine Arbeitsmappe eingebaut:

Private Sub Workbook_SheetSelectionChange(ByVal sh _
As Object, ByVal Target1 As Excel.Range)
MarkierungEin Target1
End Sub

Dim ranAltBereich As Range
Dim lngColorIndex(1 To 256) As Long
Dim strBedingteFormatierung(1 To 256) As String
Dim bolDynMauszeiger As Boolean
Sub MarkierungEin(ByVal Target As Excel.Range)
Dim ranZelle As Range
Dim x As Integer
If bolDynMauszeiger = False Then Exit Sub
If Not ranAltBereich Is Nothing Then
x = 0
On Error Resume Next
For Each ranZelle In ranAltBereich
x = x + 1
ranZelle.Interior.ColorIndex = lngColorIndex(x)
Next
End If
Set ranAltBereich = _
Range("A" & ActiveCell.Row & ":IV" & ActiveCell.Row)
x = 0
For Each ranZelle In ranAltBereich
x = x + 1
lngColorIndex(x) = _
ranZelle.Interior.ColorIndex
strBedingteFormatierung(x) = ranZelle.FormatConditions(1).Formula1 Next
Target.EntireRow.Interior.Color = RGB(255, 204, 153)
ActiveCell.EntireRow.Formula1 = ""
End Sub Sub MarkierungAus()
Dim x As Integer
Dim ranZelle As Range
If Not ranAltBereich Is Nothing Then
x = 0
For Each ranZelle In ranAltBereich
x = x + 1
ranZelle.Interior.ColorIndex = lngColorIndex(x)
ranZelle.FormatConditions(1).Formula1 = strBedingteFormatierung(x) Next
End If
End Sub

Das Problem ist, dass ich die Tabelle bereits mit Bedingten Formatierungen befüllt habe, die offenbar vorrangig gegenüber der Workbook_SheetSelectionChange-Prozedur behandelt werden. Da meine Tabelle vollständig mit bedingten Formatierungen befüllt ist, funktioniert demnach das Markieren an der aktuellen Cursorposition nicht.
Aus diesem Grund möchte ich die bedingten Formatierungen der aktuellen Zeile zwischenspeichern und löschen, bis der Cursor in eine andere Zeile bewegt wird. Den fett markierten Code oben habe ich dazu eingebaut. Ohne diesen Code funktionert das Markieren problemlos, aber wie gesagt nur in Zeilen, die keine bedingten Formatierungen enthalten.
Eine Fehlermeldung gibt es an den von mir oben fett markierten Stellen, die Fehlermeldung lautet
Laufzeitfehler '1004' Anwendungs- oder objektdefinierter Fehler.
Vielleicht gibt es hierfür ja auch eine viel einfachere Lösung...?
Grüße aus der sich aufhellenden Kölner Bucht
Markus
Anzeige
einfachere Lösung
10.12.2010 13:35:50
Rudi
Hallo,
ich würde einfach die Formate der Zeile an eine andere, unbenutzte Stelle kopieren (Inhalte einfügen-Formate) und später wieder zurück.
Gruß
Rudi
So, wie es hier steht, liegt's an Next,...
10.12.2010 15:21:43
Luc:-?
…Markus;
das schließt den For Each-Block ab und benötigt deshalb eine eigene Zeile. Steht auch so in der VBE-Hilfe, in die du gelegentl mal reinschauen solltest… :->
Ansonsten schreibst du ja wohl, wenn ich das richtig verstehe, dass nicht alle Zellen bedingt formatiert sind. Dann musst du das auch prüfen! Ansonsten hat Rudi recht, geht auch einfacher!
BedingtFormate haben immer Vorrang vor Zellfarben, wenn ihre Bedingung erfüllt ist, sonst wäre das ja sinnlos! Außerdem kann man auch vor xl12 per VBA mehr als 3 BedingtFormate verwenden, wenn man das Format dynamisiert. Das setzt aber etwas (gedankliche) Vorarbeit voraus. Dann könntest du die Zellauswahl per _SelectionChange dazu nutzen, einfach nur die BedingtFormat-Farbe(n) der Zellen der ausgewählten Zeile zu ändern. Dann klappt das auch so wie gewollt und die Fmln können bleiben, wo sie sind. Natürlich musst du dir die alte Farbe jeweils merken und in das BedingtFormat der Zellen zurückschreiben, wenn du die nächste Zelle auswählst.
Gruß Luc :-?
PS: Was NoNet gebastelt hat, muss ich mir erst noch ansehen! Ein Bsp für dynamisiertes BedingtFormat findest du im aktuellen Thread von Amintire.
Anzeige
Formatierung kopieren....
10.12.2010 15:33:34
NoNet
Hey Rudi, hey Luc,
grundsätzlich würde ich auch Rudis Vorschlag (Kopieren der Formatierung in einen leeren Zellbereich) bevorzugen, doch dieser hat einen Nachteil : Es werden ALLE Formatierungen kopiert und nicht nur die der "Bedingten Formatierung" !
Daher auch mein VBA-Beispiel als Alternative.
@Luc :

Was NoNet gebastelt hat, muss ich mir erst noch ansehen!

Meinen Code musst Du Dir nicht unbedingt anschauen, oder zweifelst Du etwa daran, dass ich das per VBA lösen kann ;-) - oder fühlst Du Dich als "oberster VBA-Richter" hier im Forum dessen Wohlgefallen die geposteten Codes gewinnen müssen (klingt zumindest ein wenig danach ) ?
Salut / Gruß / Au revoir / Ciao / Bye, NoNet
Anzeige
So'n Quatsch! Das hieß nur, dass ich das noch...
10.12.2010 15:55:18
Luc:-?
…nicht gesehen hatte und deshalb nicht beurteilen konnte, ob dein Vorschlag der bessere und demzufolge die Bevorzugung von Rudis Vorschlag zu einseitig wäre…
Aber, mit ein wenig gu…, äh, bösem Willen, kann man alles und jeden falsch verstehen, nicht wahr, NoNet… ;->
Aber ich kann dich beruhigen, dein Vorschlag entspricht dem Üblichen, und außerdem hast du selbstverständlich in einem recht, mein Vorschlag ist der beste, denn darauf ist noch keiner von euch gekommen, jedenfalls nicht, dass ich wüsste… ;-)
Gruß + schöDrAdWE,
Luc :-?
PS: Hast du keine Advents- bzw Weihnachtssmilies…?
Anzeige
Formatierung kopieren....ist doch Wurscht
10.12.2010 19:55:52
Rudi
Hallo,
denke ich.
Es sei denn, die Änderungen am Bereich berühren auch statische Formate, die er dann beibehalten will.
Gruß
Rudi
@Rudi : KLARO will Markus das ;-)) _oT
11.12.2010 01:10:16
NoNet
_oT = "ohne Text"
Falls dich aber v.a. d.Formulierung "gebastelt"...
11.12.2010 19:41:41
Luc:-?
…gestört haben sollte, Thomas…
Fmln u.Pgmm schreibt man, postet sie und jeder kann sie gleich sehen. Fertigt man aber ein Bsp für eine fremde Aufgabenstellung an, kann das nur „gebastelt“ sein, denn man weiß ja nie, ob man das Richtige getroffen hat. Außerdem muss das auch erst runtergeladen wdn…
Also war das nur höflich gemeint. Und das hat man dann davon…
Nebenbei fällt mir da ein, dass ein gewisser „NoNet“ eine kleine ExcelBastelei im Netz betreiben soll… ;-))
Gruß Luc :-?
Anzeige
AW: So, wie es hier steht, liegt's an Next,...
10.12.2010 15:52:18
Markus
Hallo Luc,
vielen Dank für Deine Hilfe, ich werde das für heute erstmal ruhen lassen, ich mache im Moment nur noch Fehler... :-) Das "Next" habe ich beim Posten einfach nur vergessen. Das steht hier in meinem Code, wie gesagt funktioniert das Markieren mit diesem Makro ja auch problemlos. Nur meine dilettantischen Modifikationsversuche scheitern immer wieder kläglich. ;-)
Ich habe einfach im Moment nur noch 4-eckige Augen. ;-)
Melde mich spätestens Montag nochmal hier - hoffentlich mit einer Erfolgsmeldung.
Ein schönes WE Euch allen.
Grüße
Markus.
Anzeige
Scheint formal richtig zu sein,...
10.12.2010 12:08:44
Luc:-?
…Markus,
meckert wirklich der Compiler? Was sagt er denn? Syntax-Fehler oder was? Oder entsteht eher ein _ Laufzeitfehler? Das wäre mit Sicherheit hier der Fall, wenn eine Zelle nicht bedingt formatiert ist, denn das hast du nicht abgefangen!

With ranZelle.FormatConditions
If .Count > 0 Then
strBedingteFormatierung(x) = .Item(1).Formula1
…usw.
Außerdem kannst nur du wissen, ob das schon reicht — es gibt ja recht unterschiedl Typen des BedingtFormats. Auch scheinen dich nur die Fmln, nicht die Einstellungen zu interessieren — aber wie gesagt, das musst du wissen…
Gruß + schöDrAdWE,
Luc :-?
Anzeige
AW: Scheint formal richtig zu sein,...
10.12.2010 13:18:10
Markus
Hallo Luc,
meckert wirklich der Compiler? Was sagt er denn? Syntax-Fehler oder was? Oder entsteht eher ein _ Laufzeitfehler? Das wäre mit Sicherheit hier der Fall, wenn eine Zelle nicht bedingt formatiert ist, denn das hast du nicht abgefangen! 
Siehe hierzu bitte meine Antwort an Rudi.
Auch scheinen dich nur die Fmln, nicht die Einstellungen zu interessieren — aber wie gesagt, das musst du wissen…
Öhh, Du hast natürlich recht! Ich will selbstverständlich alle Einstellungen, die ich in der bedingten Formatierung vorgenommen habe, zwischenspeichern... Im Eifer des Gefechts habe ich wohl den Überblick verloren... ;-)
Was macht meine bedingte Formatierung - und das bereitet zur Abwechslung auch keine Probleme ;-) :
1. Die zu prüfende Bedingung lautet: =$H9"". Diese Bedingung steht in jeder Zelle der Tabelle, die mit Daten gefüllt ist (es sollen Zwischensummenzeilen markiert werden).
2. Setze oben und unten eine dünne Linie.
3. Setze "Hellgelb" als Hintergrundfarbe.
Es wäre sehr nett, wenn Ihr mir den Code hierzu ebenfalls nennen könntet. Krieg ich aber zur Not auch über den Makrorekorder heraus. ;-)
With ranZelle.FormatConditions
If .Count > 0 Then
strBedingteFormatierung(x) = .Item(1).Formula1
…usw.
Das habe ich ausprobiert, funkt aber leider trotzdem noch nicht.
Grüße
Markus.
Anzeige
Bedingte Formatierung auslesen und speichern
10.12.2010 14:35:12
NoNet
Hallo Markus,
anbei ein Beispiel zum Auslesen, Speichern, Löschen und Zurücksetzen der Bedingten Formatierungen eines Bereiches :
https://www.herber.de/bbs/user/72657.xls
Hinweis : auf das Speichern und Zurücksetzen der Rahmenformatierungen, Muster (Schraffierungen) und etlichen Schriftformatierungen habe ich der Einfachkeit wegen verzichtet.
Es werden nur die Schriftart, Farbe und Größe sowie die Hintergrundfarbe der Bed.Formatierung gespeichert !
Die ARRAY-Variable arBF() ist auf einen 10x10 Zellen großen Bereich begrenzt, falls größere Bereiche gespeichert werden sollen, bitte anpassen !!
Gruß, NoNet
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Bedingte Formatierung in Excel auslesen und verwalten


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.
  2. Modul hinzufügen: Klicke mit der rechten Maustaste auf "VBAProject (DeinWorkbook)" und wähle Einfügen > Modul.
  3. Code zum Auslesen der bedingten Formatierungen einfügen:

    Dim strBedingteFormatierung(1 To 256) As String
    Dim ranAltBereich As Range
    Dim x As Integer
    
    Sub BedingteFormatierungAuslesen()
       Set ranAltBereich = Range("A" & ActiveCell.Row & ":IV" & ActiveCell.Row)
       x = 0
       For Each ranZelle In ranAltBereich
           If ranZelle.FormatConditions.Count > 0 Then
               x = x + 1
               strBedingteFormatierung(x) = ranZelle.FormatConditions(1).Formula1
           End If
       Next ranZelle
    End Sub
  4. Ausführen: Setze den Cursor in die gewünschte Zeile und führe das Makro BedingteFormatierungAuslesen aus.
  5. Formatierungen löschen: Du kannst die Formatierungen der Zeile mit folgendem Code löschen:
    Sub FormatierungenLoeschen()
       ActiveCell.EntireRow.FormatConditions.Delete
    End Sub
  6. Formatierungen wiederherstellen: Um die zuvor gespeicherten Formatierungen wiederherzustellen, verwende diesen Code:
    Sub FormatierungenWiederherstellen()
       Dim ranZelle As Range
       Dim x As Integer
       x = 0
       For Each ranZelle In ranAltBereich
           If x < UBound(strBedingteFormatierung) Then
               ranZelle.FormatConditions.Add Type:=xlExpression, Formula1:=strBedingteFormatierung(x + 1)
           End If
           x = x + 1
       Next ranZelle
    End Sub

Häufige Fehler und Lösungen

  • Laufzeitfehler '1004': Dieser Fehler tritt auf, wenn eine Zelle keine bedingte Formatierung hat. Stelle sicher, dass Du dies im Code abfängst:

    If ranZelle.FormatConditions.Count > 0 Then
      ' Auslesen der bedingten Formatierung
    End If
  • Target ist Nothing: Wenn Du das Makro nicht in einer Ereignisprozedur ausführst, könnte Target nicht definiert sein. Verwende stattdessen ActiveCell.


Alternative Methoden

  • Formatierungen kopieren: Eine einfache Methode besteht darin, die Formatierungen in einen unbenutzten Bereich zu kopieren. Dies kann unter Verwendung der Funktion "Inhalte einfügen - Formate" erfolgen.

  • Excel VBA zur Automatisierung: Du kannst VBA verwenden, um die bedingte Formatierung automatisch auszulesen und diese bei Bedarf wiederherzustellen.


Praktische Beispiele

Ein Beispielcode, um die bedingte Formatierung einer Zeile auszulesen und zu löschen:

Sub Beispiel()
    Call BedingteFormatierungAuslesen
    Call FormatierungenLoeschen
    ' Nach einigen Änderungen ...
    Call FormatierungenWiederherstellen
End Sub

Tipps für Profis

  • Erweiterte Fehlerbehandlung: Verwende On Error Resume Next, um Fehler im Code eleganter zu behandeln.
  • Dynamische Arrays: Wenn Du mehr als 256 bedingte Formatierungen benötigst, erwäge die Verwendung eines dynamischen Arrays.
  • Formatierungen exportieren: Du kannst auch ein Makro schreiben, um die bedingten Formatierungen in eine externe Datei zu exportieren.

FAQ: Häufige Fragen

1. Wie kann ich die Farbe einer bedingten Formatierung auslesen?
Du kannst die Farbe mit ranZelle.Interior.Color oder ranZelle.FormatConditions(1).Interior.Color auslesen.

2. Was mache ich, wenn mein Code nicht funktioniert?
Überprüfe, ob Du die richtigen Zellreferenzen verwendest und ob die bedingte Formatierung tatsächlich existiert. Verwende Debugging-Tools im VBA-Editor, um den Code Schritt für Schritt auszuführen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige