【実務・中級編】【エラーハンドリング】「モデルが再構築できませんでした」例外を検知して失敗理由を特定するログ出力設計 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

【エラーハンドリング】「モデルが再構築できませんでした」例外を検知して失敗理由を特定するログ出力設計

開発プロジェクトのリーダーである私たちが、現場の設計者から最も頻繁に受ける悲鳴のような報告、それは 「VBAマクロを実行したらSolidWorksが突然フリーズした(あるいは沈黙した)」 というものだ。

自動化スクリプトの規模が大きくなり、パラメータ駆動で一括モデリングを行うようなシステムを構築した途端、この悪夢は牙を剥く。原因のほとんどは、動的に生成されたジオメトリが数学的矛盾(ゼロ厚み、面-面間の不正な交差、参照先の喪失など)を起こし、SolidWorksカーネルが音を上げることにある。

VBA側で何の対策もしていない場合、お馴染みの「モデルを再構築できませんでした」というダイアログと共に、マクロは無慈悲に強制終了(あるいはAutomation ErrorによるExcel/VBAのクラッシュ)を引き起こす。

今回は、このSolidWorks特有の幾何学エラーを完全に手なずけ、どのフィーチャで、何が原因で失敗したのかを特定し、構造化されたログとして出力するための「プロダクションコード」を授けよう。

なぜ、通常の `On Error Resume Next` では太刀打ちできないのか?

素人がやりがちな最悪のアンチパターンがこれだ。

‘ 【絶対にしてはいけない非効率なコード例】
On Error Resume Next
‘ 甚大な処理の連続
Set myFeature = part.Extension.InsertFeature…
If Err.Number <> 0 Then
‘ エラー処理のつもり
Debug.Print “エラー発生”
End If
On Error GoTo 0

なぜ、これでは実務で使い物にならないのか?
SolidWorks APIの多くは、COMオブジェクトのメソッド実行自体は「成功(S_OK)」を返す。つまり、VBAの `Err` オブジェクトは 「APIの呼び出しに成功した」 と判定してしまうのだ。
しかし、SolidWorksの内部ドキュメント(ModelDoc2)の状態としては「再構築エラー(Rebuild Error)」が発生し、モデルが破損しているか、警告フラグが立っている。VBAはこの「サイレント・キラー」を検知できない。

したがって、私たちは 「VBAの例外」ではなく「SolidWorksのモデリング状態(Status)」を能動的に監視・ポーリングする設計 を採用しなければならない。

堅牢なエラーハンドリング設計の全体像

プロフェッショナルな自動化ツールが備えるべきエラーログ設計は以下の3ステップで構成される。

1. フィーチャ走査によるエラー状態の監視
`Feature.GetError()` を用いて、モデル内の全フィーチャのエラーコードをスキャンする。
2. 失敗フィーチャの特定と日本語メッセージへの変換
エラーコードから「何が起きたのか(例: スケッチの過拘束、ゼロ厚み)」をマッピングする。
3. トランザクション的ロールバックとログ出力
バッチ処理を継続するため、エラーが発生した瞬間にモデルの状態を安全に破棄(または保存せずクローズ)し、CSV/テキストへ正確なタイムスタンプ付きで出力する。

【プロダクションコード】堅牢なリビルド&ログ出力実装

以下のコードは、実務の現場でそのまま組み込めるモジュールだ。エラーハンドリングの神髄である「原因の特定と記録」を完璧にこなす。

Option Explicit

‘ SolidWorks エラーコードの定数定義(抜粋)
Private Const swFeatureErrorType_Error As Long = 1
Private Const swFeatureErrorType_Warning As Long = 2

Sub Main_RobustModelingAutomation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim logPath As String

‘ アプリケーションの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical
Exit Sub
End If

‘ ログファイルの出力先(例: デスクトップ)
logPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\SolidWorks_ErrorLog.csv”

‘ 1. モデルの強制再構築を実行
Dim boolstatus As Boolean
‘ ForceRebuild3(TopOnly)
boolstatus = swModel.ForceRebuild3(False)

‘ 2. 再構築結果およびフィーチャツリーのエラースキャン
Dim hasError As Boolean
hasError = CheckAndLogFeatureErrors(swModel, logPath)

If hasError Then
MsgBox “モデリング中にエラーが検出されました。” & vbCrLf & _
“詳細はデスクトップのログを確認してください。”, vbExclamation, “致命的ジオメトリエラー”
Else
MsgBox “すべてのプロセスが正常に完了しました。”, vbInformation, “成功”
End If

End Sub

‘ ==============================================================================
‘ フィーチャツリーを再帰的に走査し、エラーを検知してログを出力する核心関数
‘ ==============================================================================
Function CheckAndLogFeatureErrors(ByVal swModel As SldWorks.ModelDoc2, ByVal logFile As String) As Boolean
Dim swFeat As SldWorks.Feature
Dim errorList As String
Dim errCode As Long
Dim warnCode As Long
Dim fileNum As Integer
Dim errorFound As Boolean

errorFound = False
errorList = “”

‘ 最初のフィーチャを取得
Set swFeat = swModel.FirstFeature

‘ フィーチャツリーを走査
Do While Not swFeat Is Nothing
‘ フィーチャのエラー・警告状態を取得
‘ GetErrorCode2(ErrorType, ErrorCode, WarningCode)
swFeat.GetError2 errCode, warnCode

If errCode > 0 Then
errorFound = True
‘ エラー情報をフォーマット (フィーチャ名, 内部タイプ, エラーコード)
Dim logLine As String
logLine = Format(Now, “yyyy/mm/dd hh:nn:ss”) & “,” & _
swModel.GetPathName & “,” & _
swFeat.Name & “,” & _
swFeat.GetTypeName2 & “,” & _
“ERROR_CODE_” & errCode

‘ ログファイルへの追記出力
fileNum = FreeFile
Open logFile For Append As #fileNum
Print #fileNum, logLine
Close #fileNum

Debug.Print “[Geometry Error] ” & swFeat.Name & ” (Code: ” & errCode & “)”
End If

‘ 次のフィーチャへ
Set swFeat = swFeat.GetNextFeature
Loop

CheckAndLogFeatureErrors = errorFound
End Function

プロジェクトリーダーからの実践的アドバイス

1. バッチ処理(複数ファイル一括処理)への応用
もしこのロジックを数百ファイルの図面・モデル変換に組み込む場合、`CheckAndLogFeatureErrors` が `True` を返したファイルは、即座に `swModel.Save3 (swSaveAsOptions_Silent, …)` をスキップし、変更を破棄して閉じる(`swApp.CloseDoc`)設計にしなければならない。不完全なモデルを上書き保存する事故を防ぐのが、チーフアーキテクトとしての最低限の責務だ。

2. エラーコードのブラックボックス化を防ぐ
SolidWorks APIヘルプにある `swFeatureError_e` 列挙体を参照し、ログに出力される `errCode` を「ゼロ厚みエラー」「スケッチ拘束不足」などの実務的な日本語文字列に変換するディクショナリ(連想配列)を前段に噛ませると、現場のオペレーターのデバッグ効率が劇的に向上する。

妥協のない例外検知とログ設計こそが、現場の信頼を勝ち取る唯一の道である。コードの海に溺れることなく、堅牢なシステムを構築し続けてほしい。

タイトルとURLをコピーしました