【入門編】【アセンブリ依存関係】PartDoc.EnumExternalFileReferencesを用いたインプレイスパーツにおける外部参照パス切れの自動検知 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して操作を覚えさせる段階はもう卒業しましたね。ここからは、APIのオブジェクトモデルを直接手玉に取り、CADの裏側の構造まで完全にコントロールする「本物のエンジニア」への道を歩み始めましょう。

今回は、実務で誰もが一度は頭を抱える「インプレイスパーツ(アセンブリ内で作成・編集される部品)の外部参照パス切れ」をテーマに取ります。

「あれ?昨日まで動いていたアセンブリを開いたら、部品が真っ赤になって消えている……!」
「共有サーバーのフォルダ構成を変えたら、すべての外部参照がリンク切れを起こした……!」

こんな絶望的な状況をVBAの力で一網打尽にし、自動で検知・修復するための極限の知見を授けましょう。ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に到達します。さあ、一緒に紐解いていきましょう!

なぜ「外部参照のパス切れ」は厄介なのか?

アセンブリの中で「このパーツの形状は、あっちのパーツのこの面に合わせよう」と作成したパーツ(インプレイスパーツや外部参照を持つパーツ)は、親となるパーツやアセンブリの「ファイルパス」を記憶しています。

しかし、以下のような理由でパスは簡単にプツリと切れます。

  • 設計データを別のフォルダにコピーした、または別PCに移動した
  • サーバーの共有ドライブの構成が変わった
  • 参照元のファイル名を変えてしまった

これを一つひとつ手作業で「外部参照の編集」から直していくのは、気の遠くなるような苦行です。だからこそ、APIを使ってプログラムに一瞬でスキャンさせ、必要なら修復させればいいのです。

鍵を握るAPI:`EnumExternalFileReferences` とは?

今回主役として召喚するのは、`PartDoc` オブジェクト(または `ModelDoc2`)が持つ `EnumExternalFileReferences` というメソッドです。

このメソッドの名前を直訳すると、「外部ファイル参照の列挙」。
つまり、「このパーツが依存している外部ファイルの一覧をくれ!」とSolidWorksに要求するための専用窓口です。

陥りやすい罠:オブジェクトのライフサイクルと型

SolidWorks APIのコレクション操作や列挙系メソッドは、COMのメモリ管理が絡むため、少しクセがあります。特に、返されるデータの構造や、正しく配列を受け取るための作法を知らないと、VBAは容赦なく「実行時エラー」を吐き出します。

ここから、実戦でそのまま使える「外部参照パス切れ自動検知・診断ツール」の全コードを公開します。

実践!外部参照パス整合性チェッカー(VBAコード)

以下のコードをSolidWorksのVBAエディタ([Alt] + [F11])に貼り付けてください。現在開いているパーツドキュメントを対象に、すべての外部参照をスキャンし、ファイルが存在するか(パスが生きているか)をイミディエイトウィンドウにレポートします。

Option Explicit

‘ =================================================================================
‘ 外部参照パス整合性チェッカー(PartDoc.EnumExternalFileReferences 活用例)
‘ =================================================================================
Sub CheckExternalReferences_Click()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc

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

‘ 1. ドキュメントが開かれているか、それがパーツファイルかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType <> swDocPART Then
MsgBox “このマクロは「パーツ(Part)」ドキュメントを開いた状態で実行してください。”, vbExclamation, “対象外”
Exit Sub
End If

Set swPart = swModel

‘ 2. 外部参照の数を取得するための変数
Dim refCount As Long
refCount = swPart.GetExternalFileReferenceCount()

If refCount = 0 Then
Debug.Print “【情報】このパーツには外部参照(インプレイス等)は含まれていません。”
MsgBox “外部参照は検出されませんでした。”, vbInformation, “完了”
Exit Sub
End If

Debug.Print “==================================================”
Debug.Print ” 外部参照スキャン開始: ” & swModel.GetPathName()
Debug.Print ” 検出された参照数: ” & refCount
Debug.Print “==================================================”

