For Each と VBScript.RegExp と 可変長引数と (VBA)
VBA 嫌い。
でも、使わざるを得なくなることもあるので、たまにはトレーニング。
コード
Function sum_item_person(ParamArray args() As Variant) Set re = CreateObject("VBScript.RegExp") re.Pattern = "(\d+)件/(\d+)人" re.Global = True item = 0 person = 0 For Each r In args For Each c In r Set remat = re.Execute(c.Value) If remat.Count > 0 Then item = item + remat(0).SubMatches(0) person = person + remat(0).SubMatches(1) end if Next c Next r sum_item_person = CStr(item) & "件/" & CStr(person) & "人" End Function
ポイント
標準で用意されている関数は Range を複数指定できるので、自作関数でも Range を引数にとる関数は、とりあえず可変長引数にしておくのが良さげ。
お題にもある「小計」があるような表は、総合計を求めるときには、とびとびのセル範囲を指定したい。
VBA には RegExp オブジェクトが無い。
だから、VBScript の RegExp を使う。
「InStr で探して、Mid で切り出す」で頑張るのでは、可読性が悪いのでミスを紛れ込ませやすい。
Range は、列方向とか、行方向があるので、自分の位置が重要ではないのであれば For Each を使う。
BASIC なので、つい i とか j で回しちゃう。