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
以上