SolidWorks VBAの「泥沼」から脱却せよ:堅牢なリトライ処理を実装するアーキテクチャ設計
SolidWorks APIを扱うエンジニア諸君。君たちのコードは、なぜ「たまに」止まるのか?
「マクロが途中で停止した」「再構築(Rebuild)に失敗してモデルが壊れた」「選択したはずの面がないと怒られる」。これらの事象を単なる「運が悪かった」で片付けてはいけない。SolidWorksは非同期的な挙動や、API側の再描画タイミングのズレによって、極めて脆弱な不安定さを内包している。
今回は、安易な `On Error Resume Next` に依存せず、「障害を前提とした自己修復メカニズム」をコードに組み込むためのプロフェッショナルな知見を伝授する。
—
なぜ、安易な `On Error Resume Next` は「毒」なのか
多くの開発者が陥る過ちは、コードの冒頭に `On Error Resume Next` を書き、エラーを握りつぶすことだ。これでは、重大なバグ(オブジェクトの解放漏れや無効なポインタ参照)まで隠蔽され、デバッグ不能な「ゾンビコード」が完成する。
真に堅牢な設計とは、エラーのスコープを極限まで狭め、特定の失敗に対してのみ「リトライ」という救済措置を打つことにある。
—
現場で使える「リトライ付きフィーチャ生成」の設計思想
以下のコードは、フィーチャ作成時に頻発する「再構築失敗」を検知し、数秒の待機と再試行を行う実践的なパターンだ。
実装例:堅牢なフィーチャ生成・リトライラッパー
Option Explicit
‘ メイン処理:フィーチャ生成のラッパー
Public Sub SafeFeatureCreate()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim success As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 失敗を許容する最小単位の処理をリトライ関数へ委譲
success = RetryFeatureOperation(swModel, “MyExtrudeFeature”)
If Not success Then
MsgBox “リトライ回数の上限に達しました。モデルの状態を確認してください。”, vbCritical
End If
End Sub
‘ 特定の操作に対してリトライを試みる汎用関数
Private Function RetryFeatureOperation(model As Object, featureName As String) As Boolean
Dim retryCount As Integer
Dim maxRetries As Integer: maxRetries = 3
Dim isSuccess As Boolean: isSuccess = False
Do While retryCount < maxRetries And Not isSuccess On Error Resume Next ' 局所的なエラー監視 Err.Clear ' --- ここに不安定なAPI操作を記述 --- model.FeatureManager.FeatureExtrusion2 True, False, False, 0, 0, 0.05, 0.05, False, False, False, False, 0, 0, False, False, False, False, True, True, True ' エラーチェック If Err.Number = 0 Then ' 再構築を強制し、失敗していればエラーとみなす If model.EditRebuild3() = True Then isSuccess = True End If End If ' エラーハンドリングの終了 On Error GoTo 0 If Not isSuccess Then retryCount = retryCount + 1 ' 処理の重みを知る:待機時間を挟むことでSolidWorksの描画更新を待つ Sleep 1000 End If Loop RetryFeatureOperation = isSuccess End Function ' Windows APIによる正確な待機処理 If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) End If ---
プロフェッショナルが守るべき3つの鉄則
1. 「エラーを隠す」のではなく「エラーを予測する」
APIを叩く前に、そのオブジェクトが `Nothing` ではないか、フィーチャが再構築可能な状態か(`model.GetFirstFeature` 等で検証)、事前にチェックせよ。リトライは「失敗した後の最後の手段」であり、最初から頼るべきではない。
2. `Err.Clear` を忘れるな
`On Error Resume Next` を使用した後は、必ず `Err.Clear` を実行すること。これを怠ると、前の行で発生したエラーが後続の処理に伝播し、まったく関係のない箇所で原因不明の停止を引き起こす。
3. オブジェクトのライフサイクルを意識せよ
大規模なアセンブリや複雑なパーツにおいて、API操作の直後にファイルを保存したり、外部DBへ書き込んだりしてはならない。SolidWorksのメモリ管理とIOは非同期的に動いている。再構築後、`DoEvents` や `Sleep` を適切に挟み、SolidWorksが「落ち着く」時間を確保することが、バグのないツールを作るための秘訣だ。
—
結びに:なぜ我々は自動化するのか
君たちが書いているそのツールは、単なる省力化のためのスクリプトではない。設計者の思考の延長線上にあり、製品の品質を左右する「プロセスそのもの」だ。
「たまに止まる」を「常に動く」に変えるのは、数行の例外処理の差に過ぎない。しかし、その差こそが、アマチュアとプロフェッショナルの境界線だ。泥臭いリトライ処理を愛せ。それこそが、不安定なシステムを支配するための唯一の道である。
さあ、コードを書き直そう。君たちの手で、最高峰の自動化を実現するために。
