LoginSignup
0
1

More than 5 years have passed since last update.

IFSを再定義して、ロジックを見易くする。

Last updated at Posted at 2018-05-27

if文の入れ子のロジックは醜いよね。

関数型プログラミングをする為に、条件文を使いたくなかったので、IFC を定義したのですが、
以前に書いたDI,MIの拡張関数 TMI,TDI をIFC で書くと以下のようになります。
複雑な条件文になると括弧の対応がうざいですね。

Function TDI(A, T, Optional S = "")
    Dim I: I = Right(A, 1)
    Dim J: J = Val(A)

    S = IFC(I = "A", DI(Range(RCC("T01N_", T)), J) _
      , IFC(I = "a", DI(Range(RCC("M01N_", T)), J)) _
      , IFC(I = "B", DI(Range(RCC("T02N_", T)), J)))
    TDI = S
End Function

Function TMI(R, Optional S = "")
    Dim , 機械, 番号, W
    Call DR(R, MM(R), , 機械, 番号, W)

    S = IFC(機械 = 1 And W = 0, CC(MLOT(Range("T01N_"), R), "A") _
      , IFC(機械 = 1, CC(MLOW(Range("M01N_"), R), "a") _
      , IFC(機械 = 2, CC(MLOT(Range("T02N_"), R), "B"))))
    TMI = S
End Function

Function IFC(C, V, Optional S = "")     ' IF C THEN V ELSE S
    If C Then IFC = V Else IFC = S
End Function

IFSの再定義

そこで、WorksheetFunction の IFS を VBS で再定義しました。

Function IFCS(ParamArray AR())
    Dim S: S = ""
    Dim I: For I = 0 To UBound(AR) Step 2
        If AR(I + 1) Then
            S = AR(I)
            Exit For
        End If
    Next I
    IFCS = S
End Function

条件式はperl流に後置きにしました。後置きの方が複雑な条件式を書き易く、見易いのです。

Function TDI(A, T, Optional S = "")
    Dim I: I = Right(A, 1)
    Dim J: J = Val(A)

    S = IFCS(DI(Range(RCC("T01N_", T)), J), I = "A" _
           , DI(Range(RCC("M01N_", T)), J), I = "a" _
           , DI(Range(RCC("T02N_", T)), J), I = "B")

    TDI = S
End Function

Function TMI(R, Optional S = "")
    Dim , 機械, 番号, W
    Call DR(R, MM(R), , 機械, 番号, W)

    S = IFCS(CC(MLOT(Range("T01N_"), R), "A"), 機械 = 1 And W = 0 _
           , CC(MLOW(Range("M01N_"), R), "a"), 機械 = 1 _
           , CC(MLOT(Range("T02N_"), R), "B"), 機械 = 2)

    TMI = S
End Function

以上

0
1
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
1