【入門編】【堅牢なエラーハンドリング】On Error Resume NextとGetObjectを用いた安全な例外処理 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの極意:マクロを「止まらない武器」に変える堅牢なエラーハンドリング術

こんにちは。SolidWorksの自動化の世界へようこそ。

「マクロの記録」から一歩踏み出し、自力でコードを書き始めたあなたを待っているのは、「予期せぬエラーでSolidWorksがフリーズし、未保存の作業が水の泡になる」という悪夢です。

業務自動化エンジニアにとって、コードが正しく動くことは「当たり前」。真のプロフェッショナルは、「エラーが起きたときにどう振る舞うか」を設計しています。今日は、SolidWorks VBAの心臓部である`SldWorks`と`ModelDoc2`を、安全かつ強固に制御するための「例外処理」の極意を伝授します。

1. なぜ「On Error Resume Next」は諸刃の剣なのか?

ネット上のサンプルコードでよく見かける `On Error Resume Next`。これは「エラーが出ても無視して次の行に進め」という命令です。

初心者はこれを「魔法の呪文」のように使いがちですが、これは「見て見ぬふりをする」危険な記述です。もしSolidWorksが裏でクラッシュしていても、マクロは平然と動き続け、最終的に深刻なデータ破損を招く可能性があります。

私たちが目指すのは「管理された例外処理」です。

エラーを無視するのではなく、「エラーを検知し、安全に退避する」ロジックを組み込みましょう。

2. 実践:GetObjectによる「安全な接続」

SolidWorksを操作する際、最も多いエラーは「SolidWorksが起動していない」あるいは「別のプロセスが干渉している」場合です。`GetObject`を使い、現在実行中のSolidWorksに安全にアタッチするコードがこちらです。

Sub ConnectToSolidWorks()
Dim swApp As SldWorks.SldWorks

‘ エラーハンドリングの開始
On Error Resume Next

‘ 既に開いているSolidWorksを取得
Set swApp = GetObject(, “SldWorks.Application”)

‘ エラーが発生した(SolidWorksが起動していない)場合
If Err.Number <> 0 Then
MsgBox “SolidWorksが起動していません。起動してから実行してください。”, vbCritical
On Error GoTo 0 ‘ エラーハンドリングをリセット
Exit Sub
End If

‘ エラーハンドリングを標準に戻す
On Error GoTo 0

‘ ここから安全な処理が始まる
MsgBox “SolidWorksに接続成功しました:” & swApp.RevisionNumber
End Sub

このコードの「賢いポイント」

1. `On Error Resume Next`の限定利用: 接続を試みる瞬間にだけ適用し、即座に`If Err.Number <> 0`で判定しています。
2. `On Error GoTo 0`の徹底: エラー無視状態をダラダラと続けない。これがバグを未然に防ぐエンジニアの流儀です。

3. ModelDoc2操作時の「生存確認」

SolidWorksを操作していると、ユーザーが途中で図面を閉じてしまったり、別のファイルに切り替えたりすることがあります。`ModelDoc2`オブジェクトを操作する際は、必ず「今、操作対象は存在するか?」を確認してください。

Sub SafeModelAccess()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

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

‘ そもそもモデルが開かれているか確認
If swModel Is Nothing Then
MsgBox “対象となるドキュメントが開かれていません。”, vbExclamation
Exit Sub
End If

‘ ここで安全に処理を続行
Debug.Print “現在開いているファイル: ” & swModel.GetTitle
End Sub

4. 伝説のエンジニアからのアドバイス:エラーハンドリングの哲学

現場で重宝されるマクロを書くための、3つの黄金律を覚えて帰ってください。

1. 「失敗」を前提にコードを書く:
「ファイルは必ず存在する」と信じないこと。`If Dir(filePath) = “”` のように、必ず外堀を埋めてから実行する癖をつけてください。
2. ユーザーに「なぜ止まったか」を伝える:
ただマクロが落ちるのと、「ファイルが見つかりません」とメッセージが出て終了するのでは、信頼性が天と地ほど違います。
3. オブジェクトを適切に解放する:
`Set swApp = Nothing` とするのは、VBAでは必須ではありませんが、大規模なプログラムではメモリリークを防ぐ良き習慣です。

まとめ

今回のテーマである「堅牢なエラーハンドリング」は、あなたのマクロを「試作品」から「業務ツール」へと昇華させるための第一歩です。

  • `On Error Resume Next`は局所的に使う
  • オブジェクト操作の前に必ず`Is Nothing`チェックを入れる
  • エラー時はメッセージを表示し、優しく終了させる

ここをクリアすれば、もうマクロの裏側で何が起きているか怯える必要はありません。SolidWorks VBAという強力なエンジンを、あなたの思い通りに制御してやりましょう。

次回は、さらに一歩進んだ「イベントハンドリング(ユーザーの操作を検知して自動実行する方法)」について解説します。それでは、良い自動化ライフを!

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