[Excel VBA] ColorIndex 之 57 色演色表 (實際展示) - 返回 最初的純真性情 - udn部落格
返回 最初的純真性情
作家:ThisIsTheWay
文章分類
    Top
    [Excel VBA] ColorIndex 之 57 色演色表 (實際展示)
    2018/06/16 22:17:26
    瀏覽:16129
    迴響:1
    推薦:1
    引用0
    在另一篇文章裡談到 Excel 只能使用 57 色(*註),這57色在它裡面有編號,從 0-56號,Excel VBA 裡也用 RGB 三原色的組成值來表示色彩。這裡我就寫一個小程序來展示如何在 Excel VBA 裡使用ColorIndex (色號) 及Color (色彩RGB值)。

    *註:參閱 http://blog.udn.com/WayCheng/2705003

    把底下這個Demo57Colors()程序放在一個空白工作表的程式碼區,然後執行它,它就會在那張工作表建立一個表格,第1列是表頭,第2至第58列就是色號0至57的實際呈現 (如圖片)

    展示 57 種色彩

     A 欄:呈現該色彩用於儲存格底色 (interior)

     B 欄:呈現該色彩用於儲存格裡的文字 (font)

     C 欄:以十六進位數字表示該顏色的三原色值 (依 BBGGRR 和 RRGGBB 兩種順序並列)

     D、E、F 欄:以十進位數字分別表示該顏色的 R、G、B 值

     G 欄:該列的色號 (ColorIndex)



    在程式裡,你會看到 "Cells(row, column).Interior.ColorIndex = ?" 的句子指定儲存格底色,用 "Cells(row, column).Font.ColorIndex = ?" 的句子指定儲存格文字的顏色,然後,用 "Cells(row, column).Interior.Color" 取出 指定儲存格底色的 Color 屬性,也就是它的 RGB 值,把這個數值轉成 16 進位。由於 RGB 值會是 6 個十六進位數位 (Hexdecimal Digits) 所組成,所以用 Hex() 函數將此值轉成 6 個十六進位數位做成一個字串。(你會看到我在程式註解裡說 6 nibbles,因為每個 Hexdecimal Digits 是用 4 個 bits 儲存,4 bits 就是半個 byte,稱為 nibble)

    由於 Color 屬性 RGB 值的實際儲存順序為 "BBGGRR",我在程式裡特別重組一個順序為 "RRGGBB" 的字串,然後把兩個自串連起來放入 C 欄。

    我想要在 C、D、E 三個欄位裡分別顯示出 R、G、B 的十進位值,但是 VBA 裡面沒有把十六進位轉成十進位的函數,於是我利用儲存格公式的HEX2DEC()函數,在VBA程式裡組成像 =HEX2DEC("FF") 這樣的公式字串,然後把這字串填入儲存格。

    但是,當公式字串填入的一瞬間,如果 (萬一) 字串尚未完全填入,Excel 的公式解譯器就開始解譯公式,它就會認為公式錯誤。因此在程式的開頭就有一句:Application.Calculation = xlCalculationManual,就是讓 Excel 暫時停止執行所有儲存格裡的公式。當所有儲存格裡的公式都填入了,再用這一句Application.Calculation = xlCalculationAutomatic,讓 Excel 可以執行儲存格裡的公式。

    Sub Demo57Colors()

    Coder: Way Cheng

    展示活頁簿裡 0 to 56 號色彩共 57 色的實際使用

    Application.ScreenUpdating = False            暫時停止螢幕更新

    Application.Calculation = xlCalculationManual 暫時停止自訂公式的執行

    Dim i As Long

    Dim strBGR As String, strRGB As String

    Cells(1, 1) = "底色"

    Cells(1, 2) = "文字"

    Cells(1, 3) = "#BBGGRR#RRGGBB"

    Cells(1, 4) = "R(10)"

    Cells(1, 5) = "G(10)"

    Cells(1, 6) = "B(10)"

    Cells(1, 7) = "色號"

    For i = 0 To 56

      Cells(i + 2, 1).Interior.ColorIndex = i      A欄:背景底色設為 i 號色彩

      Cells(i + 2, 1).Value = "[Color " & i & "]"  A欄: 填入文字 (色號)

      Cells(i + 2, 2).Font.ColorIndex = i          B欄: 文字色彩設為 i 號色彩

      Cells(i + 2, 2).Value = "[Color " & i & "]"  A欄: 填入文字 (色號)

      strBGR = Right("000000" & Hex(Cells(i + 2, 1).Interior.Color), 6)  取A欄底色值 6 nibbles為 "BBGGRR"

      strRGB = Right(strBGR, 2) & Mid(strBGR, 3, 2) & Left(strBGR, 2)    然後轉成 "RRGGBB" (strRGB)

       Cells(i + 2, 3) = "#" & strBGR & "#" & strRGB & ""   C欄: 以16進位顯示 GBR 與 RGB

      Cells(i + 2, 4).Formula = "=Hex2dec(""" & Right(strBGR, 2) & """)"  D欄: Red 值以十進位顯示

      Cells(i + 2, 5).Formula = "=Hex2dec(""" & Mid(strBGR, 3, 2) & """)" E欄: Green 值以十進位顯示

      Cells(i + 2, 6).Formula = "=Hex2dec(""" & Left(strBGR, 2) & """)"   F欄: Blue 值以十進位顯示

      Cells(i + 2, 7) = "[色彩 " & i & "]"     G欄: 儲存格自訂格式時可以這樣寫

    Next i

    done:

      Application.Calculation = xlCalculationAutomatic  公式恢復執行

      Application.ScreenUpdating = True                 螢幕恢復更新

    End Sub

    ※2019/8/21 修訂程式碼,感謝吳國棟君不吝指正。

    回應
    迴響(1) :
    1樓. ThisIsTheWay
    2019/08/21 18:25




    吳國棟先生,謝謝您! 我修改了!


    發表迴響

    會員登入