LoginSignup
0
0

More than 5 years have passed since last update.

Excelで筆算的プログラミング(2)

Last updated at Posted at 2018-07-15

前の記事の関数を少し拡張します。

拡張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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0