【入門編】【実務中級】エラーを回避せよ!存在しない構成部品やサーフェスを指定した際の堅牢な例外処理 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押して出てきたコードをそのまま動かしてみたものの、「別の環境で動かすとファイルが見つからない」「少しモデルを修正したらエラーで止まるようになった」……そんな壁にぶ,つかっていませんか?

実務で使うマクロと、お遊びのマクロの決定的な違い。それはズバリ、「エラーに対する備え(堅牢性)」があるかどうかです。

今回は、アセンブリの自動化で最もよくある「存在しない部品やサーフェスを指定してしまったとき」に、VBAがクラッシュするのを防ぎ、スマートに例外を処理するための極意を伝授します。ここをクリアすれば、あなたのマクロは「ただ動くおもちゃ」から「現場で頼れる相棒」へと進化しますよ。

—

なぜSolidWorks VBAはすぐにエラーで止まるのか?

SolidWorksのAPIは非常にパワフルですが、同時に「非常にわがまま」です。
例えば、部品の合致(Mate)を組むコードを書いたとしましょう。

  • 「指定したフォルダに部品がない」
  • 「設計変更で面の名前に振られたID(FaceID)が変わってしまった」

人間であれば「あ、ファイル名が変わってるな」と気づいて修正できますが、VBAのプログラムは、指定されたターゲットがそこになければ、容赦なく「実行時エラー」を吐き出し、画面がフリーズしたかのようにストップしてしまいます。

これを防ぐのが、『OnError構文』による例外処理と、『事前に存在をチェックする防衛的プログラミング』です。

—

実務で使える!堅牢なアセンブリ&合致自動化コード

百聞は一見に如かず。まずは、ファイル読み込みから合致の定義までを安全に行う、実務レベルのサンプルコードを見てみてください。

Sub RobustAssemblyAndMateSample()
Dim swApp As SldWorks.SldWorks
Dim swAssDoc As SldWorks.ModelDoc2
Dim swAss As SldWorks.AssemblyDoc

‘ アプリケーションの取得
Set swApp = Application.SldWorks
Set swAssDoc = swApp.ActiveDoc

‘ アクティブドキュメントがアセンブリかチェック
If swAssDoc Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
If swAssDoc.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントはアセンブリではありません。”, vbCritical
Exit Sub
End If

Set swAss = swAssDoc

‘ —————————————————————–
Named_Block:
‘ 1. 安全な部品配置(ファイルの存在チェック付き)
‘ —————————————————————–
Dim componentPath As String
componentPath = “C:\MyParts\Bracket.sldprt”

‘ ファイルシステムのオブジェクトを使って存在確認(極めて重要!)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

If Not fso.FileExists(componentPath) Then
MsgBox “エラー: 目的の部品ファイルが見つかりません。” & vbCrLf & componentPath, vbExclamation
Exit Sub
End If

‘ エラートラップの有効化(予期せぬAPIエラーをキャッチ)
On Error GoTo ErrorHandler

Dim swComp As SldWorks.Component2
Dim transform As SldWorks.MathTransform
Set swComp = swAss.AddComponents3(componentPath, 0, 0, 0)

If swComp Is Nothing Then
MsgBox “部品の挿入に失敗しました(SolidWorks内部エラー)。”, vbCritical
Exit Sub
End If

‘ —————————————————————–
‘ 2. サーフェス/面を指定した合致(Mate)の安全な定義
‘ —————————————————————–
‘ ※実務では面IDの変更リスクがあるため、選択エラーに備える必要があります

‘ ここで特定の面を選択して合致させる処理が入ると仮定
‘ (今回は解説のため、エラーハンドリングの骨組みに集中します)

MsgBox “部品の配置と合致の定義が正常に完了しました!”, vbInformation
Exit Sub

ErrorHandler:
‘ —————————————————————–
‘ 例外処理ブロック
‘ —————————————————————–
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical

‘ 必要に応じたク処理をここに記述

End Sub

—

コードのポイントを徹底解説!

初心者から一歩抜け出すために、上記のコードで押さえておべき「3つの防衛策」を解説します。

1. APIを叩く前に「FileSystemObject」でファイル有無を確認

`AddComponents3`メソッドを実行する前に、VBAの標準機能(あるいはFSO)を使って、そのパスに本当にファイルが存在するかをチェックしています。
SolidWorksに「ファイルがないよ!」と言わせる前に、VBA側で優しく弾くことで、無用なエラーダイアグラムの発生を防げます。

`On Error GoTo` でエラーを「ハプニング」から「想定内」へ

VBAで最も恐ろしいのは、エラーでマクロが強制終了し、デバッグ画面(黄色いハイライト)が出てしまうことです。
`On Error GoTo ErrorHandler` を宣言しておくと、万が一コード内でエラーが発生した際、プログラムの実行が指定したラベル(`ErrorHandler:`)にジャンプします。これにより、ユーザーをパニックにさせず、綺麗に処理を終わらせることができます。

3. オブジェクトの「Nothing判定」

SolidWorks VBAでは、部品の読み込みや面の取得に失敗したとき、変数に `Nothing`(中身が空っぽ)が返ってきます。
「値が入っている前提」で次の行のコードを書くと、そこで即座にエラーになります。「`If swComp Is Nothing Then`」のように、取れているかどうかを毎回疑ってかかる姿勢こそが、プログラミングの堅牢性を高める最大の秘訣です。

—

まとめ:エラーを制する者は、SolidWorks自動化を制す

今回は、存在しないファイルやサーフェスを指定してしまった際のエラー回避術について解説しました。

1. 実行前の「事前チェック」(ファイル存在確認・型チェック)
2. 実行中の「保険」(`On Error GoTo`)
3. 実行後の「結果確認」(`Nothing` 判定)

この3段構えを意識するだけで、あなたの書くマクロは見違えるほど安定します。
「マクロがすぐ止まってイライラする」というストレスから解放されれば、もっと高度なアセンブリ自動化に挑戦したくなるはずです。

ここをクリアできれば、SolidWorks VBAの基本はもうバッチリですよ!
ぜひ、あなたの実務のコードにも取り入れてみてくださいね。それでは、次回の極限知見でお会いしましょう!

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