【入門編】【FileSystemObjectによる再帰的探索】サブフォルダを完全網羅した社内サーバ内SWファイルの死活・バージョンチェック – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握せよ:FSO再帰探索で実現する「全ファイル・バージョン管理」の極意

こんにちは。現場で泥臭い自動化と格闘し続け、いつの間にか「コードの守護神」と呼ばれるようになったエンジニアです。

「マクロの記録」ボタンを押すだけの卒業生諸君、おめでとう。今日は君たちが次のステージ、すなわち「SolidWorksの深淵」へ足を踏み入れる記念すべき日だ。

今回は、社内サーバーに眠る数千のファイルを一網打尽にし、最新バージョンへマイグレーション(アップグレード)させるための「再帰的ファイル探索ツール」を設計する。単なるコードの写経ではない。SolidWorks APIとOSの境界線を越える、プロの流儀を教えよう。

1. なぜ「FileSystemObject(FSO)」なのか?

ファイル探索において、標準の`Dir`関数を使うのはもうやめよう。あれは古い時代の遺物だ。
我々が採用するのはScripting.FileSystemObject (FSO)

  • 利点: フォルダ階層を「オブジェクト」として扱えるため、再帰処理(自分自身を呼び出す処理)と非常に相性が良い。
  • 注意点: 参照設定(Microsoft Scripting Runtime)を忘れないこと。これがないと、どれだけコードが正しくてもSolidWorksは首を縦に振らない。

2. 魂のコード:再帰的探索の設計図

再帰処理とは「自分のフォルダを調べ、中にフォルダがあればまた自分を呼び出して調べる」というループの連鎖だ。この構造を理解すれば、ディレクトリの深さはもはや障害ではなくなる。

‘ 参照設定: Microsoft Scripting Runtime を有効にしてください
Option Explicit

Dim swApp As SldWorks.SldWorks
Dim fso As Scripting.FileSystemObject

Sub Main()
‘ 1. オブジェクトの初期化(ここが全ての起点)
Set swApp = Application.SldWorks
Set fso = New Scripting.FileSystemObject

Dim rootPath As String
rootPath = “C:\Your\Project\Path” ‘ 探索したいルートフォルダ

‘ 再帰処理の開始
ProcessFolder fso.GetFolder(rootPath)

MsgBox “全ファイルのマイグレーション完了!”, vbInformation
End Sub

Sub ProcessFolder(fldr As Scripting.Folder)
Dim subFldr As Scripting.Folder
Dim file As Scripting.File

‘ 1. 現在のフォルダ内のファイルを走査
For Each file In fldr.Files
If IsSolidWorksFile(file.Name) Then
MigrateFile file.Path
End If
Next

‘ 2. サブフォルダがあれば自分自身を呼び出す(再帰の極意)
For Each subFldr In fldr.SubFolders
ProcessFolder subFldr
Next
End Sub

Function IsSolidWorksFile(fileName As String) As Boolean
‘ 拡張子チェックの簡略版(実務では配列で管理するとスマートだ)
Dim ext As String
ext = LCase(fso.GetExtensionName(fileName))
IsSolidWorksFile = (ext = “sldprt” Or ext = “sldasm” Or ext = “slddrw”)
End Function

Sub MigrateFile(filePath As String)
Dim swModel As SldWorks.ModelDoc2
Dim errors As Long, warnings As Long

‘ ファイルを開く(Visible:=Falseにすると高速化する)
Set swModel = swApp.OpenDoc6(filePath, swDocNONE, swOpenDocOptions_Silent, “”, errors, warnings)

If Not swModel Is Nothing Then
‘ 最新バージョンで保存(ここがマイグレーションの本質)
swApp.SaveAll True
swApp.CloseDoc swModel.GetTitle
End If
End Sub

3. ここをクリアすれば一人前!陥りやすい罠

① 「メモリリーク」という見えない敵

`OpenDoc6`でファイルを開き続け、`CloseDoc`を忘れると、メモリ不足でPCが悲鳴を上げる。必ず`Set swModel = Nothing`で参照を解放する癖をつけよう。大規模なマイグレーションでは、この小さな積み重ねが数時間の差を生む。

② 「読み取り専用」と「参照エラー」

サーバー上のファイルには、他人が開いているものや、読み取り専用の属性がついたものが混ざっている。`OpenDoc6`の引数を適切に設定し、エラーコード(`errors`)を監視して、「開けなかったファイル」をログとして吐き出す実装を加えるのがプロの仕事だ。

③ なぜ「SaveAll」を使うのか?

アセンブリファイルの場合、構成部品(部品ファイル)も同時に最新バージョンへ更新する必要がある。個別に`SaveAs`するよりも、`SaveAll`を賢く使うことで、SolidWorksの内部エンジンに整合性を保たせたまま更新させることができる。

4. 先輩からのアドバイス:君のコードを一段上へ

このツールが完成したら、次は「ログ出力機能」を追加してみよう。

  • どのファイルが変換され、どのファイルが変換に失敗したか。
  • 処理にかかった時間はどれくらいか。

これらをテキストファイルに書き出すだけで、君は単なる「マクロを書ける人」から「業務改善を推進できるエンジニア」へと昇格する。

SolidWorksのAPIは広大で、時に冷酷だ。しかし、オブジェクトモデルの背後にある「SolidWorksの考え方」さえ掴めば、君はもうどんな自動化も恐れる必要はない。

さあ、エディタを開いて。君のサーバーを、君の手で最新の環境へとアップデートしてやってくれ。健闘を祈る!

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