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という強力なエンジンを、あなたの思い通りに制御してやりましょう。
次回は、さらに一歩進んだ「イベントハンドリング(ユーザーの操作を検知して自動実行する方法)」について解説します。それでは、良い自動化ライフを!
