【入門編】【実務中級】アセンブリ内の全コンポーネントのファイル名・パスを一括チェックし、外部参照切れ(Broken References)を事前診断 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAで「リンク切れ」を撲滅せよ!アセンブリ診断ツールの作り方

こんにちは。設計自動化の世界へようこそ。
日々、SolidWorksと向き合っている皆さんなら一度は経験があるはずです。「いざ図面を開こうとしたら、参照先が見つからずロードに時間がかかる」「大規模アセンブリで一部の部品が欠落している」……あの胃が痛くなるような瞬間ですよね。

今日は、そんなトラブルを未然に防ぐ「外部参照の事前診断ツール」の作り方を解説します。単なるコードの紹介ではありません。SolidWorksの内部構造(API)がどうやってファイルを追跡しているのか、その「本質」に触れていきましょう。

—

1. なぜ「リンク切れ」は起きるのか?

SolidWorksのモデルは、部品(Part)やアセンブリ(Assembly)が複雑なツリー構造で繋がっています。これらは「絶対パス」や「相対パス」で保存場所を記憶していますが、ネットワークドライブの再割り当てやフォルダのリネームで、その糸は簡単に切れてしまいます。

我々エンジニアがやるべきは、「手作業で確認する」のではなく「開いた瞬間にシステムにスキャンさせる」ことです。

—

2. 診断の心臓部:`IComponent2::GetPathName`

SolidWorks APIにおいて、コンポーネントの情報を取得するためのメインストリームは `IComponent2` オブジェクトです。

ここで重要なのは、「コンポーネントがメモリ上にロードされているか」と「ファイルが実在するか」は別問題だということです。APIを使って全コンポーネントのパスをリストアップし、`Scripting.FileSystemObject` を使ってそのパスが実在するかを確認する。これが診断の基本ロジックになります。

—

3. 実践コード:参照切れスキャンマクロ

以下のコードは、現在アクティブなアセンブリ内の全コンポーネントを巡回し、リンク切れがあればイミディエイトウィンドウに警告を出力する実用的なスクリプトです。

Option Explicit

‘ 参照設定: Microsoft Scripting Runtime を追加してください
Sub CheckAssemblyReferences()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim vComps As Variant
Dim i As Long
Dim fso As Object

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ アセンブリ以外なら終了
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてから実行してください。”
Exit Sub
End If

Set swAssy = swModel
‘ コンポーネントを全取得(再帰的に取得するには再帰処理が必要ですが、まずは直下から)
vComps = swAssy.GetComponents(False)

Debug.Print “— 外部参照チェックを開始 —”

For i = 0 To UBound(vComps)
Set swComp = vComps(i)
Dim compPath As String
compPath = swComp.GetPathName

‘ パスが空(仮想コンポーネント等)またはファイルが存在しない場合
If compPath = “” Then
Debug.Print “警告: 仮想コンポーネントまたは未保存: ” & swComp.Name2
ElseIf Not fso.FileExists(compPath) Then
Debug.Print “【エラー】リンク切れ: ” & compPath
End If
Next i

Debug.Print “— チェック完了 —”
MsgBox “チェックが完了しました。イミディエイトウィンドウを確認してください。”
End Sub

—

4. 陥りやすい罠とエンジニアの心得

このコードを書いていく中で、初心者が必ず直面する「壁」が2つあります。

① 「再帰構造」の罠

アセンブリの中にアセンブリ(サブアセンブリ)がある場合、`GetComponents(False)` だけでは直下の部品しか拾えません。全ての階層をスキャンするには、関数を自分自身で呼び出す「再帰処理」の実装が必要です。最初は難しく感じるかもしれませんが、これがマスターできればアセンブリ操作の達人です。

② 「仮想コンポーネント(Virtual Component)」の扱い

アセンブリ内部に保存された仮想コンポーネントは、外部ファイルを持たないため `GetPathName` が空文字列を返します。これを「エラー」と判定してしまうと、設計意図に反してしまいます。「外部ファイルがないのは仕様か、それとも事故か」を見極めるロジックを組むのが、自動化エンジニアの腕の見せ所です。

—

5. 次のステップへ

このマクロを「アセンブリを開いた瞬間に自動実行」させるには、VBAのクラスモジュールで `SldWorks.DAssemblyDocEvents_FileSaveNotify` などのイベントを拾う仕組みが必要です。

今回のコードは、そのための第一歩です。まずはこのコードをVBAエディタに貼り付けて、自分のアセンブリでテストしてみてください。
「動いた!」という感動の先に、設計現場を救う真の自動化エンジニアへの道が開けています。

もし壁にぶつかったら、いつでも聞いてください。SolidWorks APIの世界は奥が深く、そして非常に知的で面白いですよ。応援しています!

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