使用済み範囲のみ計算する-TIPS

短大職員関係ないじゃん、って感じになってしまってますが、またVBAネタです。

例えば、入力された成績の中から合格者だけ数えるユーザ定義関数CountPass*1を作りたいとします。

A B C
氏名 成績 合格者数
豊田 60 =CountPass(B:B)
本田 55
鈴木 68
富士 75
日野 90

上図のように
=CountPass(B:B)っていう感じに列ごと指定できれば、データが増えても安心ですね。
ところが、再計算のたびに65535行分の計算を繰り返すようでは、計算速度が心配になります。

そこで、

Intersect(Range,Range,,,,) AS Range

を使用して、与えられたセル範囲と、ワークシートのUsedRangeとの共通部分をとってやることで、明らかにデータの無い部分を除いてやることができます。

Sampleコードは以下

'与えられたセル範囲のうち使用済みセル範囲のみ返す関数
Private Function GetUsedRange(Target As Range) AS Range
    Set GetUsedRange = Intersect(Target, Target.Worksheet.UsedRange)
End Function
'60点合格として合格者を数える関数本体
Public Function CountPass(ScoreRange As Range) As Long

    'ここで明らかにデータの無い部分を計算範囲から除く
    Set ScoreRange = GetUsedRange(ScoreRange)

    Dim Counter As Long
    Counter = 0
   
    Dim Scores
    Scores = ScoreRange.Value
    Dim s
    For Each s In Scores
        If IsNumeric(s) Then
            If 60 <= s And s <= 100 Then
                Counter = Counter + 1
            End If
        End If
        
    Next
    CountPass = Counter
End Function

*1:実際にはこの例だと関数を作るまでも無く普通の数式で処理できてしまいますが