ちょっと複雑な条件分岐を、どうやったら清楚に書けるものか
悩んでます。
言葉だけでは伝わらないので、直ぐに思い付いたコードがこちらです。
'vba Sub Branch_Test() Dim NaN& '他言語のNaN代わり NaN = -100: Dim Piyo& '条件1 Piyo = 2 Dim Huga& '条件2 Huga = 3 Dim Res '結果 Dim i Dim Hoge '調べたいもの Hoge = Array(2, 3, 6, 7, 9, -4, -6, -9) For i = 0 To UBound(Hoge) Res = NaN If Hoge(i) > 0 Then If (Hoge(i) Mod Piyo) = 0 Then Res = Piyo Else If (Hoge(i) Mod Huga) = 0 Then Res = Huga End If End If Else If (Hoge(i) Mod Huga) = 0 Then Res = Huga End If End If If Res = NaN Then Debug.Print "条件を満たしていません(" & Hoge(i) & ")" Else Debug.Print Hoge(i) & " は " & Res & " で割り切れます" End If Debug.Print Next End Sub
良い例が思いつかなかったのですが、配列 Hoge が調査対象になります。
ルールとしては
A) 0以上である事。但し例外有り
B) 条件1(Piyo)を満たしていれば、結果とする
C) 条件2(Huga)を満たしていれば、結果とする
D) 条件1・2両方を満たしていれば、条件1の結果とする
E) 条件2を満たしていれば、A)を満たしていなくても、結果とする
実は E) のルールが非常に邪魔で、条件の強さを不等号で一列に表現できません。
その為、IF文がネストし異なる部分に
If (Hoge(i) Mod Huga) = 0 Then Res = Huga End If
と、全く同じ処理が2ヶ所に書かれています。腹が立つ・・・。
一応結果としては、
2 は 2 で割り切れます 3 は 3 で割り切れます 6 は 2 で割り切れます 条件を満たしていません(7) 9 は 3 で割り切れます 条件を満たしていません(-4) -6 は 3 で割り切れます -9 は 3 で割り切れます
「6」に関しては、最小公倍数なのですが、ルール D) が適応されています。
「-6」「-9」はルール A)を満たしていないのですが、E) が適応されています。
上記コードをVBA独特の 「Select Case True」 を利用し、この様に
修正してみました。
'vba Sub Branch_Test2() Dim NaN& '他言語のNaN代わり NaN = -100: Dim Piyo& '条件1 Piyo = 2 Dim Huga& '条件2 Huga = 3 Dim Res '結果 Dim i Dim Hoge '調べたいもの Hoge = Array(2, 3, 6, 7, 9, -4, -6, -9) Dim Res_Na '最低条件の結果 Dim Res_Pi '条件1の結果 Dim Res_Hu '条件2の結果 For i = 0 To UBound(Hoge) Res = NaN Res_Na = (Hoge(i) > 0) Res_Pi = (Hoge(i) Mod Piyo) = 0 Res_Hu = (Hoge(i) Mod Huga) = 0 Select Case True Case Res_Pi Eqv Res_Na If Res_Pi Then Res = Piyo End If Case Res_Hu Res = Huga End Select If Res = NaN Then Debug.Print "条件を満たしていません(" & Hoge(i) & ")" Else Debug.Print Hoge(i) & " は " & Res & " で割り切れます" End If Debug.Print Next End Sub
論理演算子 Eqv なんて初めて使いました。
実行結果はこちら
2 は 2 で割り切れます 3 は 3 で割り切れます 6 は 2 で割り切れます 条件を満たしていません(7) 9 は 3 で割り切れます 条件を満たしていません(-4) -6 は 3 で割り切れます 条件を満たしていません(-9)
最初は上手く行ったと思ったのですが、
「-9」はルール E) が適応されていないので正しくない結果となりました。
・・・ Select Case True Case Res_Hu Xor Res_Na Res = Huga Case Res_Pi Eqv Res_Na If Res_Pi Then Res = Piyo End If Case Res_Hu Res = Huga End Select ・・・
としても、「7」が正しくない結果に・・・。
条件が複雑なので、清楚に書きにくいのは何となく感じるのですが
どの様なキーワードで検索して良いのかもわからず・・・。
良いアイデアありませんかね?