SUMIF関数で非表示のレコードを無視したい ② FINDの応用

先日、SUMIF関数で非表示のレコードを無視する方法について考えてみた。
infoment.hatenablog.com
方法としては単純で、
「条件に合致するが非表示の場合、合計に加算しない」
を愚直に繰り返すだけ。

すると、空腹おやじさんから「都度非表示判定を行うのではなく、指定範囲を最初から可視セルに絞ってみてはどうか」との助言をいただけた。そこで今回は、これについて挑戦する。
f:id:Infoment:20190601224425p:plain

どうしたものかと、色々と試している内に、偶然気が付いた。Findメソッドは、非表示セルを検索から除外しているのでは?調べてみると、どうやらそのようだ。
www.officetanaka.net

そこでまず、「指定範囲内を検索し、該当する全てのセルを戻り値とする関数」を作成することにした。
もともと、私が所属する部門の人が作った関数だが、そのまま転載すると著作権の問題が発生する。従って今回は、同仕様の関数を一から作成してみた。

Function FindAll(target_range As Range, _
                 faWhat As String, _
        Optional faLookIn As Excel.XlFindLookIn = xlValues, _
        Optional faLookAt As Excel.XlLookAt = xlPart, _
        Optional faMatchCase As Boolean = False, _
        Optional faMatchByte As Boolean = False) As Range

    Dim FindCell As Range
    Dim FoundCell As Range
    Dim TempRange As Range
    
    '対象を全て選択するため、検索の開始位置や向きなどは指定していない。
    Set FindCell = target_range.Find(faWhat, _
                                     , _
                                     faLookIn, _
                                     faLookAt, _
                                     , _
                                     , _
                                     faMatchCase, _
                                     faMatchByte)
    
        If FindCell Is Nothing Then
            Exit Function
        Else
            Set FoundCell = FindCell
            Set TempRange = FindCell
        End If
        
        Do
            Set FindCell = target_range.Find(faWhat, FindCell)
            If FindCell.Address = FoundCell.Address Then
                Exit Do
            Else
                Set TempRange = Union(TempRange, FindCell)
            End If
        Loop

    Set FindAll = TempRange
End Function

テスト用マクロがこちら。

Sub test()
    FindAll(Selection, "りんご").Select    
End Sub

結果はこちら。
f:id:Infoment:20190601230409g:plain

ここまでは、何とか想定どおり。だが、思ったよりこれに時間を使ってしまった。

明日に続きます。

参考まで。