【テクニカル・上級編】【実務効率化】指定した寸法と材質をエクセルから一括読み込みしてパーツモデルを自動生成するツール – SolidWorks VBA解析バイブル

スポンサーリンク

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特有の脆弱性から脱却する方法を教えよう。

健闘を祈る。

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