SolidWorks自動化の真髄:Excel駆動による「動的ジオメトリ生成」の極北
SolidWorksのAPIは強力だ。しかし、多くのエンジニアが「動けばいい」というレベルでコードを書き、メモリリークの地雷原を歩いている。特に、Excelからパラメータを流し込み、パーツを自動生成するようなシステムは、設計の自動化において最も基本的でありながら、最も「設計者の資質」が問われる領域だ。
今日は、場当たり的なマクロではなく、量産設計の現場で通用する「堅牢な自動構築アーキテクチャ」の核心を解説する。
—
1. オブジェクトのライフサイクルと解放の哲学
VBAにおいて、`SldWorks.Application`や`ModelDoc2`を単に「変数」として扱うのは素人の所業だ。COMオブジェクトは参照カウンタによって管理されている。特にループ内でオブジェクトを生成し、明示的に解放しないコードは、数千回の生成プロセスを繰り返すとメモリを食いつぶし、SolidWorksをクラッシュさせる。
鉄則:オブジェクトのスコープと解放
‘ 悪い例:Setを繰り返すだけで放置する
‘ 良い例:必ずNothingを代入し、ガベージコレクションを促す
Set swPart = swApp.NewDocument(…)
‘ … 処理 …
Set swPart = Nothing ‘ ここで確実に解放する
—
2. Excelデータからパーツを構築する「堅牢な設計」
単に寸法を書き換えるだけでは不十分だ。フィーチャの再構築失敗(Rebuild Error)を検知し、ログとして吐き出す仕組みが不可欠である。以下のコードは、Excelから読み取ったパラメータでベースフィーチャを駆動させるためのコア・パターンだ。
実装コード:パラメータ駆動型ジェネレーター
Option Explicit
‘ SolidWorks API 定数(早期バインディング推奨)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Sub GeneratePartFromExcel()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(“Sheet1”)
‘ SolidWorksプロセスへの接続(既存があれば掴む)
Set swApp = GetObject(, “SldWorks.Application”)
‘ 新規パーツ作成
Set swModel = swApp.NewDocument(“Part”, 0, 0, 0)
‘ 処理の高速化:UI更新を一時停止
swApp.Frame.KeepAlive = True
‘ 寸法変更と更新のループ
Dim width As Double, thickness As Double
width = ws.Range(“B2”).Value / 1000 ‘ mm to meters
thickness = ws.Range(“B3”).Value / 1000
‘ フィーチャ操作:寸法値の書き換え
‘ 注: 実際にはスケッチ寸法名を指定して変更する
Call UpdateDimension(swModel, “D1@Sketch1”, width)
Call UpdateDimension(swModel, “D2@Sketch1”, thickness)
‘ 再構築の強制
swModel.EditRebuild3
‘ 後始末
Set swModel = Nothing
Set swApp = Nothing
End Sub
Private Sub UpdateDimension(model As ModelDoc2, dimName As String, val As Double)
Dim swDim As Dimension
Set swDim = model.Parameter(dimName)
If Not swDim Is Nothing Then
swDim.SystemValue = val
Else
Err.Raise vbError, “UpdateDimension”, “寸法が見つかりません: ” & dimName
End If
End Sub
—
3. レガシー環境を生き抜くための「APIの守護者」
大規模な社内システムでは、SolidWorksのバージョンアップに伴うAPIの挙動変化が最大の敵となる。
- 遅延バインディングと早期バインディングの使い分け: 開発時は早期バインディング(参照設定)でインテリセンスを活用し、配布時は遅延バインディング(`CreateObject`)を使用することで、バージョン間の互換性エラーを最小化できる。
- Windows APIによるウィンドウ制御: `FindWindow`や`SetForegroundWindow`を使用して、SolidWorksのウィンドウが前面にあるかを確認する。これを行わないと、バックグラウンドでの再構築中にExcelがフォーカスを奪い、APIがタイムアウトする事故が頻発する。
—
4. チーフアーキテクトからの提言:エラーハンドリングの極意
「コードが止まらない」ことは重要だが、「エラーが起きた時に何が起きたか特定できる」ことはもっと重要だ。
自動生成ツールにおいて、`On Error Resume Next`を乱用するのは愚の骨頂だ。私が推奨するのは、各メソッドに「エラーログ書き出し専用の構造」を組み込むことである。
1. Rebuildの成功判定: `swModel.EditRebuild3`の戻り値を常にチェックする。`False`なら、即座にパーツの診断情報をテキストファイルに吐き出し、プロセスを終了させる。
2. 材質の動的適用: 材質ライブラリ(.sldmat)のパスを環境変数として定義し、絶対パスで指定する。相対パスに依存すると、ネットワーク上の共有フォルダでアクセス権エラーを誘発する。
—
結びに:自動化は「設計」である
VBAによる自動化は、単なるコード書きではない。それは、設計者の思考プロセスをアルゴリズムへと昇華させる「設計の再構築」だ。
メモリを解放し、例外を制御し、再現性の高いジオメトリを生成する。この規律を守れる者だけが、真のエンジニアとしてSolidWorksを自在に操ることができる。次のステップでは、このコードをDLL化し、VB.NETから呼び出すことで、VBA特有の脆弱性から脱却する方法を教えよう。
健闘を祈る。
