こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して生成されるコードを眺める段階は、もう卒業しましたか?
「社内サーバーの奥深くにある何千、何万ものSolidWorksファイル……。この中に、古いバージョンのまま放置されているファイルはないか? 参照切れを起こしているデータはないか?」
そんな絶望的な課題に直面したとき、手作業でフォルダを開いて確認していくなんて、エンジニアの人生の無駄遣いです。
今回は、Windowsの標準機能であるFileSystemObject(FSO)の「再帰呼び出し(Recursion)」を駆使し、どんなに階層が深い社内サーバーのフォルダであっても、一網打尽にSolidWorksファイルを探索・検証する「データ整合性チェック基盤」の作り方を授けましょう。
ここをクリアすれば、あなたのSolidWorks VBAスキルは間違いなく中級者から「現場を救う自動化エンジニア」へとステップアップします。さあ、一緒に本質の扉を開きましょう!
—
なぜ「再帰的ファイル探索(FSO)」が必要なのか?
通常、VBAでフォルダ内のファイルを処理する場合、`Dir`関数を使うことが多いはずです。しかし、`Dir`関数には致命的な弱点があります。
それは「サブフォルダの中まで自動で潜っていってくれない」ということ。
社内サーバーのデータ構造を思い浮かべてみてください。
`「プロジェクトA > 2024年度 > 試作機 > 3Dデータ > ユニット1」` のように、何段階もの階層(サブフォルダ)に分かれていますよね。
ここで登場するのが 再帰(Recursion) です。
再帰とは、簡単に言えば「自分自身を呼び出す関数」のこと。
1. あるフォルダの中を覗く
2. ファイルがあれば処理する
3. サブフォルダを見つけたら、「フォルダを覗くこのプログラム(自分自身)」をもう一度そのサブフォルダに対して実行する
この仕組みを使えば、どれほど深く入り組んだフォルダ構造であっても、たった数行のロジックで全てのファイルを漏れなく拾い上げることができます。
—
現場でそのまま動く!「再帰的ファイル探索・検証基盤」コード
それでは、ExcelのVBAからSolidWorksを裏側で操作し、指定フォルダ以下のすべての`.sldprt`(部品)、`.sldasm`(アセンブリ)を巡回して、ファイルパスとバージョンをイミディエイトウィンドウに出力する実用コードを公開します。
VBAの標準モジュールにコピペし、変数 `TargetFolderPath` のパスをご自身の環境(またはテスト用フォルダ)に書き換えて実行してください。
Option Explicit
‘ グローバル変数としてカウント用変数を定義
Private totalFilesChecked As Long
Sub RunSolidWorksHealthCheck()
Dim fso As Object
Dim TargetFolderPath As String
Dim swApp As Object
Dim startTime As Double
startTime = Timer
totalFilesChecked = 0
‘ 【要変更】スキャンしたい社内サーバー等のルートフォルダパスを指定
TargetFolderPath = “C:\YourCompany\CAD_Data”
‘ 1. FileSystemObjectの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(TargetFolderPath) Then
MsgBox “指定されたフォルダが存在しません:” & TargetFolderPath, vbCritical
Exit Sub
End If
‘ 2. SolidWorksアプリケーションのインスタンスを取得(起動していなければ起動)
On Error Resume Next
Set swApp = GetObject(, “SldWorks.Application”)
If swApp Is Nothing Then
Set swApp = CreateObject(“SldWorks.Application”)
End If
On Error GoTo 0
If swApp Is Nothing Then
MsgBox “SolidWorksを起動できませんでした。”, vbCritical
Exit Sub
End If
‘ 画面描画をフリーズさせて処理速度を爆発的に上げる(超重要テクニック!)
swApp.UserControl = True
swApp.Visible = True
Debug.Print “=== ファイル探索および整合性チェックを開始します ===”
‘ 3. 再帰的探索プロシージャの呼び出し
Call TraverseFolders(fso.GetFolder(TargetFolderPath), swApp)
Debug.Print “=== 処理完了 ===”
Debug.Print “総スキャンファイル数: ” & totalFilesChecked & ” 件”
Debug.Print “処理時間: ” & Format(Timer – startTime, “0.00”) & ” 秒”
‘ オブジェクト解放
Set swApp = Nothing
Set fso = Nothing
MsgBox “全てのチェックが完了しました!結果をイミディエイトウィンドウで確認してください。”, vbInformation
End Sub
‘——————————————————————–
‘ サブフォルダを無限に潜っていく「再帰」の中核プロシージャ
‘——————————————————————–
Private Sub TraverseFolders(ByVal currentFolder As Object, ByVal swApp As Object)
Dim subFolder As Object
Dim file As Object
Dim ext As String
On Error GoTo ErrorHandler
‘ ① 現在のフォルダ内にあるファイルをすべてチェック
For Each file In currentFolder.Files
ext = LCase(swApp.GetFileExtension(file.Name))
‘ 拡張子が SolidWorks の部品(sldprt) または アセンブリ(sldasm) の場合のみ処理
If ext = “sldprt” Or ext = “sldasm” Then
totalFilesChecked = totalFilesChecked + 1
‘ ここでファイルごとの検証処理を実行
Call InspectSolidWorksFile(file.Path, swApp)
End If
Next file
‘ ② 現在のフォルダ内にある「サブフォルダ」をループし、自分自身(TraverseFolders)を再度呼び出す!
For Each subFolder In currentFolder.SubFolders
Call TraverseFolders(subFolder, swApp)
Next subFolder
Exit Sub
ErrorHandler:
‘ アクセス権限がないフォルダなどでエラーが出ても止まらずに続行する頑健性(レジリエンス)
Debug.Print “[警告] アクセスエラーまたはスキップされたパス: ” & currentFolder.Path
Resume Next
End Sub
‘——————————————————————–
‘ 個別のSolidWorksファイルを軽量に検査するロジック
‘——————————————————————–
Private Sub InspectSolidWorksFile(ByVal filePath As String, ByVal swApp As Object)
Dim fileVersion As Long
Dim docType As Long
‘ 設計の現場でありがちなミス:重い図面(slddrw)まで開いてメモリを爆発させないよう配慮
‘ ここではファイルを開かずにバージョン情報を取得するAPIを活用(またはサイレントオープン)
‘ 例としてファイルパスとファイル名を出力
Debug.Print “[” & totalFilesChecked & “] 検出: ” & filePath
‘ 実務ではここに、以下のような処理を組み込みます:
‘ – swApp.GetDocumentVersion(filePath) でバージョン確認
‘ – 参照関係(外部参照の整合性)のチェック
‘ – プロパティ(承認者や材質など)の自動監査
End Sub
—
コードの核心を読み解く:知っておくべき3つのポイント
1. 「自分を呼ぶ」再帰の美しさ
`TraverseFolders` プロシージャの後半を見てください。
サブフォルダを見つけるたびに、再び `TraverseFolders(subFolder, swApp)` を呼び出しています。
これにより、Windowsのフォルダツリーが何階層であっても、コードを追加することなく全自動で全ファイルを網羅できます。これが再帰の魔法です。
2. アクセス権エラー(トラップ)への備え
社内サーバーには、総務系のフォルダやアクセス権が制限されているシークレットなフォルダが混ざっていることがあります。
ここにプログラムが突入すると、VBAは「権限がありません(エラー76)」と言って無慈悲に停止してしまいます。
そのため、`On Error GoTo ErrorHandler` を仕込み、「エラーが出たフォルダはスキップして、次のフォルダへ進む」という頑健性(レジリエンス)を持たせることが、実務エンジニアとしての必須作法です。
3. パフォーマンスの最適化(メモリ管理)
数千・数万のCADファイルを扱うとき、毎回SolidWorksの画面にモデルを完全に表示(描画)させていたら、PCがフリーズするかメモリリークで強制終了します。
実務で大量ファイルを一括処理する際は、「バックグラウンドでサイレントオープンする」「必要なメタデータだけをAPIで高速に取得する」というアプローチを心がけましょう。
—
陥りやすい罠とアドバイス
初学者がこのテーマに挑む際、よくやってしまう失敗がこれです。
> 「コードを実行したら、SolidWorksが裏で何個も立ち上がってPCが重くなった……!」
原因は、ファイルを開いたあとに `Set` したドキュメントオブジェクトをきちんと閉じたり破棄したりしていないからです。
SolidWorks VBAにおいて、メモリの解放(`Set swModel = Nothing` や `swApp.CloseDoc`)を怠ると、OSのメモリを食いつぶし、やがてVBAそのものがクラッシュします。
「開いたものは必ず閉じる」「ループの最後できれいに掃除する」というライフサイクルの管理を徹底してください。
—
ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
お疲れ様でした!FileSystemObjectを使った再帰的ファイル探索の仕組み、そしてSolidWorks APIとの連携のイメージは掴め셨でしょうか?
このベースコードに「古いバージョンのファイルを最新バージョンに一括サイレント保存して置き換える機能」や「図面とモデルの図番不一致を検出するバリデーション機能」を組み込めば、社内で一目置かれる「CAD自動化スペシャリスト」の誕生です。
あなたの自動化ライフの第一歩として、ぜひこのコードをカスタマイズしてみてください。
それでは、次のステップでお会いしましょう!
