それ、うまいのか?

... 記憶の残滓

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

ポイント

  • 可変長引数を実現する ParamArray
  • VBSript の正規表現オブジェクトを使った文字の切り出し
  • For Each による Range のイテレーション

標準で用意されている関数は Range を複数指定できるので、自作関数でも Range を引数にとる関数は、とりあえず可変長引数にしておくのが良さげ。
お題にもある「小計」があるような表は、総合計を求めるときには、とびとびのセル範囲を指定したい。

VBA には RegExp オブジェクトが無い。
だから、VBScriptRegExp を使う。
「InStr で探して、Mid で切り出す」で頑張るのでは、可読性が悪いのでミスを紛れ込ませやすい。

Range は、列方向とか、行方向があるので、自分の位置が重要ではないのであれば For Each を使う。
BASIC なので、つい i とか j で回しちゃう。