Wieso liefert in Excel VBA die Funktion Interior.Colorindex verschiedene Werte zurück?

Linke Spalte Windows 7 mit Excel 2002 und rechts WinXP mit Excel 2010 - (Windows, Programm, programmieren)

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Das ist eine alte Erfahrung und deshalb empfiehlt es sich, mathematische Sachverhalte nicht über Formate laufen zu lassen!

Die "Design"-Farben von xl2007 können genauso kurzlebig sein wie alle anderen vorher auch. Selbst die Grautöne (unterhalb der Farbwabe) haben sich geändert!
Exakt geblieben sind meines Wissens nur die Standards reines Schwarz mit RGB(0;0;0), Weiß(255;255;255), Rot(255;0;0) und Gelb((255;255;0) -
dagegen tauchen reines Grün(0;255;0), Blau(0;0;255), Türkis(0;255;255) und Magenta(255;0;255) schon nicht mehr auf - wenigstens sind sie in der Farbwabe noch verfügbar.

Beispiel: 2007: Orange, Akzent 6 hat RGB(247;150;70), die ähnlichste Farbe in xl2000 war die indexfarbe 45 mit RGB(255;153;0) - zahlenmässig ein großer Unterschied (optisch kaum).
Ich nehme an, dass MS damit den Konkurrenten ein Schnippchen schlagfen will, auf unsere Kosten!

Der Vorschlag von PauleVBA ist richtig, nützt Dir aber nicht viel, wenn die Systemfarben andere sind und Deine genauen RGB-Werte nicht mehr auftauchen.
Du entkommst dieser Problematik nur, wenn Du die Grundllage für die Farbgebung kennst:

Du hast eine Farbe ja (vielleicht) nach einem bestimmten Kriterium vergeben. Versuche, dieses Kriterium zu formulieren und nimm es als Bedingung für Deine mathematische Operation!

Anmerkung: Die FARBZAHL ist R + G*2^8 + B*2^16. umgekehrt ist die Formel komplizierter:
steht die Farbzahl in A1, so gelten die Formeln:
Rot =A1-GANZZAHL(A1/2^8)*2^8
Grün =GANZZAHL((A1-GANZZAHL(A1/2^16)*2^16)/2^8)
Blau =GANZZAHL(A1/2^16)


maxbreak 
Beitragsersteller
 17.04.2012, 18:20

Super Antwort, danke.
Das Problem besteht darin, daß der Benutzer Zellen farbig markieren kann. Jede Farbe hat eine bestimmte Bedeutung. Anschließend mache ich entsprechende Auswertungen über die Tabellen/Zellen in VBA unter anderem aufgrund der vergebenen Farbe.

Wäre das eine Lösung des Problems: ?

Ich lege einen neue Tabelle "Parameter" an, in der unter anderem die Farben und die jeweiligen Bedeutungen in den User-Tabellen definiert sind. Im bisherigen Programm frage ich dann nicht mehr hartcodiert einen festen Colorindex ab, sondern ich vergleiche neu den Colorindex aus der Parameter-Tabelle mit dem Colorindex der zu analysierenden Zelle. Müßte doch funktionieren, weil die Zellen in der Parameter-Tabelle und in der User-Tabelle bei gleicher Farbe den gleichen Colorindex enthalten müßten!? Bei einer anderen Excel-Version ist der Wert zwar evtl. unterschiedlich aber die beiden zu vergleichenden Werte müßten dann wieder konsistent sein?

0
Iamiam  17.04.2012, 21:22
@maxbreak

ich habe nie ausprobiert, ob xl einen vorhandenen Colorindex "mitzieht", wenn man den Colorindex nachträglich neu definiert.

Du kannst die Farbe der Benutzertabelle für mehrere dort verwendete Colorindices analysieren (als.color = .index(n) => Zahl in Zelle schreiben oder ins Direktfewnster mir debug.print und in xl2000 dann Deine Colorindices entsprechend dieser Zahl neu definieren - für diese Datei. Das funktioniert immer, wenn Du die Bedeutung der Farben zuordnen kannst. Da musst Du entsprechend Deiner Aufgabenstellung eben zeitaufwändig rumprobieren -müsste ich jetzt auch.. Oder Du bittest den Benutzer von xl2007, folgendes Makro zu installieren sowie ein neues Blatt anzulegen, zu aktiviewren(anwählen) und dann das µ zu starten:

Sub DateiFarben56xAbbildenSamtFarbzahlUndRGB() '<<<färbt 1.Spalte mit allen Colorindices, rechts daneben ColorZahl, 2 daneben: R;G;B
Dim uFIx As Long, i, R, G, uB
For i = 1 To 56
ActiveSheet.Cells(i, 1).Value = i
ActiveSheet.Cells(i, 1).Interior.Color = ActiveWorkbook.Colors(i)
ActiveSheet.Cells(i, 2).Value = ActiveSheet.Cells(i, 1).Interior.Color
uFIx = ActiveSheet.Cells(i, 1).Interior.Color
R = (CStr(uFIx - Fix((uFIx - Int(uFIx / 65536) * 6553 6) / 256) * 256 - Int(uFIx / 65536) * 65536))
G = (CStr(Int((uFIx - Int(uFIx / 65536) * 65536) / 256)))
uB = (CStr(Int(uFIx / 65536)))
ActiveSheet.Cells(i, 3).Value = R & ";" & G & ";" & uB
Next
End Sub

(das µ hatte ich in meinem Fundus)
Das sollte vorsichtshalber auf seinem System geschehen. Du kannst das dann mit Deinem vergleichen.

0
Iamiam  17.04.2012, 23:19
@Iamiam

Die Formel für R geht auch viel einfacher:
R = (uFix/256-Int(uFix/256))*256

0

Lösngsvorschlag:

Ermittele die Farbwerte aus BEIDEN Sytemen. Vergleiche die Werte.

Der Unterschied (Farbe Win7 gegen Farbe XP) kann dann im Makro berücksichtigt werden.

Gruß aus Berlin

Woher ich das weiß:Hobby – Jahrelanges programmieren.

Das liegt daran, dass Du von Version zu Version mehr Farben zur Verfügung hast. In Excel 97 waren es noch ganze 16 Farben. Und wie sich altes OS (XP) und neues Excel oder neues OS (7) und altes Excel dann auswirken, kann nur der jeweilige Anwender erkunden.

Aber ein Tipp: Verwende mal Color statt ColorIndex, dann bekommst du eine "SystemZahl" mit bis zu 7 Stellen. Die sollte eigentlich gleich bleiben (aber bei MS weiß man das N I E )

Oder lege die Farben mit

ActiveWorkbook.Colors(5) = RGB(255, 0, 0)

für jede Farbe (Index von Colors, hier die fünfte Farbe) selbst fest, vieliecht hilft ja das