Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1192to1196
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

Bedingte Formatierung auslesen - Fortsetzung

Bedingte Formatierung auslesen - Fortsetzung
Markus
Hallo zusammen!
Ich wünsche allen im Forum ein erfolgreiches und glückliches Neues Jahr 2011! Mitte Dezember habe ich einen Thread geöffnet, den ich dann leider aus Zeitgründen erstmal nicht weiter verfolgen konnte - ärgerlich. Sorry an alle, die sich bereits hierzu eingebracht und von mir noch kein Feedback bekommen haben: Luc, Rudi Maintaire und besonders NoNet! Ich würde hier jetzt aber gern nochmal ansetzen, weil ich noch nicht ganz am Ziel bin. Der Hintergrund ("warum das alles") steht im alten Thread im Beitrag Geschrieben am: 10.12.2010 12:51:26.
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 @NoNet: Vielen Dank für Deine Mühen und die Datei, die Du hochgeladen hast. Meine Programmierkenntnisse sind nicht sehr hoch , ich habe versucht, den Code anzupassen, um die Bedingten Formatierungen für eine komplette Zeile auszulesen (ich lade die Datei auch mal hoch, meine Änderungen habe ich kommentiert und zum leichteren Wiederfinden mit "###" gekennzeichnet).
https://www.herber.de/bbs/user/72887.xls
Die Dimension für die Zeilen (Variable arBF) könnte man sich eigentlich jetzt sparen, wenn das geht würde ich die Variable aber so belassen wie von Dir vorgeschlagen mit Dimension auch für die Zeilen, in meinem Fall aber nur Speicher für eine Zeile reservieren.
Was ich jetzt aber noch bräuchte wäre eine Erweiterung des Variablentyps typBedFormat um die Möglichkeit, auch die Linien (in meinem Fall reicht oben und unten) auslesen zu können (den korrekten Code kenne ich hierfür leider nicht ). Kannst Du mir hier weiterhelfen?
Ich hoffe, dass ich das Thema jetzt ohne weitere Unterbrechungen zum Ziel führen kann. ;-)
Grüße
Markus.
AW: Hier die alte Beitragsfolge
03.01.2011 10:44:55
Markus
Oha, hätte ich auch selbst drauf kommen können, das mit anzugeben ist schon hilfreich... Danke, Reinhard.
Benutzerdefinierter Variablentyp
03.01.2011 12:28:40
Markus
Vielleicht kann mir das jemand von Euch gerade im Forum Aktiven sagen: NoNet hat einen benutzerdefinierten Variablentyp erstellt:
Type typBedFormat 'Benutzerdefinierter Typ
Type As Byte
'Typen : xlCellValue = 1 / xlExpression = 2
Formula1 As String
Formula2 As String
'Formula2 und Operator nur bei Typ 'xlCellValue' !!
Operator As Byte
'Operatoren : xlBetween = 1 / xlNotBetween = 2 / xlEqual = 3 / xlNotEqual = 4
'xlGreater = 5 / xlLess = 6 / xlGreaterEqual = 7 / xlLessEqual = 8
FontName As String
FontSize As Long
FontColor As Long
InteriorColorIndex As Long
End Type

