SolidWorks VBAを掌握する:崩壊を防ぐ「鉄壁の例外処理」実装ガイド
こんにちは。SolidWorksの自動化の深淵へようこそ。
「マクロの記録」ボタンを押して生成されたコードをそのまま動かし、予期せぬエラーでSolidWorksごとクラッシュ……そんな経験はありませんか?
SolidWorksのAPIは強力ですが、非常に「繊細」です。メモリリークや不正なオブジェクト参照が起きると、容赦なくプロセスを道連れにします。今日お伝えするのは、「エラーを恐れるのではなく、エラーを制御下に置く」ための極意です。
—
1. なぜ「エラーハンドリング」が不可欠なのか?
SolidWorks VBAにおいて、エラー処理は単なる「保険」ではありません。「プログラムの生存権」を守るための必須機能です。
APIの操作中にエラーが発生すると、VBAは即座に停止します。その際、開いているドキュメントのハンドルが解放されず、SolidWorksが「ゾンビプロセス」として残ることも珍しくありません。
私たちが目指すのは、「何が起きたか」を記録し、「安全に後処理をして」終了する。このトランザクション的な挙動です。
—
2. 鉄壁のエラーハンドリング・テンプレート
まず、現場でそのまま使える「汎用エラーハンドリング基盤」を提示します。これをすべてのプロシージャの型としてください。
Sub CoreProcessing_Example()
‘ 1. エラーハンドラの宣言
On Error GoTo ErrorHandler
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ここにメインの処理を書く
If swModel Is Nothing Then Err.Raise 9999, “CoreProcessing”, “ドキュメントが開かれていません。”
‘ 正常終了時の出口
Exit Sub
ErrorHandler:
‘ 2. エラー情報の収集とログ出力
Call LogError(Err.Number, Err.Description, “CoreProcessing”, swModel.GetPathName)
‘ 3. 安全な終了処理
MsgBox “エラーが発生しました。詳細はログを確認してください。”, vbCritical
Resume CleanUp
CleanUp:
‘ メモリ解放やUIの復旧など
Set swModel = Nothing
End Sub
‘ ログ出力用の共通関数
Sub LogError(errNum As Long, errDesc As String, procName As String, filePath As String)
Dim logPath As String
logPath = Environ(“USERPROFILE”) & “\Desktop\SW_ErrorLog.csv”
Dim fNum As Integer
fNum = FreeFile
Open logPath For Append As #fNum
Print #fNum, Now & “,” & procName & “,” & errNum & “,” & errDesc & “,” & filePath
Close #fNum
End Sub
—
3. コードの心臓部を読み解く
① `On Error GoTo ErrorHandler`
これがVBAにおける「防波堤」です。この一行があるだけで、エラーが発生した瞬間にプログラムの制御が「ErrorHandler」というラベルへ強制的にジャンプします。
② `Err.Raise` で「意図的なエラー」を作る
APIが返すエラーだけでなく、自分自身で条件を設定しましょう。「ドキュメントが開かれていない」といった論理的な矛盾を自分でエラーとして定義することで、プログラムの品質は劇的に向上します。
③ `Resume` キーワードの重要性
エラー処理の最後に `Resume` を使うと、プログラムの特定の行へ戻ることができます。今回は `CleanUp` ラベルへ飛ばすことで、エラーが起きた後でも「確実にメモリを解放する」という綺麗な終焉を実現しています。
—
4. 陥りやすい罠:なぜ「マクロの記録」だけでは足りないのか
初学者の多くが陥る罠は、「オブジェクトの状態をチェックしない」ことです。
- APIオブジェクトのnullチェックを怠る:`swApp.ActiveDoc` を取得した直後に `Nothing` かどうか確認していますか? これを怠ると、存在しないオブジェクトに対して命令を出し、VBAが「実行時エラー91」を吐いて止まります。
- ログを軽視する:エラーメッセージを `MsgBox` だけで済ませると、数日後に「あの時なぜ止まったんだっけ?」と原因が迷宮入りします。CSVに日付とドキュメントパスを記録する習慣をつけてください。
—
最後に:エンジニアとしてのマインドセット
SolidWorksの自動化において、完璧なコードを書くことよりも「エラーが起きたときに何が起きたか特定できる状態にすること」の方が重要です。
今回紹介したテンプレートをあなたの開発の「型」にしてください。これを守るだけで、あなたのコードの堅牢性はプロフェッショナルの領域に一歩近づきます。
何か不明点があれば、またいつでも聞いてください。焦らず、一歩ずつ構造を理解していきましょう。あなたの自動化の旅を、私は心から応援しています。
