色を指定したら、その色が使われていないセルも返せる関数

昨日は、こんなものを作ってみた。
infoment.hatenablog.com

作ってみて、思った。このままでは
「とにかく色が付いているセル」
のような選び方ができないぞ。さて、どうしたものか。
f:id:Infoment:20200421225709p:plain

ということで、PCの前で悩むこと5分。思いついたのがこれ。

色を指定したら、その色が使われていないセルも返せればよい?

そこで昨日のものを、以下のように変更してみた。

Public Function GetColorRange(color_constant As Double, _
                     Optional exclusion_flag As Boolean = False) As Range
    ' 行番号のループ変数。
    Dim r As Long
    ' 列番号のループ変数。
    Dim c As Long
    ' 特定色のセル。
    Dim myRng As Range
    
        With TargetRange
            For r = 1 To .Rows.Count
                For c = 1 To .Columns.Count
                    If (ColorInfoArray(r, c) <> color_constant) = exclusion_flag Then
                        If myRng Is Nothing Then
                            Set myRng = .Cells(r, c)
                        Else
                            Set myRng = Union(myRng, .Cells(r, c))
                        End If
                    End If
                Next
            Next
        End With
        
        Set GetColorRange = myRng
End Function

変えたのは2か所のみ。
一つ目は、除外フラグ(exclusion_flag)の追加。
普段は指定した色の範囲を取得したいので、初期値はFalseとした。

Public Function GetColorRange(color_constant As Double, _
                     Optional exclusion_flag As Boolean = False) As Range

二つ目は、指定した色とセルの色が一致するかを判別する箇所。

If (ColorInfoArray(r, c) <> color_constant) = exclusion_flag Then

少々ややこしいが、

  • 「指定色と一致しない」が正しいならば、指定色以外を返す。
  • 「指定色と一致しない」が正しくないならば、指定色を返す。

ということで、強引に条件分岐の数を減らしてみた。

↓ それでは、こちらで試してみよう。
f:id:Infoment:20200421225333p:plain

Sub Sample()
    With New ColorInfo
        .GetColorRange(256 ^ 3 - 1, True).Select
    End With
End Sub

結果、意図した動作を実現できた。
f:id:Infoment:20200421225517g:plain

しかしこれは、分かり難いことこの上ない。
もう少し、何とかならないものか。

ということで、明日に続く(かも。或いは、断念するかも)。

参考まで。