‘ 3. 外部参照情報の格納用配列を準備
‘ EnumExternalFileReferences は配列のデータを一括で返す仕様になっています
Dim modelNameList As Variant
Dim compNameList As Variant
Dim refType_Variant As Variant
Dim Pont_Variant As Variant

‘ メソッドを実行してデータを一網打尽に取得
Dim result As Boolean
result = swPart.EnumExternalFileReferences(modelNameList, compNameList, refType_Variant, Pont_Variant)

If Not result Then
MsgBox “外部参照情報の取得に失敗しました。”, vbCritical, “APIエラー”
Exit Sub
End If

‘ 4. 取得した配列をループして、ファイルの生死(存在確認)をチェック
Dim i As Long
Dim targetPath As String
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Dim brokenCount As Long
brokenCount = 0

For i = LBound(modelNameList) To UBound(modelNameList)
targetPath = modelNameList(i)

Debug.Print vbCrLf & “— 参照 [” & (i + 1) & “] —”
Debug.Print ” 参照先パス: ” & targetPath

‘ FileSystemObject を使って実際にファイルが存在するか物理チェック
If fso.FileExists(targetPath) Then
Debug.Print ” 状態: 【 正常 】 (ファイルが存在します)”
Else
Debug.Print ” 状態: 【 ★パス切れ★ 】 (指定されたパスにファイルが見つかりません)”
brokenCount = brokenCount + 1

‘ 【発展】ここに自動修復ロジック(別フォルダからの探索など)を組み込むことも可能!
End If
Next i

Debug.Print vbCrLf & “==================================================”
Debug.Print ” スキャン完了。 異常検出数: ” & brokenCount & ” 件”
Debug.Print “==================================================”

MsgBox “スキャンが完了しました。” & vbCrLf & _
“検出された外部参照数: ” & refCount & ” 件” & vbCrLf & _
“パス切れ検出数: ” & brokenCount & ” 件” & vbCrLf & _
“(詳細はイミディエイトウィンドウを確認してください)”, vbInformation, “診断終了”

End Sub

VB.NETやC#への拡張を見据えた解説

上記のVBAコード、非常にすっきりと書かれていますが、SolidWorks APIを扱う上で知っておくべき「プロの知見」がいくつか詰まっています。

1. Variant配列による一括取得のメカニズム
`EnumExternalFileReferences` は、個別のオブジェクトを一つずつループで取得するのではなく、一気にVariant型の配列(Array)としてデータを返します。これにより、APIの呼び出しオーバーヘッドを最小限に抑え、パフォーマンスを劇的に向上させています。
2. FileSystemObject (`Scripting.FileSystemObject`) との合わせ技
SolidWorks API自体にもファイルの存在を確認する機能はありますが、VBAの王道であるFSOを使うことで、ネットワークパス(UNCパス `\\Server\Folder\…`)を含めた厳密な物理ファイルの存在確認を高速に行うことができます。

現場で役立つ!さらに一歩進んだ応用アイディア

ここをクリアしたあなたなら、もう次のステップへ進めます。もし「パス切れ」を検知した場合にどうすべきでしょうか?

  • 自動リサーチ機能の追加:

もしファイルが元の場所に見つからない場合、同じアセンブリフォルダ内(または指定した共通パーツライブラリフォルダ内)を再帰的に検索し、ファイル名が一致するものを探して、`ModelDoc2::ReplaceReferencedDocument` などのメソッドを使って自動的にパスを再紐付け(修復)するスクリプトへと進化させることができます。

設計変更やデータの移行作業で、何百個ものパーツのパスを夜通し手作業で直す……そんな不毛な残業はもう終わりです。APIを知り尽くしたあなたなら、数行のコードでそれを自動化し、エンジニアとしての本来の創造的な業務に集中できるはずです。

ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
ぜひ、あなたの開発環境でも試してみてください。それでは、次回の極限知見でお会いしましょう!

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