【SolidWorks VBA】マクロが止まるのは「君のせい」じゃない。泥臭いリトライ処理こそが自動化の真髄だ
こんにちは。現場で「マクロが途中で止まって動かなくなった」という悲鳴を何度聞いたかわかりません。
SolidWorksを自動化していると、必ずぶち当たる壁があります。「APIは完璧に書いたはずなのに、なぜか選択エラーで止まる」「再構築(Rebuild)が間に合わずに処理がすり抜ける」。
マクロの記録から脱却しようとする皆さんが、最初に出会う「挫折の正体」です。でも安心してください。これは君のコードが悪いのではなく、SolidWorksという巨大なエンジンの「呼吸」に合わせていないだけなのです。
今日は、プロの現場で実際に使われている「泥臭いリトライ処理」の設計思想を伝授します。
—
1. なぜ、SolidWorksは「空振り」するのか?
SolidWorksのAPIは、Windows上の他のアプリケーションと比べて非常に繊細です。特にフィーチャの生成や選択において、以下の要因で簡単に「空振り」します。
- 描画の遅延: ジオメトリ生成後、メモリ上で計算が完了する前に次のコードが走ってしまう。
- 選択の不確定性: 選択したはずの面が、再構築によって一時的に消滅したりIDが変わったりする。
ここで初心者は `On Error Resume Next` を適当にコードの先頭に書いて、全てを隠蔽しようとします。これは禁じ手です。 バグを隠し、原因特定を不可能にする「死のレシピ」だからです。
—
2. プロの設計:スコープを絞った「局所的」エラーハンドリング
エラーハンドリングの鉄則は、「エラーが発生する可能性のある場所」を最小単位に絞り、そこでだけ監視を行うことです。
以下のコードを見てください。これが「泥臭くも確実に仕事を完遂する」ためのテンプレートです。
Public Sub SafeFeatureCreate()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim retryCount As Integer
Dim success As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
retryCount = 0
success = False
‘ 3回までは粘り強くリトライする設計
Do While retryCount < 3 And Not success
' 【重要】エラー監視の範囲をここに限定する
On Error Resume Next
' ジオメトリ操作のメイン処理
Call PerformComplexOperation(swModel)
' エラーが発生していなければ成功とみなす
If Err.Number = 0 Then
success = True
Else
' エラー発生時はログを残し、少し待機して再構築を促す
Debug.Print "リトライ中: " & retryCount + 1 & "回目"
Err.Clear ' 重要:エラー状態をリセットしないと次で誤検知する
swModel.EditRebuild3 ' モデルの再構築を強制
Sleep 1000 ' 1秒待機(APIの反映を待つ)
retryCount = retryCount + 1
End If
' 【重要】エラー監視を解除(これ以降は通常のデバッグができるようにする)
On Error GoTo 0
Loop
If Not success Then
MsgBox "何度トライしても失敗しました。モデルの構造を確認してください。"
End If
End Sub
このコードの「賢い」ポイント
1. On Error Resume Next の局所化: `On Error GoTo 0` で必ず監視を解除しています。こうすることで、関係ない場所でのバグを隠蔽しません。
2. Err.Clear の儀式: これを忘れると、最初のエラーがいつまでも残り続け、処理がループから抜け出せなくなります。
3. Sleep と Rebuild: SolidWorksが処理を追い付くための「呼吸の余白」を作っています。これがあるだけで、安定感が劇的に変わります。
—
3. なぜ「泥臭さ」が必要なのか
エンジニアリングの現場において、「100%成功するコード」は存在しません。 存在するなら、それはたまたまモデルが単純だっただけです。
「もし失敗したら、どうリカバリするか?」「どこまでなら許容して再試行するか?」というフォールバック(代替ルート)を設計することこそが、自動化エンジニアとしての腕の見せ所です。
- マクロの記録: 動作をなぞるだけ。
- プロのVBA: 失敗を予見し、失敗すらもシステムの一部として制御する。
—
最後に:君も「自動化の職人」になれる
「エラーが出ないように書く」のではなく、「エラーが出ても自力で立ち上がるコードを書く」。この視点を持つだけで、君が書くマクロの信頼性は数段跳ね上がります。
まずは、自分のコードの中で「一番不安定でよく止まる処理」を見つけ出し、そこにこのリトライ・パターンを組み込んでみてください。
「あれ、いつも止まってた場所をスルーして動いた!」という感動を味わえたなら、君はもう一段上のステージに上がった証拠です。
ここをクリアすれば、SolidWorks VBAの基本はもうバッチリ。自信を持って、次の複雑な自動化に挑戦してください。応援していますよ。
