]]>

# VBA Color hiszti

```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.]]>