【SolidWorks VBA極意】アセンブリの「迷子」を撲滅せよ!参照状態を網羅する健全性診断マクロ
こんにちは。現場の阿鼻叫喚をコードで解決する、自動化アーキテクトです。
SolidWorksで大規模なアセンブリを扱っていると、ある日突然、「ファイルが見つかりません(Reference Missing)」という赤い文字に絶望した経験はありませんか?共有サーバーの移動、フォルダの整理、名前の変更……。原因は様々ですが、一つひとつ手作業で確認するのは、まさに地獄への入り口です。
今日は、そんな「アセンブリの健康状態」を一瞬で診断し、リンク切れを可視化する「健全性診断ツール」を、VBAの深淵から伝授します。「マクロの記録」から卒業し、SolidWorksのオブジェクト構造を操るエンジニアへの第一歩を、ここから踏み出しましょう。
—
1. なぜ「マクロの記録」では限界があるのか?
まず知っておいてほしいのは、「マクロの記録」はあくまで作業のトレースであって、エンジニアリングではないということです。
アセンブリ内のコンポーネントを巡回するには、SolidWorks APIの「再帰処理(Recursive)」という概念が必須です。アセンブリの中にサブアセンブリがあり、さらにその中にパーツがある……この木構造(ツリー)を、コードでどう辿るか。ここを理解すれば、あなたの自動化能力は一気に飛躍します。
—
2. 診断マクロ:アセンブリ・スキャナー
以下のコードは、現在開いているアセンブリ内の全コンポーネントを走査し、そのパスと参照状態をイミディエイトウィンドウに出力するものです。
‘ 必要なライブラリ:SldWorks Type Library / SwConst Type Library
Option Explicit
Sub ScanAssemblyReferences()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ アセンブリが開かれているかチェック
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリファイルを開いてから実行してください。”
Exit Sub
End If
Set swAssy = swModel
Debug.Print “— 診断開始: ” & swModel.GetTitle & ” —”
‘ 再帰的にコンポーネントを解析するプロシージャを呼び出す
ProcessComponents swAssy.GetComponents(False)
Debug.Print “— 診断終了 —”
End Sub
Sub ProcessComponents(comps As Variant)
Dim i As Long
Dim swComp As SldWorks.Component2
Dim compPath As String
If IsEmpty(comps) Then Exit Sub
For i = LBound(comps) To UBound(comps)
Set swComp = comps(i)
compPath = swComp.GetPathName
‘ 外部参照状態の診断
‘ GetSuppression は状態を返すが、パスが空ならリンク切れの可能性大
If compPath = “” Then
Debug.Print “【警告】名前: ” & swComp.Name2 & ” (仮想コンポーネントまたは未保存)”
Else
‘ ファイルが存在するかチェック
If Dir(compPath) = “” Then
Debug.Print “【エラー】リンク切れ: ” & compPath
Else
Debug.Print “【正常】 ” & compPath
End If
End If
‘ サブアセンブリがある場合は再帰的に掘り下げる
If swComp.GetChildrenCount > 0 Then
ProcessComponents swComp.GetChildren
End If
Next i
End Sub
—
3. コードの心臓部を読み解く(ここが「エンジニア」の境界線)
このコードには、初心者が陥りがちな罠を回避するポイントが詰まっています。
- `GetComponents(False)`: この引数`False`は「トップレベルのコンポーネントのみ取得する」という意味です。ここを`True`にすると計算コストが跳ね上がるため、あえて再帰処理で制御する方が、大規模アセンブリではメモリ効率が良いのです。
- `Dir(compPath)`: 非常に古典的ですが、強力な関数です。Windowsのファイルシステムに直接問い合わせることで、SolidWorksが「見失っている」ファイルを即座に判定します。
- 再帰処理 (`ProcessComponents`): 自分の関数の中で自分を呼び出す技術です。これにより、サブアセンブリが何階層あっても自動的に全てのパーツを辿ることができます。
—
4. 陥りやすいエラーと対処法
1. 「オブジェクト変数または With ブロック変数が設定されていません」:
- 原因:アセンブリではないファイルで実行しているか、`swComp`が空のまま処理されている。
- 対策:`If swComp Is Nothing Then Exit Sub` のようなガード節をこまめに入れましょう。
2. パフォーマンスが重い:
- 原因:`swModel.ForceRebuild3` などをループ内で回していませんか?
- 対策:診断時は「読み取り専用」に近い状態で処理を行うのが鉄則です。ファイルを保存したり再構築したりする処理は、必要最小限に留めましょう。
—
最後に:自動化の先にあるもの
このマクロを使えば、納品直前の「ファイルが見つかりません」という悪夢から解放されます。
自動化エンジニアの役割は、単にコードを書くことではありません。「人間がやらなくていいミスを、機械に肩代わりさせること」です。このスクリプトをベースに、今後は「見つからないファイルの一覧をExcelに書き出す」「自動でフォルダを再検索してリンクを更新する」といった機能へ拡張してみてください。
あなたの開発現場が、より創造的で、ストレスのない場所になることを願っています。何か詰まったら、いつでも戻ってきてください。また次の極限の知見でお会いしましょう。
