短大職員関係ないじゃん、って感じになってしまってますが、また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:実際にはこの例だと関数を作るまでも無く普通の数式で処理できてしまいますが