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

スポンサーリンク

こんにちは!SolidWorks自動化の現場で、日々泥臭くも美しいマクロを書き続けている先輩エンジニアです。

マクロの記録ボタンを押して自動生成されたコードを動かしてみたものの、少しでも形状が変わったり、寸法がタイトになったりした瞬間に、「モデルが再構築できませんでした」という冷徹なダイアログとともにVBAがフリーズ(あるいは強制終了)して絶望した経験はありませんか?

「せっかく自動化の仕組みを作ったのに、エラーが出るたびに人間が画面の前で監視しなければならない……」
そんな悩みを抱えているあなたへ。今回は、SolidWorks VBAの最も深淵にして実用的なテーマ「エラーハンドリングと失敗理由のログ出力設計」を授けましょう。

ここをクリアすれば、あなたのマクロはただの「おもちゃ」から、現場で信頼される「頑健な(ロバストな)システム」へと生まれ変わります。さあ、一緒に扉を開けましょう!

なぜSolidWorksマクロは突然止まるのか?(本質の理解)

VBAの一般的な `On Error Resume Next` というお呪い(おまじない)は、SolidWorksのAPIの前ではほとんど役に立ちません。なぜなら、VBA側から見れば「APIの関数が無事に実行された(エラー値などを返さなかった)」としても、SolidWorksの内部エンジン(Parasolid)が「数学的に立体が成立しない(ゼロ厚み、自己交差、寸法の矛盾)」と判断しているからです。

APIは「命令を受けた通りに形状を作ろうとしたけれど、失敗したよ」というステータスを、SolidWorks特有のオブジェクトやエラーステータスとしてひっそりと保持します。これをVBA側で能動的に検知し、料理してやらなければなりません。

避けるべき「アンチパターン」

‘ 絶対にやってはいけない雑なエラー無視
On Error Resume Next
Set myFeature = part.Extension.InsertFeatureTree…
‘ 失敗していようがスルーされ、次の行で「オブジェクト変数が見つかりません」と大爆発する

私たちが目指すべきは、「どこで、どのフィーチャが、なぜ失敗したのか」を正確に特定し、VBAを強制終了させずにログ(テキストファイルなど)に書き出して優雅に処理を抜ける設計です。

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

今回構築するアーキテクチャのフローは以下の通りです。

1. フィーチャ作成/編集処理の実行
2. 直後のドキュメント・ステータス(エラー・警告)の取得
3. 失敗しているフィーチャ名(FeatObj.Name)の特定
4. タイムスタンプ付きの外部ログファイルへの出力
5. VBAをクラッシュさせずに安全なクローズ処理へ誘導

実装コード:実戦で使えるロバスト・テンプレート

以下のコードは、開発現場でそのままコピペしてカスタマイズできるように組み上げた実用サンプルです。フィーチャ生成や寸法変更を行った直後に呼び出す「エラー検知・ロギング関数」を内包しています。

Option Explicit

‘ メインの実行プロシージャ
Sub Main_RobustFeatureBuilder()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

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

‘ エラーハンドラーの有効化
On Error GoTo ErrorHandler

‘ —————————————————-
‘ 【ここに実際のモデリング処理・フィーチャ操作が入ります】
‘ 例:ExtrudeBossなど
‘ —————————————————-

‘ 仮にここで再構築(Rebuild)を実行したとします
Dim boolstatus As Boolean
boolstatus = swModel.EditRebuild3()

‘ ★重要:再構築後にSolidWorksのエラー・警告状態を必ずチェックする
If Not CheckAndLogRebuildErrors(swModel) Then
MsgBox “モデリングの構築に失敗しました。ログを確認してください。”, vbExclamation, “警告”
Exit Sub
End If

MsgBox “すべての処理が正常に完了しました!”, vbInformation
Exit Sub

ErrorHandler:
‘ 予期せぬVBA自体のランタイムエラー対策
Call WriteLog(“【VBAランタイムエラー】 Error ” & Err.Number & “: ” & Err.Description)
MsgBox “予期せぬVBAエラーが発生しました。ログを出力しました。”, vbCritical
End Sub

‘ ==============================================================================
‘ 🧠 核心関数:SolidWorksのエラーと失敗フィーチャを特定してログに残す
‘ ==============================================================================
Function CheckAndLogRebuildErrors(ByVal swModel As SldWorks.ModelDoc2) As Boolean
Dim swFeatMgr As SldWorks.FeatureManager
Dim errorList As Variant
Dim warningList As Variant
Dim i As Long
Dim failFeatName As String
Dim logMessage As String

Set swFeatMgr = swModel.FeatureManager

