Contents ...
udn網路城邦
[Excel VBA] ColorIndex 之 57 色演色表 (實際展示)
2018/06/16 22:17
瀏覽431
迴響0
推薦1
引用0

在另一篇文章裡談到 Excel 只能使用 57 色,這57色在它裡面有編號,從 0-56號,Excel VBA 裡也用 RGB 三原色的組成值來表示色彩。這裡我就寫一個小程序來展示如何在 Excel VBA 裡使用ColorIndex (色號) 及Color (色彩RGB值)。

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

展示 57 種色彩

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

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

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

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

 G 欄:該列的色號 (ColorIndex)

<ColorIndex 與 RGB 值>

在程式裡,你會看到 "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 欄。

<VBA 在儲存格填入公式>

我想要在 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 + 1, 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) = "[Color " & i & ")"     'G欄: 填入文字 (色號)

Next i

done:

  Application.Calculation = xlCalculationAutomatic  '公式恢復執行

  Application.ScreenUpdating = True                 '螢幕恢復更新

End Sub

有誰推薦more
發表迴響

會員登入