【入門編】【数式・グローバル変数】EquationMgr.DeleteEquationを用いた不要なパーツ内数式の動的クリーンアップと最適化 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩抜け出して、「自分の手で自由自在にCADを操りたい!」そう思ってこのページにたどり着いたあなたは、すでにエンジニアとして素晴らしい一歩を踏み出しています。

今回は、実務で必ず直面する「パーツ内数式(グローバル変数)の動的クリーンアップ」という、ちょっと渋くて最高に実用的なテーマを一緒にクリアしていきましょう。

ここをマスターすれば、設計変更の嵐に巻き込まれてもエラーを出さない、タフでスマートな自動化ツールが作れるようになりますよ。しっかりついてきてくださいね!

1. なぜ「数式のクリーンアップ」が必要なのか?

パーツを設計していると、寸法同士を繋ぐために「数式(Equation)」や「グローバル変数」をたくさん登録しますよね。
「$A$という穴の径は、$B$の板厚の半分にする」といった具合です。

しかし、設計変更でそのフィーチャ自体が消えてしまったとき、SolidWorksの内部はどうなるでしょうか?
数式マネージャの中には、「参照先を失ったゾンビのような数式やグローバル変数」が残され続けます。これが原因でモデルの再構築(Rebuild)時にエラーが発生したり、予期せぬ挙動を引き起こす悪の根源となります。

手動で消すのは面倒ですし、何よりダサい。だからこそ、VBAを使って一網打尽に綺麗にするスキルが必要なのです。

2. SolidWorks APIの心臓部:EquationMgrの正体

SolidWorksで数式を操作するには、`EquationMgr`(数式マネージャ)というオブジェクトを使います。
これは、パーツ(PartDoc)やアセンブリ(AssemblyDoc)の裏側にこっそり隠れている「数式の管理人」のような存在です。

パーツドキュメントからこの管理人を呼び出す基本の構文はこうです。

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEqMgr As SldWorks.EquationMgr

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swEqMgr = swModel.GetEquationMgr

この `swEqMgr` さえ手に入れば、数式の追加、変更、そして今回の主役である削除が自由自在に行えるようになります。

3. ここが罠!「インデックスのズレ」という悪夢

さて、ここからがプログラミングの腕の見せ所です。
「不要な数式を上から順に消していこう!」と思って、次のようなコードを書いたとします。

‘ 【やってはいけないアンチパターンの例】
Dim i As Long
For i = 0 To swEqMgr.GetCount – 1
‘ 条件に合致したら消す!
swEqMgr.Delete i ‘ ← これ、絶対にダメ!
Next i

なぜこれがダメだかわかりますか?
数式を削除した瞬間、配列のインデックスが「カチッ」と繰り上がってしまうからです。
例えば、インデックス `0` を消すと、元々 `1` だったものが `0` に繰り上がります。その状態で次のループに進むと、消すべきだった数式を飛ばしてしまったり、存在しないインデックスを指定してランタイムエラー(実行時エラー)でマクロがクラッシュします。

これが、実務の現場で初心者が必ずハマる「インデックスのズレ地獄」です。

4. 解決策:逆順ループ(後ろから消す)の美学

この問題をスマートに、かつ絶対に破綻しない形で解決する唯一の解法が、「後ろから数える(デクリメント・ループ)」です。

リストの末尾から先頭に向かって削除していけば、たとえ途中の要素を消しても、それより若い番号のインデックスには一切影響を与えません。

それでは、実務でそのまま使える完璧なクリーンアップコードを公開しましょう!

5. 【実践コード】不要なグローバル変数・数式を一括削除するマクロ

以下のコードは、指定したキーワード(例:”Old_”で始まるものなど)が含まれる数式、あるいは参照切れを起こした無効な数式を、後ろから安全に削除するプロシージャです。

Sub CleanUpEquations()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEqMgr As SldWorks.EquationMgr

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ アクティブドキュメントがパーツまたはアセンブリかチェック
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

‘ EquationMgrを取得
Set swEqMgr = swModel.GetEquationMgr
If swEqMgr Is Nothing Then
MsgBox “数式マネージャを取得できませんでした。”, vbCritical
Exit Sub
End If

Dim totalCount As Long
totalCount = swEqMgr.GetCount

If totalCount = 0 Then
MsgBox “登録されている数式はありません。”, vbInformation
Exit Sub
End If

Dim i As Long
Dim eqString As String
Dim deletedCount As Long
deletedCount = 0

‘ 【重要】インデックスのズレを防ぐため、必ず「後ろから(Count – 1 から 0 へ)」ループを回す!
For i = totalCount – 1 To 0 Step -1

‘ 数式の文字列を取得(例: “D1@Boss-Extrude1 = 50” や “GlobalVar = 10″)
eqString = swEqMgr.Equation(i)

‘ — 削除判定ロジック —
‘ ここでは例として、名前に “Temp_” または “Old_” が含まれるものを削除対象とします
‘ 実務の要件に合わせてこの条件分岐を書き換えてください
If InStr(eqString, “Temp_”) > 0 Or InStr(eqString, “Old_”) > 0 Then

‘ 削除実行
swEqMgr.Delete i
deletedCount = deletedCount + 1

End If

Next i

‘ 変更を反映するためにモデルを再構築
swModel.ForceRebuild3 False

‘ 完了報告
MsgBox “クリーンアップが完了しました。” & vbCrLf & _
“削除された不要な数式/変数: ” & deletedCount & “件”, vbInformation

End Sub

6. コードの解説とエンジニアの知恵

  • `Step -1` の魔法

先ほど解説した通り、末尾から先頭へ向かって処理を行うことで、配列のインデックス変動によるバグを完全にシャットアウトしています。SolidWorksのAPI操作において、コレクションやインデックスを扱うループの基本中の基本です。

  • `InStr` 関数による柔軟なフィルタリング

「どんな基準で消すべきか?」は設計者によって異なります。今回はサンプルとして `”Temp_”` や `”Old_”` という文字列を検知して消すようにしていますが、ここを拡張すれば、「特定のフィーチャ名が含まれる行」をすべて掃除することも可能です。

  • `ForceRebuild3` による確実な反映

数式をごっそり消した後は、モデルの整合性を保つために必ず再構築(Rebuild)をかけましょう。これをサボると、画面上の見た目と内部データにズレが生じ、次の操作で思わぬエラーを招きます。

まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!

お疲れ様でした!今回は少し踏み込んだ「配列のインデックス制御」と「EquationMgrのライフサイクル」に触れました。

マクロの記録では絶対にたどり着けない、「ロジックでCADを支配する感覚」を少しでも味わっていただけたでしょうか?
インデックスのズレを防ぐ逆順ループの考え方は、数式だけでなく、フィーチャの削除や図面ビューの操作など、あらゆるSolidWorks APIの自動化に応用できる普遍的なテクニックです。

この知見をあなたの武器にして、日々の面倒な設計業務をスマートに自動化しちゃってくださいね。
それでは、次のステップでお会いしましょう!エンジニアライフを応援しています!

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