Meine Frage: Welche Werte werden z.B. im "Variablenteil" Operator gespeichert? Die Zahlenwerte (z.B. 5 für xlGreater) oder die "Strings", z.B. "xlGreater"? Ich verstehe es so, dass diese "Strings" von Excel festgelegte Konstanten sind, also wie oben geschrieben xlGreater=5 ist, damit wäre das im Prinzip natürlich egal. ;-) Kann man die Inhalte demnach sowohl numerisch als auch als String zuweisen, also z.B.:
Dim BF as typBedFormat
BF.Operator = 7,
um als Operator "größergleich" zuzuweisen?
Gibt es irgendwo in der Excel-VBA-Hilfe von MS eine Übersicht über diese (besser: alle) Konstanten? Da ich die Lösung von NoNet sehr elegant finde, würde ich den Code gern noch genauso elegant erweitern (z.B. noch um das Auslesen von Linien oben und unten). Beim Auslesen von gesetzten Linien ergibt sich nämlich nach meinem Verständnis eine ähnliche Problematik mit den XlBordersIndex-Konstanten.
Würde hierzu reichen, den Variablentyp zu ergänzen um:
Border As Long? So einfach ist es wohl nicht...
Hab mich grade mal durch die Excel-Hilfe gewühlt, bin aber nicht fündig geworden...
Grüße
Markus.
Anzeige
OT nur Tipp an Markus wg. Frage noch offen
03.01.2011 13:33:07
Reinhard
Hallo Markus,
rechts oberhalb des Eingabefeldes siehst du ein Kästchen, "Frage noch offen".
Solange das so ist hake das an. Dann erscheint im Betreff wie jetzt bei mir ein Symbol. Und der Beitrag kommt in die Liste "offene Fragen" (oben anwählbar.
Gruß
Reinhard
AW: OT nur Tipp an Markus wg. Frage noch offen
03.01.2011 13:37:13
Markus
Und wieder was gelernt! Vielen Dank für den Hinweis, Reinhard! :-)
Im Objektmanager des VBE stehen alle...
03.01.2011 15:05:58
Luc:-?
…Konstanten, Markus;
aber, damit dir gleich klar wird, worum es hier geht…
Ich habe vor geraumer Zeit mehrere udFktt geschrieben, die un- bzw bedingte Formate auslesen und die gezeigte (aktuelle) Formatierung feststellen können, auch als HTML-Code. Das sind 100e von Code-Zeilen, die den Rahmen eines Forums sprengen würden. So etwas muss man schon selber entwickeln oder als Komplett­lösung kaufen und wird es sich kaum aus einem Forum zusammenstoppeln können, denn hier geht's idR um Teilaspekte.
Vorausgesetzt, du könntest pgmieren, dürfte es doch nicht allzu schwer sein, bspw die Eigenschaften von borders(…) zu finden. Aber mit VBA nur mit Recorder würde ich mir an deiner Stelle doch noch mal überlegen, ob ich unbedingt den 2. vor dem 1.Schritt tun will und nicht doch erst viele einfachere Pgmm schreiben will. Ich habe auch nicht gleich mit der BedingtFormatierung angefangen, obwohl ich schon pgmieren konnte… ;-)
Gesundes Neues, Luc :-?
Anzeige
AW: Im Objektmanager des VBE stehen alle...
03.01.2011 16:13:49
Markus
Hallo Luc,
ich bin dank NoNets Code eigentlich schon fast am Ziel. :-) Ich wollte eigentlich "nur" noch ein paar Hintergründe verstehen, um Anpassungen/Erweiterungen selbst vornehmen zu können.
In meinem Spezialfall sind in "meiner" Tabelle oberhalb und unterhalb der aktiven Zelle dünne Linien per bedingter Formatierung zugewiesen. Bis auf diese Kleinigkeit(?) funktioniert der Code (genaugenommen nur fast, aber dazu komme ich dann später noch, ich will mich erst noch selbst daran versuchen). Wenn mir jemand von Euch hier noch unter die Arme greifen könnte...?
Ich würde es mal so ausdrücken: Ich habe schon etwas Programmiererfahrung, aber ich vergleiche das mit gesprochenen Sprachen: Ich kann die Grammatik ganz gut, habe aber nur sehr wenige Vokabeln drauf, weil ich nicht täglich mit VB(A) umgehe. Das führt dazu, dass ich oft Stunden damit verbringe, die richtige Vokabel = Befehl zu finden, was für den ein oder anderen hier aus dem Forum, der VBA "fließend spricht", wahrscheinlich nur eines Augenzwinkerns bedarf. ;-)
Wie gesagt, im vorliegenden Fall sind wir imho fast fertig, aber eben nur fast.
Ich will ja keine 100e Formatierungen basteln, sondern suche "nur" noch nach der Möglichkeit, die Linien oben und unten auszulesen bzw. wieder zu setzen.
Wenn das aber doch schon so sehr in die Tiefe gehen sollte, muss ich wohl oder übel weitersuchen. :-)
Trotzdem schon mal danke für Deine Hilfe!
Grüße
Markus.
Anzeige
oT: Häkchen bei "Frage noch offen"vergessen, sorry
03.01.2011 16:16:29
Markus
Frage ist für mich noch offen
D.dünnen Linien dürften ganze Zellrahmen sein,...
03.01.2011 16:59:28
Luc:-?
…Markus,
falls nicht schon xl11 auch Einzellinien zV stellt wie ab xl12. Auf jeden Fall findet man ihre Enumeration im VBE-Objektkatalog unter den Stichworten Borders und FormatConditions sowie ihre Werte unter xlBordersIndex als xlEdgeBottom und xlEdgeTop usw. Deren LineStyle, Weight und ggf Color musst du dann auslesen, also etwa so: fc1blst = Range(…).FormatConditions(1).BordersIndex(xlEdgeBottom).LineStyle
Nur Borders dürfte Null ergeben, wenn nicht alle Borders angelegt bzw unterschiedl formatiert sind. Unter xl9-? wäre nur ein Gesamtrahmen möglich, da sieht das dann für BedingtFmt etwas anders aus.
Gruß Luc :-?
Anzeige
Modifikationsversuch - leider mit Laufzeitfehler
04.01.2011 09:52:50
Markus
Hallo Luc,
ich habe Deine Anregung aufgenommen und mit der VBA-Hilfe die Code-Vorlage von NoNet angepasst, wie ich mir das in etwa vorstelle. Meine Änderungen habe ich zur besseren Übersicht im Code markiert.
Syntaktisch scheint alles ok zu sein, aber ich erhalte einen Laufzeitfehler (hab das im Code mal notiert, s.d.). Mir ist ein Rätsel, wieso die LineStyle-Eigenschaft nicht ausgelesen werden kann...
https://www.herber.de/bbs/user/72898.xls
Hast Du eine Idee, warum?
Grüße
Markus.
Modifikationsversuch - was du hier versuchst,...
04.01.2011 15:06:11
Luc:-?
…Markus,
kann ich gar nicht testen (unter xl12!) — der benutzerdefinierte Typ scheint nicht bzw nicht voll akzeptiert zu wdn. Beim LineStyle ist auch von kann nicht zugeordnet wdn die Rede, ein Zeichen dafür, dass er so im xl11-BedingtFormat entweder überhpt nicht existiert oder nur bei einer Zelle nicht oder eben der Typ nicht akzeptiert wird.
Aber wie sich herausstellt, haben Zelle A1 u.C1 keine Linien im BedFmt u.C2 überhpt kein BedFmt. Wenn du das nicht abfängst [IsNull(…) o.ä.], brauchst du dich über Laufzeitfehler nicht zu wundern…!
Gruß Luc :-?
Anzeige
auch mit Linien gibt es den Fehler...
04.01.2011 15:25:59
Markus
Luc:
Ich habe vermutet, dass die LineStyle-Eigenschaft nie leer ist, sondern mindestens mit xlNone belegt wird, deswegen hab ich das nicht abgefangen. Ob das wirklich so ist, kann ich mangels Erfahrung nicht sagen.
Ich habe vorhin mal ausgetestet, ob es evtl. daran liegt, dass ich in A1 keine Linien gesetzt habe und eben die Linien mal gesetzt (natürlich alles in bed. Formatierung). Der Fehler kommt trotzdem, und das dürfte ja nicht sein, oder?
Grüße
Markus
Offensichtl kannst du separate Linien in xl11...
04.01.2011 16:38:11
Luc:-?
…setzen, Markus,
ich habe zZ nur xl9, da geht das nicht, und xl12, da geht das. Ich muss mal in meinen Pgmm nachsehen bzw die an deinem Blatt versuchen, ob das dann bzw (festzustellen,) warum das nicht geht.
Gruß+bis dann, Luc :-?
Anzeige
Zitat zur bF aus der Xl-11-VBA-Hilfe
05.01.2011 07:36:28
Markus
Hallo Luc,
ich habe mal kopiert, was die Xl-11-Hilfe zum Thema FormatCondition(Objekt) hergibt:

