前の記事の関数を少し拡張します。
拡張1
今のままでは、入力が数値配列だけなので、Rangeを利用できるように、構文を拡張します。
(B1:C4) [[1 1][3 2][4 3][5 4]]
(A2) =P("R_B1:C4","合計") [23]
テーブルの場合は、テーブル名で指定できます。
(T2_) [[1 1][3 2][4 3][5 4]]
(A3) =P("R_T2_","合計") [23]
拡張2
計算の途中経過を参照できるように、関数の引数に指定できるようにします。
(A3) =P("R_B1:C4","合計_0") [23]
実装
Function P(ParamArray F())
On Error Resume Next
Dim M: M = UBound(F)
Dim A: ReDim A(M)
Dim I: For I = 0 To M
Dim S: S = ""
Select Case TypeName(F(I))
Case "String"
Dim D: D = Trim(F(I))
Select Case True
Case D Like "V_*": S = V_(D)
Case D Like "R_*": S = R_(D)
Case Else
If D Like "*_#*" Then
Dim J: J = V_(Right(D, Len(D) - InStr(D, "_")), ",")
D = Left(D, InStr(D, "_") - 1)
Select Case UBound(J)
Case 0: S = E(Application.Run(D, A(J(0))))
Case 1: S = E(Application.Run(D, A(J(0)), A(J(1))))
Case 2: S = E(Application.Run(D, A(J(0)), A(J(1)), A(J(2))))
Case Else: S = ""
End Select
Else
S = E(Application.Run(D, IFC(I > 0, A(I - 1))))
End If
End Select
Case "Range"
S = F(I)
Case Else
' 未実装
End Select
A(I) = S
Next I
P = S
End Function
Function R_(D, Optional S = "")
If D Like "R_*" Then D = Right(D, Len(D) - 2)
R_ = Range(D)
End Function