VBA Color hiszti

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.

4 thoughts on “VBA Color hiszti

  1. orrmany

    Egy régi progranyozó kollégámnak elmeséltem, hogy TTCN-3-ban fejlesztek. A fejét fogta, hogy az valami "black magic" lehet, ő marad a C-nél. Hát, a VBA sem semmi állat.

    Valami lenne ez TTCN3-ban:

    module bitshift
    {

    type record length (3) of integer IntegerTriplet ;

    function color2RGB(in integer myColor, out IntegerTriplet rgbComponents) {
    var octetstring myByteTripletString:=int2oct(myColor,3)
    rgbComponents[0] :=oct2int(myByteTripletString[0]);
    rgbComponents[1] :=oct2int(myByteTripletString[1]);
    rgbComponents[2] :=oct2int(myByteTripletString[2]);
    }
    function RGB(in integer r, in integer g, in integer b) return integer {
    return oct2int(int2oct(r,1) & int2oct(g,1) & int2oct(b,1))
    }
    function offsetColor(
    in integer myColor,
    in integer r := 0,
    in integer g:=0,
    in integer b := 0)
    return integer
    {
    var IntegerTriplet rgbComponents;

    color2RGB(myColor, rgbComponents)
    r:=r+rgbComponents[0]
    g:=g+rgbComponents[1]
    b:=b+rgbComponents[2]

    return RGB(r,g,b)

    }

    control {
    log(int2oct(offsetColor(myColor:=0, r:=1, g:=2, b:=3),3))
    }
    } // end of module

  2. orrmany

    Jah, a log() eredménye:

    2011/May/12 00:52:53.831000 USER bitshift.ttcn:36(controlpart:bitshift) '010203'O
  3. eFi Post author

    Na ezaz - 0x010203 az normális kockának olvasható - a francnak kell fordítva tárolniuk?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.