SUMIF関数で非表示のレコードを無視したい ② FINDの応用
先日、SUMIF関数で非表示のレコードを無視する方法について考えてみた。
infoment.hatenablog.com
方法としては単純で、
「条件に合致するが非表示の場合、合計に加算しない」
を愚直に繰り返すだけ。
すると、空腹おやじさんから「都度非表示判定を行うのではなく、指定範囲を最初から可視セルに絞ってみてはどうか」との助言をいただけた。そこで今回は、これについて挑戦する。
どうしたものかと、色々と試している内に、偶然気が付いた。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
結果はこちら。
ここまでは、何とか想定どおり。だが、思ったよりこれに時間を使ってしまった。
明日に続きます。
参考まで。