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

スポンサーリンク

アセンブリの「リンク切れ」は設計の死神:VBAによる自動スキャンで保守性を極める

SolidWorksのアセンブリを開いた瞬間、真っ青になって「ファイルの場所が見つかりません」というダイアログを眺めた経験はないだろうか? ネットワークドライブの再編やフォルダのリネームは、大規模なアセンブリにおける「時限爆弾」だ。

手作業で一つずつ確認するのは、エンジニアの仕事ではない。今回は、アセンブリを開いた瞬間に全てのコンポーネントを巡回し、外部参照が正常かを診断する「壊れない設計」の自動化スクリプトを授ける。

—

なぜ「素人コード」では大規模アセンブリで死ぬのか

多くの入門書にあるような、「単にアセンブリの構成部品を列挙するだけのコード」は、実務レベルでは通用しない。理由は以下の3点だ。

1. コンフィギュレーションの罠: コンフィギュレーションごとに参照先が微妙に異なる場合がある。
2. 抑制(Suppressed)状態のコンポーネント: 抑制されている部品はメモリに完全ロードされていない場合があり、パスの取得に失敗しやすい。
3. パフォーマンスの欠如: `GetModelPath` を無闇に呼ぶと、OSのファイルシステムI/Oがボトルネックになり、数千部品のアセンブリでは数分間フリーズする。

これらを解決する唯一の解は、「オブジェクトのキャッシュ戦略」と「ファイルシステム API(Scripting.FileSystemObject)の効率的利用」である。

—

堅牢な診断スクリプト:プロダクションコード

このコードは、現在アクティブなアセンブリをスキャンし、参照が切れているファイルをイミディエイトウィンドウとテキストログに書き出す仕様だ。

Option Explicit

‘ 必要な参照設定: Microsoft Scripting Runtime
‘ 役割: コンポーネントの存在確認とパス検証の高速化

Public Sub CheckBrokenReferences()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim swComp As SldWorks.Component2
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

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

Set swAssy = swModel
Dim vComps As Variant
vComps = swAssy.GetComponents(False) ‘ 非表示部品も考慮

Dim i As Long
Dim compPath As String
Dim brokenCount As Long: brokenCount = 0

Debug.Print “— 診断開始: ” & Now & ” —”

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

‘ 仮想部品や未保存部品は除外
If compPath <> “” Then
‘ ファイルシステムで実在を確認
If Not fso.FileExists(compPath) Then
Debug.Print “[警告] リンク切れ: ” & compPath
brokenCount = brokenCount + 1
End If
End If
Next i

If brokenCount > 0 Then
MsgBox brokenCount & ” 個の参照切れを発見しました。イミディエイトウィンドウを確認してください。”, vbExclamation
Else
MsgBox “全コンポーネントの参照は正常です。”, vbInformation
End If
End Sub

—

プロフェッショナルが教える運用の秘訣

1. ファイルシステムとの疎結合を保つ

上記のコードでは `Scripting.FileSystemObject` を利用している。これはWindows APIを直接叩くよりも安全で、かつメモリリークのリスクも低い。もし、ネットワークドライブが非常に重い環境(遅延が大きい)であれば、パスの存在確認を非同期的に行うか、ローカルキャッシュテーブルを作成して比較する設計へ昇華させるべきだ。

2. 「未保存ファイル」をどう扱うか

SolidWorksには、まだ一度も保存していない(パスを持たない)「仮想コンポーネント」や「新規作成したばかりの部品」が存在する。これらは `GetPathName` が空文字を返す。これを「エラー」と判定すると誤報になるため、必ず `If compPath <> “”` でフィルタリングすること。これがバグを未然に防ぐ境界線だ。

3. 大規模アセンブリへの対応

もしアセンブリの部品数が5,000を超える場合、`GetComponents(False)` は非常に重い。その場合は、`FeatureManager` を再帰的にトラバースする手法(Reconstructive Tree Traversal)を用いるべきだ。これにより、メモリ負荷を最小限に抑えつつ、必要なデータのみを吸い上げることができる。

—

次なるステップ:自動修復への道

このツールは「診断」だが、次のステップは「自動修復」だ。
もしリンク切れが特定のフォルダ移動に起因するものなら、VBA側で「旧フォルダパス」と「新フォルダパス」の変換テーブル(JSONやCSVで管理)を持ち、`Replace` 関数でパスを書き換えるロジックを追加すれば、数秒で数千箇所のリンク切れを修復可能になる。

設計データは会社の資産だ。リンク切れという「ゴミ」を放置することは、資産の価値を毀損させることに他ならない。このスクリプトを起点に、あなたの現場の「参照整合性」を鉄壁のものにしてほしい。

それができるのは、ツールを操る我々エンジニアだけなのだから。

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