FormatCondition (Objekt)
Siehe auchEigenschaftenMethodenEreignisseBesonderheitenFormatConditions
FormatCondition
Mehrere Objekte
Stellt ein bedingtes Format dar. Das FormatCondition-Objekt ist ein Element der  _
FormatConditions-Auflistung. Die FormatConditions-Auflistung kann für einen gegebenen Bereich bis zu drei bedingte Formate enthalten.
Verwenden des FormatCondition-Objekts
Verwenden Sie FormatConditions(index), wobei index die Indexnummer des bedingten Formats ist,  _
um ein FormatCondition-Objekt zurückzugeben. Im folgenden Beispiel werden die Formateigenschaften für ein bestehendes
bedingtes Format der Zellen E1:E10 festgelegt.
With Worksheets(1).Range("e1:e10").FormatConditions(1)
With .Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 6
End With
With .Font
.Bold = True
.ColorIndex = 3
End With
End With
Hinweise
Verwenden Sie die Add-Methode, um ein neues bedingtes Format zu erstellen. Wenn Sie versuchen,  _
mehr als drei bedingte Formate für einen einzigen Bereich zu erstellen, schlägt die Add-Methode fehl.
Besitzt ein Bereich drei Formate, können Sie mit der Modify-Methode eines der Formate ändern,  _
oder mit der Delete-Methode ein Format löschen und anschließend mit der Add-Methode ein neues Format erstellen.
Verwenden Sie die Eigenschaften Font, Border und Interior des FormatCondition-Objekts, um das  _
Erscheinungsbild der formatierten Zellen zu steuern.
Einige Eigenschaften dieser Objekte werden durch das Objektmodell des bedingten Formats nicht  _
unterstützt. Die Eigenschaften, die mit der bedingten Formatierung verwendet werden können,
sind in der folgenden Tabelle aufgeführt.
Objekt: Font
Eigenschaften:
Bold
Color
ColorIndex
FontStyle
Italic
Strikethrough
Underline
Die Unterstreichungsarten "Buchhaltung" können nicht verwendet werden.
Objekt: Border
Eigenschaften:
Bottom
Color
Left
Right
Style:
Folgende Rahmenarten können verwendet werden (alle anderen werden nicht unterstützt): xlNone,  _
xlSolid, xlDash, xlDot, xlDashDot, xlDashDotDot, xlGray50, xlGray75 und xlGray25.
Top
Weight:
Folgende Rahmenstärken können verwendet werden (alle anderen werden nicht unterstützt):  _
xlWeightHairline und xlWeightThin.
Objekt: Interior
Eigenschaften:
Color
ColorIndex
Pattern
PatternColorIndex
Wenn ich aber eine Linie oben und unten in einer bedingten Formatierung in einer Zelle manuell festlege, sollte ich das doch in jedem Fall auch per VBA auslesen können (wie in der Beispieltabelle). Hier bin ich aber noch nicht wesentlich weitergekommen.
Bin schon gespannt, ob Du etwas herausfinden kannst.
Bis dann
Grüße
Markus.
Anzeige
Ersetze "xlEdgeTop" durch "xlTop"...
05.01.2011 12:15:03
Markus
... und "xlEdgeBottom" durch "xlBottom", dann kommt man (leider nur) etwas weiter. Funktioniert aber immer noch nicht zuverlässig. Nicht alle Linien, die man manuell setzen kann, werden dann auch ausgelesen. Bei einigen gibt es eine "Überlauf"-Fehlermeldung.
Das habe ich beim Googlen gefunden, weiß aber nicht, warum das so ist (in der VBA-Hilfe habe ich nichts dazu finden können).
Ich stochere also immer noch nur herum... Wäre daher wirklich dankbar, wenn sich hier jemand erbarmen würde. ;-) Auch wenn mir jemand erklären könnte, worin sich die Konstanten "xlTop" und "xlEdgeTop" unterscheiden.
Grüße
Markus.
Anzeige
Na, dann warst du ja fleißig, aber noch...
05.01.2011 14:33:27
Luc:-?
…sinnvoller wäre es, auch noch bzw eher den Objektkatalog zu Rate zu ziehen, Markus;
der sagt dir, welche Werte diese Enumerations haben. Also das Einfache zuerst…
Auch an VBA haben mehrere Leute sowohl gleichzeitig als auch nachein­einander gearbeitet. Deshalb sind mitunter Variablen mehrfach in Variationen vorhanden. Einer hat Enums für alle möglichen Zwecke angelegt und andere haben die entweder genutzt oder eigene gemacht oder gar beides in bunter Mischung. xlTop ist bspw so eine zentrale Konstante, die allgemein zu Constants gehört. Diese haben oft sehr kleine Negativwerte ab ca -4000 abwärts. So auch hier. xlEdgeTop scheint speziell für Borders gemacht worden zu sein und gehört zur Enum xlBordersIndex mit Wert 8. Da die Bedingt­Formatierung erst später hinzugefügt wurde (die Einzellinien sogar noch später), kann es sein, dass der Pgmmer hierbei die allgemeine Konstante xlTop verwendet hat und nicht die spezielle xlEdgeTop.
Diesen Teil meiner Pgmm habe ich bisher nur für xl9 geschrieben und da ist das bei FormatConditions irrelevant, weil nur der ganze Rahmen erzeugt wdn kann. Aber auch so war das mit der komplizierteste Teil der FktsProz, weil es auch eine gewisse Verbindung zwischen Weight und LineStyle gibt. So ist einer der beiden Werte eigentl immer voreingestellt und muss nur geändert wdn, wenn er nicht zum anderen passt (bzw ändert sich teilautomatisch). Deshalb frage ich für BedingtFormat immer erst nach Borders insgesamt IsNull(.Borders), dann, ob die Linienstärke einen Fehler ergibt IsError(.Borders.Weight), dazu muss entweder am PgmAnfang On Error Resume Next stehen oder der Fehler muss mit On Error GoTo …abgefangen, dann in der Fehlerbehandlung selektiert und das Pgm ggf mit Resume Next mit dem Folgebefehl oder mit GoTo an gewünschter Stelle fortgesetzt wdn. Unter xl11 kann sich das aber etwas anders darstellen, weil du dann ggf noch die Einzellinien abfragen musst. Die könnten evtl auch Null sein oder einen Fehler liefern.
Ich glaube mich richtig zu erinnern (hatte mich damit zuetzt ca Aug 2009 beschäftigt), dass ich das Problem mit den verschiedenen BordersIndizes mit Einordnung der negativen in die Freibereiche der Positiven (die gibt's nämlich auch und fktn sogar - undokumentiert!) gelöst hatte (für normal formatierte Rahmenlinien).
Probier's mal durch!
Gruß Luc :-?
Anzeige
Fleißig ja, aber brotlose Kunst...
06.01.2011 10:50:18
Markus
Hallo Luc!
Vielen Dank für Deine ausführlichen Anmerkungen! Ich werde dann mal durchprobieren... Das kann aber etwas dauern, weil ich das Thema erstmal wieder beiseite legen muss.
Ich werde den Thread später noch einmal eröffnen, dann aber mit dem Gesamtzusammenhang, also dem "wozu dat Janze". Ausgangspunkt war ursprünglich, einen dynamischen Mauszeiger zu implementieren. Die Lösung, die ich hierzu gefunden habe, war für meine Tabelle aber nicht ganz zu gebrauchen, weil bei mir eben auch noch bedingte Formatierungen enthalten sind, die den den "dynamischen Mauszeiger" überlagern. Ich wollte daher "nur mal eben" noch die bedingten Formtierungen auslesen und dachte, dass ich damit an max. einem Vormittag durch bin... Hätte nie gedacht, dass das nicht so trivial ist, wie es sich anhört... ;-)
Vielleicht habe ich mich mit dem Ansatz ja völlig verrant und es gibt eine viel einfachere Lösung für mein Ursprungsproblem.
Würde mich freuen, wenn Du später dann noch einmal Gelegenheit findest, auch einen Blick darauf zu werfen.
Bis dann
Grüße
Markus.

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige