【SolidWorks API】Rebuild Errorを制する者は自動化を制す:堅牢なエラーハンドリングの極意
SolidWorksの自動化において、最もエンジニアを絶望させるのは「途中で止まるスクリプト」だ。
特にフィーチャ生成やジオメトリ操作において、`SelectionManager`のマークエラーや再構築失敗(Rebuild Error)を放置したコードは、もはや「自動化ツール」ではなく「ただの爆弾」である。
今回は、伝説的なプロジェクトをいくつも渡り歩いてきた私の視点から、「なぜあなたのコードは落ちるのか」、そして「どう設計すれば業務で耐えうる堅牢なツールになるのか」を解き明かす。
—
1. なぜ「If Err.Number 0」だけでは足りないのか
VBA初心者が陥る最大の罠は、エラーを単にキャッチすることに満足することだ。SolidWorks APIの恐ろしい点は、「APIの戻り値は成功(True)を返しているのに、内部的にはフィーチャが警告状態(黄色いアイコン)になっている」という状況が頻発することである。
これを防ぐためには、以下の3階層のエラー監視設計が必須となる。
1. API戻り値チェック: `SelectByID2`や`InsertFeature`の戻り値を即座に評価する。
2. フィーチャ状態監視: `IFeature::GetErrorCode`を用いて、対象フィーチャが健全かを確認する。
3. 再構築の強制: `IModelDocExtension::Rebuild`後のステータスを確実に把握する。
—
2. 実務で使える堅牢な例外処理テンプレート
以下のコードは、フィーチャ操作を行う際の標準的な「防弾設計」である。単にエラーを止めるだけでなく、「どのフィーチャで、なぜ失敗したか」を特定するためのログ出力機能を組み込んでいる。
‘ — プロダクションレベルのフィーチャ生成・操作テンプレート —
Public Sub CreateFeatureRobustly(swApp As Object, swModel As Object, featureName As String)
Dim swFeature As Object
Dim featStatus As Long
On Error GoTo ErrorHandler
‘ 1. 操作実行
‘ ここでは例としてフィーチャを選択する操作を想定
Dim boolStatus As Boolean
boolStatus = swModel.Extension.SelectByID2(featureName, “BODYFEATURE”, 0, 0, 0, False, 0, Nothing, 0)
‘ Selection Mark Errorの検知
If boolStatus = False Then
Err.Raise vbObjectError + 1001, “SolidWorksAutomation”, “フィーチャの選択に失敗: ” & featureName
End If
‘ 2. フィーチャの状態を確認(Rebuild Error監視)
Set swFeature = swModel.FeatureManager.FeatureByName(featureName)
If Not swFeature Is Nothing Then
featStatus = swFeature.GetErrorCode
If featStatus <> 0 Then
‘ 0以外は警告またはエラー(swFeatureErrorCode_eを確認のこと)
LogToSystem “警告: フィーチャ [” & featureName & “] に再構築エラーが発生。コード: ” & featStatus
End If
End If
Exit Sub
ErrorHandler:
‘ ログファイルへの記録と開発者への通知
MsgBox “致命的なエラー発生: ” & Err.Description, vbCritical
Debug.Print “エラー発生箇所: ” & Err.Source & ” / 内容: ” & Err.Description
‘ ここでログファイル書き込み処理などを呼び出す
Resume Next ‘ 処理を継続するか、Exit Subで抜けるかは要件次第
End Sub
Private Sub LogToSystem(msg As String)
‘ データベースやテキストファイルへエラーを蓄積する共通関数
Dim fNum As Integer
fNum = FreeFile
Open “C:\Temp\SW_Automation_Log.txt” For Append As #fNum
Print #fNum, Now & ” : ” & msg
Close #fNum
End Sub
—
3. 開発現場で生き残るための「3つの鉄則」
① ステート(状態)を信じるな
SolidWorksのドキュメントを開いた直後や、大規模なアセンブリ操作の直後は、APIが「準備中」であることが多い。`DoEvents`を安易に使うのは素人だ。`IModelDocExtension::Rebuild`を適切に実行し、`swModel.GetPathName`でファイルハンドルが生きているかを確認し続けるのが、プロのエンジニアの流儀である。
② データベース連携時のトランザクション管理
もしあなたがExcelやSQL Serverと連携してフィーチャを生成しているなら、「APIが失敗した瞬間にデータベースのフラグを更新する」こと。これを忘れると、翌朝に「中途半端なモデル」と「更新済みのデータベース」という最悪の不整合が発生する。
③ クリーンアップの徹底
`Set swApp = Nothing` や `Set swModel = Nothing` を忘れることは、メモリリークだけでなく、SolidWorksのプロセスがバックグラウンドに残り続ける原因になる。`On Error`で飛ばす場合でも、`Finally`的な構造(`GoTo Cleanup`)でオブジェクトの解放を必ず行うこと。
—
結びに代えて
「エラーが起きないようにコードを書く」のは限界がある。
本当に優秀なエンジニアは、「エラーが起きることを前提に、その後のリカバリパスを完璧に設計する」。
今回のテンプレートは、あなたの自動化ツールを「動けばラッキーなスクリプト」から「現場で信頼される堅牢なエンジン」へと昇華させるための第一歩だ。次は、`swApp.ActiveDoc.Extension.GetLastFeatureError`を駆使した、より詳細なエラー解析に挑戦してほしい。
技術は裏切らない。コードの質が、あなたのエンジニアとしての価値を決めるのだから。
