Okos, offsetelős color kezelést kell csinálnom Excelben (az Excel és az "okos" color kezelés két külön fogalom, de ettől most tekintsünk el).
Elsőnek csinálunk egy Long típusú color adatot épeszű RGB-re felbontó függvényt:
Sub color2RGB(myColor As Long, RGBComponents() As Byte)
RGBComponents(0) = (myColor And &HFF0000) \ &H10000
RGBComponents(1) = (myColor And &HFF00&) \ &H100
RGBComponents(2) = (myColor And &HFF&)
End Sub
A fenti függvény debilnek látszó részeihez némi magyarázat:
- Azon hexa számok végén lakik &, akik max. 16 biten elférnek, de én 32 bitre szeretném őket erőltetni (=force 32 bit). A 16 bitnél hosszabb számok mögé is pakolhatsz &-t, de azt még az IDE legyilkolja.
- A \ egy spéci osztás, ami az osztás eredményének egész részét adja vissza (=int(a/b))
Ezek után írjunk egy color offsetelőt, ami egy Long colort tud offsetelni:
Function offsetColor(myColor As Long, Optional R As Integer = 0, Optional G As Integer = 0, Optional B As Integer = 0) As Long
Dim RGBComponents(2) As Byte
Call color2RGB(myColor, RGBComponents())
R = (R + RGBComponents(0)) Mod &HFF
If R < 0 Then R = 0
G = (G + RGBComponents(0)) Mod &HFF
If G < 0 Then G = 0
B = (B + RGBComponents(0)) Mod &HFF
If B < 0 Then B = 0
offsetColor = RGB(R, G, B)
End Function
Meg is volnánk, próbáljuk ki:
?Hex(offsetColor(myColor:=0, R:=1, G:=2, B:=3))
30201
A bolygón minden más programozási nyelven azt várnád, hogy 0x010203 lesz az eredmény - ehelyett a "drágaszág" RGB() függvény az R és a B értékeit láthatóan megcserélve tárolja. Nice.
Biztosra akartam menni, hogy nem én vagyok az idióta és megnéztem az Excel VBA helpet - íme a gyári példa:
MyObject.Color = RGB(255, 0, 0) ' Set the Color property of MyObject to Red.
Értem én, hogy annak a Long-nak a struktúrája az engine belső magánügye, de könyörgöm, fiúk, ott Redmondban, mi a francért kell ezt másképp csinálni, mint az egész világ? Persze lehet, hogy az egész csak byte-sorrend kérdése, de már akar a franc belegondolni.