【入門編】【堅牢な例外処理の実装】Err.NumberとErr.Descriptionを駆使した独自のトランザクション風エラーロギング – SolidWorks VBA解析バイブル

スポンサーリンク

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の自動化において、完璧なコードを書くことよりも「エラーが起きたときに何が起きたか特定できる状態にすること」の方が重要です。

今回紹介したテンプレートをあなたの開発の「型」にしてください。これを守るだけで、あなたのコードの堅牢性はプロフェッショナルの領域に一歩近づきます。

何か不明点があれば、またいつでも聞いてください。焦らず、一歩ずつ構造を理解していきましょう。あなたの自動化の旅を、私は心から応援しています。

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