こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
毎日の業務、本当にお疲れ様です。
「巨大なアセンブリを開こうとしたら、構成部品が見つからなくてエラー……。しかも、開くだけで何分も待たされた!」
そんな絶望的な経験、ありませんか?
実務で何百点、何千点もの部品が入り組んだアセンブリを扱うとき、画面にグラフィックを表示させながらファイルを開く(GUIで開く)のは、PCにとっても、あなたの大切な時間にとっても、ものすごい重労働です。
今回は、「アセンブリファイルを開かずに、バックグラウンドで構成部品がちゃんと揃っているかを高速に事前チェックする」という、実務で今すぐ使える魔法のようなテクニックを伝授します。
ここをクリアすれば、あなたのSolidWorks VBAのスキルは「マクロの記録」のレベルを完全に脱却し、プロの自動化エンジニアの領域に一歩踏み込めますよ。さあ、一緒に見ていきましょう!
—
なぜ「開かずにチェック」する必要があるのか?
SolidWorksのAPIには、強力なメソッドがたくさん用意されています。しかし、初心者がやりがちなのが、とりあえずアセンブリを開いてから、部品の有無をループで確認する方法です。
これには大きな問題があります。
- 重い!遅い!:グラフィックを描画するだけで無駄なメモリと時間を食います。
- パス迷子エラー:ファイルが見つからないポップアップが出るたびに、人間の手で「キャンセル」や「パスの再指定」を押す必要があり、完全自動化がストップします。
そこで登場するのが、「ファイル名と参照関係だけを裏側(バックグラウンド)で高速に読み取る」というアプローチです。画面を描画しないため、驚くほど一瞬でチェックが終わります。
—
使うのはこのAPI:「GetDocumentDependencies2」
今回主役として使うのは、`SldWorks` オブジェクトが持つ `GetDocumentDependencies2` という強力なメソッドです。
このメソッドを使うと、アセンブリファイルを実際に「開く(OpenDoc)」ことなく、そのアセンブリが内部で「どの部品ファイルを参照しているか」のパスリストを一網打尽に取得できます。
全体像のイメージ
1. チェックしたいアセンブリファイルのパスを指定する。
2. `GetDocumentDependencies2` で参照されている全部品のパスを配列として一気に取得する。
3. 取得したパスのファイルが、Windowsのファイルシステム上にあるか(存在するか)を一つずつ確認する。
4. 不足している部品があれば、ログやメッセージで即座に教える。
—
実装コード:爆速・部品存在チェッカー
それでは、VBAのコードを公開します。
そのままコピー&ペーストして、VBAエディタ([Alt] + [F11])に貼り付ければすぐに動かせます。
Option Explicit
‘ ==============================================================================
‘ 【テーマ】アセンブリを開かずにバックグラウンドで構成部品の存在チェックを行う
‘ ==============================================================================
Sub CheckAssemblyDependencies_Background()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
‘ 1. チェックしたいアセンブリファイルのパスを指定(※環境に合わせて変更してください)
Dim targetAssemblyPath As String
targetAssemblyPath = “C:\MySolidWorksData\SampleAssembly.sldasm”
‘ ファイル自体の存在チェック
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FileExists(targetAssemblyPath) Then
MsgBox “指定されたアセンブリファイルが見つかりません:vbCrLf & targetAssemblyPath”, vbCritical, “エラー”
Exit Sub
End If
‘ 2. バックグラウンドで参照ファイル(依存関係)のリストを取得する
‘ GetDocumentDependencies2 の引数設定
‘ IsEmpty: 内部処理用
‘ AllByDefault = True : すべての参照を取得
‘ LookupSkipped = True : スキップされた参照も含む
‘ SearchLoaded = False : ロード済みだけでなく全ファイル対象
Dim depFileNames As Variant
depFileNames = swApp.GetDocumentDependencies2(targetAssemblyPath, True, True, False)
If IsEmpty(depFileNames) Then
MsgBox “参照されている構成部品がないか、または取得に失敗しました。”, vbExclamation, “確認”
Exit Sub
End If
‘ 3. 取得した配列は 「[0]パス, [1]パス, [2]パス…」 のように、
‘ 偶数番目にファイルパスが格納される特殊な構造になっています。
Dim i As Long
Dim filePath As String
Dim missingCount As Long
Dim missingList As String
missingCount = 0
missingList = “”
‘ 配列の下限から上限までループ
For i = LBound(depFileNames) To UBound(depFileNames)
filePath = CStr(depFileNames(i))
‘ ファイルが存在するかどうかをFileSystemObjectで高速チェック
If Not fso.FileExists(filePath) Then
missingCount = missingCount + 1
missingList = missingList & “・ ” & filePath & vbCrLf
End If
Next i
‘ 4. 結果のレポート
If missingCount > 0 Then
MsgBox “【警告】以下の構成部品が見つかりません!(合計 ” & missingCount & ” 件)” & vbCrLf & vbCrLf & missingList, _
vbCritical, “部品欠損チェック結果”
Else
MsgBox “素晴らしい!アセンブリの構成部品はすべて揃っています。”, vbInformation, “部品欠損チェック結果”
End If
End Sub
—
コードの重要なポイント(知的なエンジニアの解説)
初心者のうちは、コードの中の「おや?」と思う部分がいくつかあるはず。ここを丁寧に解説しますね。
① なぜアセンブリを開かなくていいの?
`swApp.GetDocumentDependencies2` は、SolidWorksの裏側にある「ファイル管理データベース」の機能に直接アクセスしています。そのため、画面の描画エンジン(Graphics)を起動する必要が一切ありません。これが「爆速」の秘密です。
② 返り値の配列の罠に注意
このAPIが返す `depFileNames` は、VBAの「1次元配列」ですが、中身の持ち方に少しクセがあります。
基本的には参照されているファイルのフルパスが順番に格納されますが、SolidWorksのバージョンや内部仕様によっては、偶数・奇数のインデックスにファイル名以外の情報が混ざることがあります。
今回のコードでは安全のために `FileExists` で一つずつ実존確認を行っているため、万が一パス以外の文字列が混ざっても「ファイルが存在しない」と判定されて適切に弾かれます。ここが実務で耐えうる頑健性(ロバストネス)のポイントです。
③ FileSystemObject (FSO) の活用
ファイルの存在確認には、VBA標準の `Dir関数` よりも、`Scripting.FileSystemObject` の `FileExists` メソッドを使う方が安全で高速です。特にフルパスの長さに強く、エラーを起こしにくいというメリットがあります。
—
陥りやすいエラーと対策
1. パスの区切り文字エラー
- Windowsのパス区切りの `\` (バックスラッシュ)は、VBA内では特殊文字扱いになることがありますが、文字列変数に代入する分には通常そのまま通ります。ただし、変数を結合する際はスラッシュの抜け落ちに注意してください。
2. 参照ファイルが「仮想構成部品 (Virtual Component)」の場合
- アセンブリの中に直接保存されている仮想構成部品(アセンブリファイル内にデータが内包されているもの)は、外部ファイルとして存在しないため、通常のパスチェックでは引っかからない場合があります。実務で仮想部品を多用している場合は、その挙動も頭の片隅に置いておきましょう。
—
まとめ
いかがでしたか?
今回は「アセンブリファイルを開かずに、バックグラウンドで構成部品の存在チェックを行う高速ファイル検証術」を解説しました。
- 画面を開かずにAPIを叩くことで、処理速度が劇的に向上する。
- `GetDocumentDependencies2` を使えば、一瞬で参照関係のパスリストが手に入る。
- FileSystemObjectと組み合わせることで、自動化のエラーを未然に防げる。
ここをクリアできれば、あなたの作るマクロは単なる「お助けツール」から、現場を救う「堅牢な業務システム」へと進化します。
ぜひ明日の業務から試してみてくださいね。それでは、次のステップでお会いしましょう!