‘ 最後に発生したエラーおよび警告のフィーチャを取得するAPI
‘ 引数に配列を渡すことで、SolidWorksが内部で持っているエラー情報を取得できます
swModel.GetErrorsErrors errorList, warningList

‘ エラー配列が空(=エラーなし)の場合はTrueを返す
If IsEmpty(errorList) Then
CheckAndLogRebuildErrors = True
Exit Function
End If

‘ エラーが存在する場合、失敗したフィーチャを特定する
CheckAndLogRebuildErrors = False

For i = LBound(errorList) To UBound(errorList)
Dim swFeat As SldWorks.Feature
‘ エラーコードに対応するフィーチャオブジェクトを取得
‘ ※SolidWorksのバージョンやAPI仕様により取得方法が異なる場合がありますが、
‘ ここでは概念的なエラーIDとフィーチャ走査の組み合わせを解説します。

logMessage = “【構築エラー検知】 ドキュメント: ” & swModel.GetTitle & ” | エラーコードID: ” & errorList(i)

‘ ログファイルへ書き出し
Call WriteLog(logMessage)
Next i

‘ さらに、フィーチャツリーを上から順に走査して「エラー状態(Suppressed以外で失敗アイコンがついているもの)」を直接探す
Dim swCurrFeat As SldWorks.Feature
Set swCurrFeat = swModel.FirstFeature

Do While Not swCurrFeat Is Nothing
‘ フィーチャのエラー状態をチェックするロジック
‘ swFeatErrorStatus などのステータス確認をここに入れることで、より確実になります。

‘ 例:フィーチャ名を取得してログに残す
If swCurrFeat.GetErrorCode <> 0 Then
Call WriteLog(” -> 失敗フィーチャ名: ” & swCurrFeat.Name & ” (タイプ: ” & swCurrFeat.GetTypeName2 & “)”)
End If

Set swCurrFeat = swCurrFeat.GetNextFeature
Loop

End Function

‘ ==============================================================================
‘ 📝 ログファイル出力用プロシージャ(テキスト追記方式)
‘ ==============================================================================
Sub WriteLog(ByVal message As String)
Dim fso As Object
Dim logFile As Object
Dim logPath As String

‘ ログの保存先(デスクトップの “SolidWorks_Macro_Error.log” に出力)
logPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\SolidWorks_Macro_Error.log”

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルが存在しない場合は新規作成、存在する場合は追記(ForAppending = 8)
If Not fso.FileExists(logPath) Then
Set logFile = fso.CreateTextFile(logPath, True)
Else
Set logFile = fso.OpenTextFile(logPath, 8, True)
End If

‘ タイムスタンプを付与して書き込み
logFile.WriteLine “[” & Format(Now, “yyyy-mm-dd hh:nn:ss”) & “] ” & message
logFile.Close

Set logFile = Nothing
Set fso = Nothing
End Sub

コードのポイント・知見の解説

1. `GetErrorsErrors` による深層ステータスのキャッチ
SolidWorksのAPIには、モデル全体で発生しているエラーや警告のID配列を引っ張り出す強力なメソッドが用意されています。これを利用することで、画面上のポップアップを待たずにプログラム側で「今、何が起きているか」を把握できます。

2. フィーチャツリーの走査 (`GetNextFeature`) による特定
エラーコード単体では「どの形状が原因か」が人間には分かりにくいです。そのため、`FirstFeature` と `GetNextFeature` を使ってモデル内の全フィーチャを巡回し、`GetErrorCode` が非ゼロ(エラーあり)になっているピンポイントのフィーチャ名(例: `ボス-押し出し1` や `フィレット3`)を炙り出します。

3. ファイルシステムオブジェクト(FSO)による堅牢なロギング
エラーが発生した瞬間、そのデスクトップ上に `SolidWorks_Macro_Error.log` というファイルが自動生成され、何月何日の何時何分に、どのファイルのどのフィーチャでコケたのかが秒単位で記録されます。これで「朝フォルダーを開いたらマクロが途中で止まっていて原因がわからない」という悲劇とはおさらばです。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!

お疲れ様でした!少し難しいAPIのメソッドも登場しましたが、要するに「SolidWorksに形状を作らせた後、ちゃんと『できた?』と聞きに行く癖をつけること」、そして「エラーがあったらフリーズさせずに、カルテ(ログ)を残して優しく終わらせること」がプロのエンジニアの作法です。

このエラーハンドリングの型を一度あなたのライブラリに組み込んでしまえば、どんな複雑なアセンブリやコンフィギュレーションの自動生成に挑んでも、恐れるものはなくなります。

現場で「お、こいつの書くマクロ、止まらないし親切だな」と言われるエンジニアを目指して、ぜひ明日からの開発に役立ててください。あなたのSolidWorks自動化ライフが、より快適で知的になりますように!

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