SolidWorks VBAを掌握する:堅牢なエラーハンドリングが「止まらない自動化」を作る
SolidWorksのAPI開発において、初心者が陥る最大の罠は「エラーハンドリングを怠ること」だ。
マクロが突然沈黙し、SolidWorks自体が「応答なし」の墓場へと消える。あるいは、中途半端な状態でモデルが保存され、データが破損する。これらはすべて、VBAの脆弱なエラー処理に起因している。
プロのエンジニアにとって、コードは「正しく動くこと」だけでは不十分だ。「失敗したときに、いかに安全に、かつ原因を特定可能な状態で死ぬか」が、現場で生き残るシステムの絶対条件である。
今日は、大規模な自動化プロジェクトでも耐えうる、私の秘伝のエラーハンドリング基盤を授ける。
—
1. なぜ「On Error Resume Next」が諸悪の根源なのか
多くの入門サイトが「とりあえずの回避策」として `On Error Resume Next` を推奨しているが、これは開発者の怠慢そのものだ。
エラーを無視すれば、後続の処理は「正常に動いている」と錯覚したまま、不正なオブジェクトに対してAPIを叩き続ける。結果、メモリリークやSolidWorksプロセスのクラッシュを誘発する。
我々が実装すべきは、エラーを「無視」することではなく、「トラップ」して「コンテキスト(文脈)」を記録し、「安全にロールバック」することだ。
—
2. 独自トランザクション風エラーロギングの設計哲学
堅牢なシステムには、以下の3要素が必要だ。
1. 一意の識別子: どのプロシージャの、どの行で発生したか。
2. 実行環境のログ: ファイル名、モデルの状態。
3. 安全な終了処理: `swApp.UserControl = True` の復帰など、SolidWorksへの影響を最小限にする。
—
3. 実装:プロフェッショナル・エラーハンドラ・テンプレート
以下のコードは、私の現場で標準テンプレートとして採用している構造だ。これをモジュールの先頭に置くことで、保守性は劇的に向上する。
Option Explicit
‘ 共通定数
Private Const LOG_PATH As String = “C:\Logs\SW_Automation_Error.csv”
Public Sub ExecuteTask()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ エラーハンドラへのジャンプ設定
On Error GoTo ErrorHandler
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Err.Raise 1001, “Main”, “ドキュメントが開かれていません。”
‘ — メインの業務ロジック —
‘ ここに本来の処理を記述
‘ —————————-
Exit Sub
ErrorHandler:
‘ エラー詳細をCSVに記録
Call LogError(Err.Number, Err.Description, “ExecuteTask”, swModel)
‘ ユーザーへの通知とプロセスの安全確保
MsgBox “致命的なエラーが発生しました。” & vbCrLf & _
“詳細はログを確認してください: ” & LOG_PATH, vbCritical
‘ 必要に応じてプロセスを解放またはリセット
If Not swApp Is Nothing Then swApp.UserControl = True
End Sub
Private Sub LogError(ByVal errNum As Long, ByVal errDesc As String, ByVal procName As String, ByRef swModel As Object)
Dim fileNum As Integer
Dim logText As String
Dim fileName As String
‘ ファイル名の取得(オブジェクトが存在する場合)
If Not swModel Is Nothing Then
fileName = swModel.GetPathName
Else
fileName = “N/A”
End If
‘ CSV形式でログを構築
logText = Now & “,” & procName & “,” & errNum & “,” & Chr(34) & errDesc & Chr(34) & “,” & fileName
‘ ファイルへの追記処理
fileNum = FreeFile
Open LOG_PATH For Append As #fileNum
Print #fileNum, logText
Close #fileNum
End Sub
—
4. 現場で生き残るための「鉄則」
① `Err.Raise` で自発的に死ぬ
条件分岐(If文)で「異常」と判断した場合、`Err.Raise` を使って自らエラーハンドラへ飛ばすこと。これにより、異常系と正常系のコードが混ざらず、可読性が維持される。
② ファイルロックの回避
ネットワーク上のログファイルに書き込む際は、必ず `FreeFile` を使い、`Open` したら即座に `Close` する。ログ出力処理で失敗してマクロが止まるのは本末転倒だ。
③ オブジェクトライフサイクルの意識
SolidWorks APIは、COMオブジェクトの寿命に非常に敏感だ。エラー発生時に `swModel` などのオブジェクトがメモリ上で宙に浮いた状態にならないよう、必ずハンドラ内でクリーンアップを行う癖をつけろ。
—
最後に:ツールは「道具」であって「呪い」ではない
現場の自動化ツールは、作成者が去った後も、あるいは数ヶ月後に自分自身が使うときにも「正しく動く」必要がある。
エラーハンドリングを「面倒な作業」と捉えるか、「メンテナンス性を高めるための投資」と捉えるか。この意識の差が、一過性のスクリプトと、数年間戦い続けるプロダクション・コードを分ける分岐点だ。
さあ、コードを書き換えろ。君の書くマクロが、明日から誰かの救いになることを願っている。
