C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

複雑な条件分岐を、出来るだけ清楚に書きたい

ちょっと複雑な条件分岐を、どうやったら清楚に書けるものか
悩んでます。

言葉だけでは伝わらないので、直ぐに思い付いたコードがこちらです。

'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」が正しくない結果に・・・。

条件が複雑なので、清楚に書きにくいのは何となく感じるのですが
どの様なキーワードで検索して良いのかもわからず・・・。

良いアイデアありませんかね?