SUMIF関数で非表示のレコードを無視したい ①

本日、このような相談を受けた。
「SUMIF関数で合計を求めているのだが、絞り込みで非表示になったレコードは無視したい」
早速挑戦だ。
f:id:Infoment:20190529220908p:plain
※Canvaでキーワード「サム」で検索したら出てきたのだが・・・誰だろう?

相談があった表は、こんなイメージだ。
f:id:Infoment:20190529221839p:plain

販売月別に、各果物の売り上げがまとめられている。
さらに、理由は定かでないが、ピボットテーブルは用いず、このような表で「SUMIFによる集計」が行われていた。
f:id:Infoment:20190529221959p:plain

今回、表の作りは本題ではないため、不問とする。
この表に於いて、例えば4月のみ表示させてみる。
f:id:Infoment:20190529222132p:plain

このとき、集計した表の販売合計も、追従して表示中の金額のみを合計したいとのことだった。
↓ 追従していない状態。合計金額が、絞り込み前と変わっていない。
f:id:Infoment:20190529222325p:plain

この問題について、ネットで色々調べてみたところ、SUMPRODUCT関数との組み合わせで「表示・非表示状態を取得する」などの合わせ技が、多数紹介されていた。
そこで、関数で解決する方法についてはそちらにお任せするとして、マクロで解決したらどうなるか、考えてみた。

といっても、非表示であれば足し算しないという、実に単純な方法だ。

Function SumIf_OnlyNotHidden(target_range As Range, _
                             search_condition As Variant, _
                             total_range As Range) As Long

    If target_range.Columns.Count > 1 Then Exit Function
    If total_range.Columns.Count > 1 Then Exit Function

    Dim ⊿C As Long
        ⊿C = total_range.Column - target_range.Column

    Dim TempSum As Long
    Dim r As Range
        For Each r In target_range
            On Error Resume Next
            If r.Value = search_condition Then
                If r.EntireRow.Hidden = False Then
                    TempSum = TempSum + r.Offset(, ⊿C).Value
                End If
            End If
        Next
    SumIf_OnlyNotHidden = TempSum
End Function

f:id:Infoment:20190529223011g:plain

今回は、千行にも満たない小~中規模の表だったため、特に問題なく動いてくれた。従って、レコード数が数十万に及んだ場合はどうなるか、などの検証は行っていない。

とりあえず、こんな方法もあるよ、という紹介ってことで。

参考まで。