【実務・中級編】【外部データ連携】FileSystemObject(FSO)とCSVを用いた、複数パーツのバッチ一括寸法変更&自動リビルドエンジン – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks自動化】数百のバリエーションを秒速生成する「バッチ駆動型エンジン」の極意

SolidWorksの自動化において、GUIをポチポチ操作するのは「自動化」ではない。それは単なる「ロボットごっこ」だ。真の自動化エンジニアが目指すべきは、「データが入力された瞬間、SolidWorksが黙々と幾何学的演算を完遂し、成果物を吐き出す」という、堅牢なバックエンド処理である。

今回は、CSVデータを読み込み、パーツの寸法を動的に書き換え、リビルド・保存を繰り返す「バッチ駆動型エンジン」の設計思想を伝授する。

1. 勘違いが生む「死のコード」:なぜあなたの自動化は止まるのか

多くの初学者が陥る罠は、「Objectを生成しっぱなしにする」ことだ。
SolidWorks APIは、メモリ管理が極めてシビアだ。ループ内で`swApp.OpenDoc6`を繰り返す際、参照を適切に解放(`Set swDoc = Nothing`)しなければ、数件の処理でメモリリークを引き起こし、SolidWorksは無情にもクラッシュする。

また、`DoEvents`を乱用して処理を待つのは三流のやり方だ。真のエンジニアは、`swModel.ForceRebuild3`の完了を検知し、APIのレスポンスを待機する「同期設計」を徹底する。

2. 堅牢な設計:FileSystemObject (FSO) による安全なデータパイプライン

ファイルを扱う際、`Open #1`のような古いVB構文を使うのは今すぐやめろ。例外処理(Error Handling)が貧弱で、ファイルロックに非常に弱い。
現代のVBA開発において、`Scripting.FileSystemObject`は標準装備だ。これを用い、CSVのパスチェックから読み込みまでをカプセル化する。

3. プロダクション・コード:バッチリビルド・エンジンの実装例

以下は、実務でそのまま転用可能な「パーツ寸法一括更新エンジン」のテンプレートだ。

Option Explicit

‘ 必要な参照設定: Microsoft Scripting Runtime
‘ 役割: CSVに従い、対象パーツの寸法を書き換え、保存するエンジン
Sub BatchUpdatePartEngine()
Dim fso As New FileSystemObject
Dim ts As TextStream
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDim As SldWorks.Dimension
Dim csvPath As String, line As String, data() As String

Set swApp = Application.SldWorks
csvPath = “C:\Data\PartsList.csv”

If Not fso.FileExists(csvPath) Then Exit Sub

Set ts = fso.OpenTextFile(csvPath, ForReading)

‘ ヘッダーをスキップ
If Not ts.AtEndOfStream Then ts.SkipLine

On Error GoTo ErrorHandler

Do While Not ts.AtEndOfStream
line = ts.ReadLine
data = Split(line, “,”) ‘ CSVカラム構成: [ファイルパス, 寸法名, 値]

‘ パーツを開く (Visible:=Falseでバックグラウンド実行)
Set swModel = swApp.OpenDoc6(data(0), swDocPART, swOpenDocOptions_Silent, “”, 0, 0)

‘ 寸法の検索と変更
Set swDim = swModel.Parameter(data(1))
If Not swDim Is Nothing Then
swDim.SystemValue = CDbl(data(2)) / 1000 ‘ mm -> mへの変換

‘ リビルド実行
swModel.ForceRebuild3 False

‘ 保存して閉じる
swModel.Save
swApp.CloseDoc swModel.GetTitle
End If

‘ メモリ解放の徹底
Set swModel = Nothing
Loop

ts.Close
MsgBox “全バッチ処理完了”
Exit Sub

ErrorHandler:
Debug.Print “Error: ” & Err.Description
Resume Next
End Sub

4. 現場で生き残るための「3つの鉄則」

① パスと単位の正規化を怠るな

APIはメートル法(m)で動作する。CSVの値がミリメートル(mm)である場合、必ずコード内で `/ 1000` を適用しろ。これを忘れると、パーツが1000倍のサイズで生成されるという悲劇が起きる。

② モデルのコンフィギュレーション(設定)を意識せよ

大規模なパーツ変更を行う場合、コンフィギュレーションを切り替えて変更する方が、ファイルを新規保存するより遥かに高速だ。`swModel.ShowConfiguration2(“Default”)`を活用し、単一ファイル内のバリエーション管理に持ち込むのが、ディスクI/Oを減らす秘訣である。

③ 「ログ」という名の命綱

数千件の処理を走らせるなら、処理結果(成功/失敗)を別ファイルに書き出すログ機能を必ず実装しろ。どこで止まったのか、なぜ止まったのかを追跡できないプログラムは、現場では「ただの爆弾」だ。

結論:エンジニアリングの美学

VBAは古臭い言語だと言われる。しかし、SolidWorksのAPIを叩く際、その制約の中でいかに「疎結合」で「堅牢」な構造を組めるかは、設計者の腕の見せ所だ。
今回提示したコードをベースに、君たちの現場の要件に合わせて拡張してほしい。

「コードを書き換えるのではなく、データを書き換えるだけで製品が変わる」。
これこそが、我々が目指すべきエンジニアリングの到達点だ。健闘を祈る。

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