その他

VBA、FONT.ColorIndex、Interior.ColorIndexで色付けすると違う色になる件について[No29]

スポンサーリンク

自宅でいつものようにプログラムを作成していると、色付けを行う処理で、思っていた色とは違う色が設定されたことに気付きました。これはおかしいと思い調査を行ったので、本記事ではその調査について紹介をします。

結論

先に結論を書きます。2020/04/21現在では、Excelの色付け(FONT.ColorIndex、Interior.ColorIndex)は不具合が起きているようで、正常に色の設定ができない様子でした。不具合を確認できなかった色付け処理は、FONT.Color、Interior.Colorでの処理でした。まとめると次のようになります。

  • 文字に色を付ける時は、.FONT.Colorを使うと良い。
    例:.Cells(1,1).FONT.Color または .Range("A1").FONT.Color
  • セルの背景(文字の背景)に色を付ける時は、.Interior.Colorを使うと良い。
    例:.Cells(1,1).Interior.Color または .Range("A1").Interior.Color
  • 文字に色を付ける.FONT.ColorIndexは、一部正常に色が付かない不具合がある様子が見られる。
    例:.Cells(1,1).FONT.ColorIndex または .Range("A1").FONT.ColorIndex
  • セルの背景(文字の背景)は、一部正常に色が付かない不具合がある様子が見られるが、.Interior.ColorIndexを使うと良い。
    例:.Cells(1,1).Interior.ColorIndex または .Range("A1").Interior.ColorIndex

環境

今回、私が調査を行った際のPC環境は以下の通りです。

  • Windows 10 Home(バージョン:1909、OSビルド:18363.778)
  • Excel(Microsoft Office ProPlus)

スポンサーリンク

行った調査

今回の調査はプログラムを作成して実施しました。まずはこちらをご覧下さい。

こちらはExcelのスクリーンショットです。プログラムは、それぞれの表の「文字名」列に設定されている色の値を.Colorまたは.ColorIndexで取得して、取得した値を基に、「設定(Color)」列、「設定(ColorIndex)」列に色付け処理を行う流れとなっています。なお、各行の色はエクセルのツールバーの色であり、ツールバーの左から右へ設定しています。

プログラム処理をかけると、下の画像のようになります。

もうお気付きになった方もおられると思いますが、見ての通り「文字色」列と「設定(Color)」列の色は同色です。一方、「文字色」列と「設定(ColorIndex)」列の色が違っており、番号「4-0」の「ブルーグレー、テキスト 2」はColorIndexで色付けすると、緑っぽい色になってしまいます。あと、「青、アクセント 1」も本来の色より濃くなってしまいます。

スポンサーリンク

実行プログラム

文字色の調査は、次の画像のプログラムで実施しました。

共通の関数

共通する関数は下の画像でご確認下さい。


Function GetRGB(ByVal ColorIndex As Long) As Object
    myDic.RemoveAll

    Dim Red As Long: Red = ColorIndex Mod 256
    myDic.Add "Red", Red

    Dim Green As Long: Green = Int(ColorIndex / 256) Mod 256
    myDic.Add "Green", Green

    Dim Blue: Blue = Int(ColorIndex / 256 / 256)
    myDic.Add "Blue", Blue
    
    Set GetRGB = myDic
End Function

文字色の関数

実行する前にシートの初期設定が必要です。
設定内容はシート「文字色」を追加し、表は「B2」から作成しましょう。


Option Explicit

Public myDic As Object

Sub checkColor_文字色FONT()
    Dim colorVar As Long
    Dim Color_R As Integer
    Dim Color_G As Integer
    Dim Color_B As Integer
    Set myDic = CreateObject("Scripting.Dictionary")

    Dim MAINSHEET As String
    MAINSHEET = "文字色"
    With Worksheets(MAINSHEET)
        Dim i As Integer
        For i = 3 To 73
            colorVar = .Range("E" & i).FONT.Color
            Set myDic = GetRGB(colorVar)
            Color_R = myDic.Item("Red")
            Color_G = myDic.Item("Green")
            Color_B = myDic.Item("Blue")
            
            .Range("F" & i) = colorVar & " = " & "R:" & Color_R & ", G:" & Color_G & ", B:" & Color_B
            .Range("G" & i).FONT.Color = colorVar
            
            colorVar = .Range("E" & i).FONT.ColorIndex
            .Range("H" & i) = colorVar
            .Range("I" & i).FONT.ColorIndex = colorVar
        Next i
    End With
End Sub

スポンサーリンク

背景色の関数

実行する前にシートの初期設定が必要です。
設定内容はシート「背景色」を追加し、表は「B2」から作成しましょう。


Option Explicit
Public myDic As Object

Sub checkColor_背景色Interior()

    Dim colorVar As Long

    Dim Color_R As Integer
    Dim Color_G As Integer
    Dim Color_B As Integer
    
    Set myDic = CreateObject("Scripting.Dictionary")

    Dim MAINSHEET As String
    MAINSHEET = "背景色"
    With Worksheets(MAINSHEET)
        Dim i As Integer
        For i = 3 To 73
            colorVar = .Range("E" & i).Interior.Color
            Set myDic = GetRGB(colorVar)
            Color_R = myDic.Item("Red")
            Color_G = myDic.Item("Green")
            Color_B = myDic.Item("Blue")
            .Range("F" & i) = colorVar & " = " & "R:" & Color_R & ", G:" & Color_G & ", B:" & Color_B
            .Range("G" & i).Interior.Color = colorVar

            colorVar = .Range("E" & i).Interior.ColorIndex
            .Range("H" & i) = colorVar
            .Range("I" & i).Interior.ColorIndex = colorVar
        Next i
    End With
End Sub

参考

以下の情報を参考にさせて頂きました。

VBAでオブジェクトを戻り値としてセットする方法。 - Qiita

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

-その他