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

スポンサーリンク

SolidWorks自動化の真髄:Excel駆動型パーツ生成器を「壊れない」設計で構築する

SolidWorksの自動化において、多くのエンジニアが陥る罠がある。それは「とりあえず動くコード」を量産し、モデルの再構築エラーやリソースリークに悩まされるという結末だ。

私はこれまで数多くの自動化プロジェクトを指揮してきたが、「堅牢な設計」とは、SolidWorksの内部挙動(再構築サイクル)を制御下に置くことから始まる。

今回は、Excelからパラメータを読み込み、パーツを自動生成するツールを「プロダクションレベル」で実装するための知見を共有する。

1. なぜ「小手先の自動化」は失敗するのか

多くのコードが陥る失敗は、`Model.Parameter(“D1@Sketch1”).SystemValue = …` を漫然と繰り返すことだ。これでは、フィーチャの再構築順序が制御できず、依存関係の解決に失敗し、最終的にモデルが「警告だらけの赤信号」状態になる。

プロの鉄則:
1. フィーチャの順序を意識せよ: スケッチ寸法を操作した直後に `ForceRebuild3` を呼ぶのは素人だ。全てのパラメータを更新した後、最後に一括で再構築をかける。
2. エラーハンドリングの徹底: SolidWorksのAPIは、処理が失敗しても例外を投げないことが多い。戻り値(`retval`)を必ず確認し、失敗時は即座にログを吐いて中断せよ。
3. オブジェクトの解放: `Set swApp = Nothing` だけでは足りない。ループ処理では必ずメモリを意識し、COMオブジェクトを明示的に解放する癖をつけろ。

2. 実装の設計図:Excel連携のアーキテクチャ

Excelからデータを読み込む際、セルを一つずつ読み取ってAPIを叩くのは低速だ。一度、メモリ上の配列(`Variant`型)にデータを格納してから処理を行うのが定石である。

プロダクションコード:パーツ自動生成モジュール

以下のコードは、指定された寸法(厚み、幅、長さ)を元に、ベースとなる押し出しフィーチャを更新する骨子だ。

Option Explicit

‘ 必要な定数の定義(SolidWorks API Constants)
Const swRebuildAll As Long = 2

Public Sub GeneratePartFromExcel()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim excelData As Variant

‘ 1. SolidWorksとの接続
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “パーツファイルを開いてください。”, vbCritical
Exit Sub
End If

‘ 2. Excelのデータを一括取得(シート名は適宜変更)
excelData = ThisWorkbook.Sheets(“Data”).Range(“A2:C2”).Value

‘ 3. パラメータの更新(一括で値を書き込む)
On Error GoTo ErrorHandler

‘ パラメータ更新ロジック
UpdateDimension swModel, “D1@Sketch1”, excelData(1, 1) ‘ 長さ
UpdateDimension swModel, “D2@Sketch1”, excelData(1, 2) ‘ 幅
UpdateDimension swModel, “D1@Boss-Extrude1”, excelData(1, 3) ‘ 板厚

‘ 4. 最後に一度だけ再構築(これがパフォーマンスの鍵)
swModel.ForceRebuild3 False

MsgBox “生成完了”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

‘ 寸法更新をラップする汎用関数
Private Sub UpdateDimension(model As ModelDoc2, dimName As String, value As Double)
Dim swDim As SldWorks.Dimension
Set swDim = model.Parameter(dimName)

If Not swDim Is Nothing Then
swDim.SystemValue = value / 1000 ‘ mmからメートル単位へ変換
Else
Err.Raise vbObjectError + 1, , “寸法が見つかりません: ” & dimName
End If
End Sub

3. 現場で生き残るための「高度な注意点」

A. 寸法単位の罠

SolidWorksのAPIにおける寸法単位は、常に「メートル」である。Excel側の単位がミリメートルであっても、必ずプログラム内で `/ 1000` を行い、単位変換を明示せよ。これを怠ると、スケールが1000倍のモデルが生成され、デバッグで頭を抱えることになる。

B. コンフィギュレーションの活用

同じ形状でサイズ違いを量産する場合、フィーチャを書き換えるのではなく、「コンフィギュレーション(設定)」をAPIで自動生成・切り替えする手法を強く推奨する。これにより、履歴を汚さずにバリエーション管理が可能になる。

C. 材質(Material)の動的変更

材質の適用は `PartDoc.SetMaterialPropertyName2` を使用する。ただし、材質ファイル(.sldmat)のパスが環境によって異なる場合があるため、`GetMaterialPropertyName` で事前に現在の状態を確認するガード句を入れることが、壊れないツールへの第一歩だ。

まとめ:次に進むべきステップ

この記事のコードはあくまで「最小構成」だ。実務では、ここから「エラーログの外部テキスト出力」や「生成後のPDF・図面一括作成」へと機能を拡張していくことになる。

自動化エンジニアとしての価値は、「誰が使ってもエラーが出ないツール」をどれだけ簡潔に書けるかで決まる。泥臭い再構築エラーとの戦いを楽しめるようになった時、君は真のエンジニアとして頭一つ抜けるはずだ。

次は、生成したパーツの「干渉チェック」までを自動化するモジュールについて書く予定だ。期待していてほしい。

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