VBA 填充顏色和字體顏色


示例 1 - 在 Sub 中使用用戶選擇的 ( Ribbon ) 顏色

您可能想知道為什么它沒有作為變量/方法公開,以便能夠像使用 Excel 中的任何其他對象一樣訪問,並且到目前為止(2020 年 7 月),我找不到任何官方文檔來說明原因.

在功能區的“主頁”部分,您有兩個方便的樣本,分別是填充顏色和字體顏色。
色帶上的色板能夠訪問這些而不是在腳本上使用顏色選擇器不是很有用嗎?
看看下面的腳本 - 這是將這些顏色轉換為可用形式的一種方法。

Sub GetWorkbookUserColoursExample()
Dim LP As Integer, ColFG, ColBG As Long
Dim FL_IND, FL_IND_NEG As Double
Dim F_R, F_G, F_B, B_R, B_G, B_B As Integer
Dim IterationsMax As Integer
IterationsMax = 40
Range("A1").Select
Application.CommandBars.ExecuteMso ("CellFillColorPicker")
Range("A2").Select
Application.CommandBars.ExecuteMso ("FontColorPicker")
':: Set font to background colour so we can see it.
Range("A2").Interior.Color = Range("A2").Font.Color
':: Store to variables.
ColFG = Range("A2").Interior.Color
ColBG = Range("A1").Interior.Color
'STORE AS COLOUR COMPONENTS ::
':: FOREGROUND
'R
F_R = ColFG Mod 256
'G
F_G = ((ColFG \ 256) Mod 256)
'B
F_B = (ColFG \ 65536)
':: BACKGROUND
'R
B_R = ColBG Mod 256
'G
B_G = ((ColBG \ 256) Mod 256)
'B
B_B = (ColBG \ 65536)
':: Do a Gradient? ?

For LP = 0 To IterationsMax
':: Set factor 0-1 to apply to individual R/G/B components of Forground / Background Colours..

FL_IND = LP / IterationsMax
FL_IND_NEG = (IterationsMax - LP) / IterationsMax
Range("C" & LP + 1).FormulaR1C1 = "FG: " & Format(FL_IND, "#0%") & " / BG: " & Format(FL_IND_NEG, "#0%")
Range("D" & LP + 1).Interior.Color = RGB(CInt(FL_IND * F_R), CInt(FL_IND * F_G), CInt(FL_IND * F_B))
Range("E" & LP + 1).Interior.Color = RGB(CInt(FL_IND_NEG * B_R), CInt(FL_IND_NEG * B_G), CInt(FL_IND_NEG * B_B))
Range("F" & LP + 1).Interior.Color = RGB(CInt(FL_IND_NEG * B_R) + CInt(FL_IND * F_R), CInt(FL_IND_NEG * B_G) + CInt(FL_IND * F_G), CInt(FL_IND_NEG * B_B) + CInt(FL_IND * F_B))
Next LP
End Sub

我只是把漸變部分作為使用顏色的一種方法。
有用的部分是兩條線
Application.CommandBars.ExecuteMso ("CellFillColorPicker")
Application.CommandBars.ExecuteMso ("FontColorPicker")
這些方法本質上就像您單擊色板並將顏色(字體或填充)應用於所選單元格一樣。
然后捕獲這些,只需訪問/保存單元格顏色到變量。
一個更簡單的例子 -

':: Select the range 
Range("A2").Select
':: Do the ExecuteMSO ( Set Cell Background/Fill colour )
Application.CommandBars.ExecuteMso ("CellFillColorPicker")
':: Store to variables.
MyBgColourVariable = Range("A2").Interior.Color

也許有一天,我們將能夠通過 Workbook / Application 將其引用為 Workbook.Swatch.FillColor 之類的東西。
到目前為止,這是我找到的最可靠的方法。

示例 2 - 按范圍內的顏色求和或計數。

由於這是用戶定義的函數,您可能需要按 F9 來更新它,因為 Excel 通常不會自動計算。

Excel 甘特日歷圖表
代碼檢查引用范圍內與其單元格顏色匹配的實例,並基於此返回總和或計數。幾年前,我使用類似的東西來跟蹤 Excel 日歷中的假期。同樣,這在性能等方面可能不是那么有效,但可能對某個地方的某個人有用,特別是像上面的示例這樣的原型或更簡單的表格,其中只有少數幾個單元。

Function GetColourSum(MyRange As Range, Optional FontOrBG As Boolean) As Double
Dim MyColour As Long
MyColour = Application.ThisCell.Interior.Color
Dim MyCell As Range
If IsMissing(FontOrBG) Then FontOrBG = False
For Each MyCell In MyRange
If FontOrBG = False And MyCell.Interior.Color = MyColour And IsNumeric(MyCell.Value) Then
GetColourSum = GetColourSum + CDbl(MyCell.Value)
End If
If FontOrBG And MyCell.Font.Color = MyColour And IsNumeric(MyCell.Value) Then
GetColourSum = GetColourSum + CDbl(MyCell.Value)
End If
Next MyCell
End Function
Function GetColourCount(MyRange As Range, Optional FontOrBG As Boolean) As Long
Dim MyColour As Long
MyColour = Application.ThisCell.Interior.Color
Dim MyCell As Range
If IsMissing(FontOrBG) Then FontOrBG = False
Debug.Print "FontOrBG IS : " & FontOrBG
For Each MyCell In MyRange
If FontOrBG = False And MyCell.Interior.Color = MyColour Then
GetColourCount = GetColourCount + 1
End If

If FontOrBG And MyCell.Font.Color = MyColour Then
GetColourCount = GetColourCount + 1
End If
Next MyCell
End Function


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM