C#ATIA

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

Select Case True

覚書です。

'vba
Select Case True

知った際に結構衝撃的だったのですが、先にTrueを条件にしてしまい
イロイロと異なる条件を元に判断してしまうのに利用しています。
(雰囲気的にYesマンみたいなイメージです)

この記法は結構独特なのかと思っていたのですが、
C,C++,Java,Js等の switch(true) みたいな書き方はありそうです。
確かC#では確か出来なかったですし、Pythonではそもそも
switch、select case の様な条件分岐が無いです。

まぁ、賛否は両論ですね。
switch(true) イディオム考察 - Qiita
自分は switch(true) イディオムを使ってなぜクソコードを書くのか - Qiita



Drawのビューがロックされているか? を判断したい時に上手く
判断出来なかったです。

'vba DrawingDocumentをアクティブにして下さい
Option Explicit

Sub CATMain()
    
    Dim sel As Variant
    Set sel = CATIA.ActiveDocument.selection
    
    Dim msg As String
    msg = "ビューを選択してください"
    
    sel.Clear
    Select Case sel.SelectElement2(Array("DrawingView"), msg, False)
        Case "Cancel", "Undo", "Redo"
            Exit Sub
    End Select
    
    Dim vi As DrawingView
    Set vi = sel.Item(1).Value
    
    Dim res As Boolean
    
    '正統派
    msg = "IF : "
    If vi.LockStatus Then
        Debug.Print msg & "Lock"
    Else
        Debug.Print msg & "UnLock"
    End If
    
    'こだわり派
    msg = "IIF : "
    msg = msg & IIf(vi.LockStatus, "Lock", "UnLock")
    Debug.Print msg
    
    '邪道派
    msg = "SELECT CASE : "
    Select Case True
        Case vi.LockStatus
            Debug.Print msg & "Lock"
        Case Else
            Debug.Print msg & "UnLock"
    End Select
End Sub

Drawをアクティブにし、ロックされていないビューを選択すると

IF : UnLock
IIF : UnLock
SELECT CASE : UnLock

でOKなんですが、ロックされているビューを選択すると

IF : Lock
IIF : Lock
SELECT CASE : UnLock

"Select Case True" だけが上手く判断出来ていないんです。
理由はわからないのですが、上手く行かないので避けておかなきゃ・・・。

ビューの場合、ロックされていなくて、参照ビューをもっていなくて、
分離されていなくて・・・ の様に異なるプロパティを単純にクリアした
ものだけ処理したい場合は、

ELSE IF → ネストが深くなってイヤ(Excelの複雑な式みたいになると混乱する)
IFのOR → 1行長い
IIF → 条件内が長くなりIFと変わらない
フラグ立てる → 一度しか使わない変数を作りたくない

とイロイロ方法が有りそうなのですが、
クリアしなかった条件によって ”〇〇の条件が不足しています”
と警告したい場合に一番清楚に書けるのが "Select Case True" かな?
と思い、ここ数年は好んで使用していますがどうでしょう?
(今回は上手くいかなかったのですが)