Tag Archives: VBA

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