こんにちは!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の基本はもうバッチリですよ!
ぜひ、あなたの実務のコードにも取り入れてみてくださいね。それでは、次回の極限知見でお会いしましょう!
