【VBA】Excelの色付きセルのみ計算するカスタム関数を作ってみた

VBA

こんにちは、kazuです。
本日はExcelで色付きセルのみ計算する関数を自作したので、記事にしようと思います。

カスタム関数とは?

一般的にセルに( =SUM(A1:A3) ) とか入れますよね?
これがデフォルトからある関数です。
そしてカスタム関数というのはVBAで自分でプログラムを組んでセルに
一般的な関数と同じような使い方をするものをカスタム関数といいます。

要件を見ていこう!

関数の要件を書いていきましょう!
1. 関数名はcolorSUMにするつまり指定する時は =colorSUM(color,cell) を入力する
2. 第1引数は文字列の色を指定すること、第2引数はセルを指定すること(例:=colorSUM(“red”,A1:A7))
3. 指定できる色は以下の表とする
4. 第1引数を誤った文字列がある場合はメッセージダイアログを表示する

RGB カラーコード color引数(第1引数) RGB カラーコード color引数(第1引数)
黒色 RGB(0,0,0) #000000 black 茶色 RGB(128,0,0) #800000 maroon
白色 RGB(255,255,255) #ffffff white 緑色 RGB(0,128,0) #008000 green
赤色 RGB(255,0,0) #ff0000 red 紺色 RGB(0,0,128) #000080 navy
黄緑色 RGB(0,255,0) #00ff00 lime オリーブ色 RGB(128,128,0) #808000 olive
青色 RGB(0,0,255) #0000ff blue 紫色 RGB(128,0,128) #800080 purple
黄色 RGB(255,255,0) #ffff00 yellow 青緑色 RGB(0,128,128) #008080 teal
ピンク色 RGB(255,0,255) #ff00ff pink 銀色 RGB(192,192,192) #c0c0c0 silver
水色 RGB(0,255,255) #00ffff aqua 灰色 RGB(128,128,128) #800080 gray

ちなみに以下が実際使っている時の画像になります。

実際にコードを見てみよう!

では実際にVBAコードを見てみましょう!

' 標準モジュールに記載

Function colorSUM(color As Variant, selectRange As range) As Double
    Dim colorRange As range
    Dim total As Double
    Dim colorIdx As Integer
    Application.Volatile
    colorIdx = colorJudgement(CStr(color))
    
    If colorIdx = 0 Then
        MsgBox "第一引数が誤っています。再度ご確認お願いします。", vbOKOnly + vbCritical
    Else
        For Each colorRange In selectRange
            ' 特定の色のみ条件に入るようにする
            If colorRange.Interior.colorIndex = colorIdx Then
                total = total + colorRange.Value
            End If
        Next colorRange
        colorSUM = total
    End If
End Function

Private Function colorJudgement(color As String) As Integer
    Dim colorDic As Object
    Set colorDic = CreateObject("Scripting.Dictionary")
    ' 黒色 RGB(0,0,0) #000000
    colorDic.Add "black", 1
    ' 白色 RGB(255,255,255) #ffffff
    colorDic.Add "white", 2
    ' 赤色 RGB(255,0,0) #ff0000
    colorDic.Add "red", 3
    ' 黄緑色 RGB(0,255,0) #00ff00
    colorDic.Add "lime", 4
    ' 青色 RGB(0,0,255) #0000ff
    colorDic.Add "blue", 5
    ' 黄色 RGB(255,255,0) #ffff00
    colorDic.Add "yellow", 6
    ' ピンク色 RGB(255,0,255) #ff00ff
    colorDic.Add "pink", 7
    ' 水色 RGB(0,255,255) #00ffff
    colorDic.Add "aqua", 8
    ' 茶色 RGB(128,0,0) #800000
    colorDic.Add "maroon", 9
    ' 緑色 RGB(0,128,0) #008000
    colorDic.Add "green", 10
    ' 紺色 RGB(0,0,128) #000080
    colorDic.Add "navy", 11
    ' オリーブ色 RGB(128,128,0) #808000
    colorDic.Add "olive", 12
    ' 紫色 RGB(128,0,128) #800080
    colorDic.Add "purple", 13
    ' 青緑色 RGB(0,128,128) #008080
    colorDic.Add "teal", 14
    ' 銀色 RGB(192,192,192) #c0c0c0
    colorDic.Add "silver", 15
    ' 灰色 RGB(128,128,128) #800080
    colorDic.Add "gray", 16

    If colorDic.Exists(color) Then
        colorJudgement = colorDic.Item(color)
    Else
        colorJudgement = 0
    End If
End Function

簡単にカラー判定を解説すると引数の文字列を渡してさらにcolorJudgement(color As String)に引数を渡します。そしてkey(色の文字列),value(colorIndex)を設定してあるので、引数の文字列と設定しているkeyの存在チェックをして存在していたらそのkeyからvalue(colorIndex(Integer型))を取得そして戻り値として返すメソッドです。
その先はcolorIndexに設定した条件のみ計算されるという仕組みです。ちなみにどの色にも一致しない場合は0を返して0だった場合ダイアログ表示するというような感じにしています。

最後に

いかがでしたでしょうか?
今回エクセルで関数を作ってみました。
あ、最後に一つ補足です。カスタム関数はすべてのExcelで使えるようにできます。
それはExcelアドイン(*.xlam)で保存してください。
これですべてのExcelファイルでカスタム関数が使えるようになります。
最後までご覧いただきありがとうございました。