こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して出てきたコードを眺めるだけの日々は、もうおしまいにしましょう。
今回は、設計現場で最も頭を悩ませる「設計変更に伴う寸法の一括書き換え」をテーマにお話しします。
「複数のパーツの寸法やグローバル変数を、プログラムから一瞬で、しかも安全に書き換えてリビルドしたい」
そんな現場の切実な要望に応えるのが、`EquationMgr`(数式マネージャー)を駆使した高度なVBAテクニックです。
ここをクリアすれば、単なる「お助けマクロ」の枠を超え、あなたも立派なSolidWorks自動化エンジニアの仲間入りです。一緒に本質を学んでいきましょう!
—
なぜ「数式マネージャー(EquationMgr)」なのか?
パーツの寸法を変更するとき、画面を開いて一つひとつのスケッチ寸法をダブルクリックしていませんか?
そんなことをしていたら、パーツの数が10個、100個と増えたときに手作業が追いつかなくなります。また、寸法を直接いじると、設計の意図(デザインインテント)が崩れてエラー(面が消える、エラーマークがつくなど)の温床になります。
そこで使うのが、グローバル変数と数式です。
「親となる変数(例: `Length = 150`)」を定義しておき、各フィーチャの寸法を「`=Length`」のように数式で結んでおく。そうすれば、大元の変数(グローバル変数)の数値を変えるだけで、パーツ全体が綺麗に連動して変形するという、強固な寸法連動ネットワークが構築できます。
今回のゴールは、このネットワークの心臓部である`EquationMgr`をVBAから操り、プログラム側から安全に数式や変数を書き換え、一括リビルドをかけるバッチ処理を実装することです。
—
基本アーキテクチャ:EquationMgrの正体
SolidWorksのドキュメント(PartDoc)には、数式やグローバル変数を統括するマネージャーが内蔵されています。これが `EquationMgr`(EquationManagerオブジェクト) です。
VBAからこのマネージャーにアクセスする基本ルートは以下の通りです。
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
たったこれだけで、パーツの中に存在するすべての数式・グローバル変数へのアクセス権が手に入ります。
—
現場で即戦力となる!数式書き換えバッチコード
それでは、実際に動かせる実用コードを見ていきましょう。
このコードは、アクティブなパーツファイルにアクセスし、特定のグローバル変数(または数式)を検索して、その値をプログラムから書き換え、最後に強制リビルドをかけるものです。
Sub UpdateGlobalVariablesBatch()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEqMgr As SldWorks.EquationMgr
‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “パーツファイルを開いてから実行してください。”, vbCritical, “エラー”
Exit Sub
End If
‘ パーツドキュメント(swDocPART)以外は弾く
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイル専用です。”, vbExclamation, “警告”
Exit Sub
End If
‘ 2. 数式マネージャー(EquationMgr)の取得
Set swEqMgr = swModel.GetEquationMgr
If swEqMgr Is Nothing Then
MsgBox “数式マネージャーを取得できませんでした。”, vbCritical, “エラー”
Exit Sub
End If
‘ 3. 登録されている数式・変数の総数を取得
Dim eqCount As Long
eqCount = swEqMgr.GetEquationCount
If eqCount = 0 Then
MsgBox “このパーツには数式やグローバル変数が登録されていません。”, vbInformation, “情報”
Exit Sub
End If
‘ 4. ループを回して目的の変数を探す & 書き換え
Dim i As Long
Dim targetName As String
Dim found As Boolean
‘ 今回書き換えたいグローバル変数名(例: “Width”)と新しい値(例: “200”)
targetName = “Width”
Dim newValue As Double
newValue = 200.0
found = False
For i = 0 To eqCount – 1
‘ Equation(i) で数式文字列を取得(例: ‘”Width” = 100mm’ のような形式)
Dim currentEq As String
currentEq = swEqMgr.Equation(i)
‘ デバッグ用:イミディエイトウィンドウに現在の数式を出力
Debug.Print “Index ” & i & “: ” & currentEq
‘ ターゲットの変数名が含まれているか簡易チェック
If InStr(1, currentEq, targetName, vbTextCompare) > 0 Then
‘ 【重要】Value2プロパティに直接新しい数式(または値)を設定する
‘ ※スワップする数式の構文は “変数名 = 値” の形式にする必要があります
Dim newEquationString As String
newEquationString = “””” & targetName & “”” = ” & newValue & “mm”
‘ 数式を上書き(インデックスを指定して更新)
swEqMgr.Equation(i) = newEquationString
found = True
Exit For ‘ 見つかったらループを抜ける
End If
Next i
If found Then
‘ 5. 変更を反映させるためのリビルド(強制再構築)
swModel.ForceRebuild3 True
MsgBox “グローバル変数 ‘” & targetName & “‘ を ” & newValue & “mm に更新し、リビルドを実行しました!”, vbInformation, “成功”
Else
MsgBox “指定されたグローバル変数 ‘” & targetName & “‘ が見つかりませんでした。”, vbExclamation, “見つかりません”
End If
End Sub
—
コードの核心を解説:ここがエンジニアの腕の見せ所
初心者の方が躓きやすいポイントと、実務で絶対に知っておくべき「プロの知見」を解説します。
1. `GetEquationCount` とインデックスの仕組み
`swEqMgr.GetEquationCount` は、そのパーツに存在する数式・グローバル変数の総数を返します。
ここで注意しなければならないのは、VBAの配列やコレクションと同様に、インデックスは `0` から始まり、`(総数 – 1)` で終わるという点です。ループを回すときは必ず `For i = 0 To eqCount – 1` と書く癖をつけましょう。
2. `Equation(i)` と文字列の罠
`swEqMgr.Equation(i)` は、その行に登録されている数式を文字列として取得・設定するためのプロパティです。
SolidWorksの数式マネージャーの内部では、グローバル変数は `”Width” = 100mm` のようにダブルクォーテーションで囲まれた名前と、値がイコールで結ばれています。
そのため、VBAから再設定する際も、文字列の中にダブルクォーテーションを正しく含める必要があります(VBA内でのダブルクォーテーションのエスケープ表現:`””””`)。ここをサボると、SolidWorksが数式構文エラーを起こしてしまいます。
3. なぜ `ForceRebuild3` なのか?
寸法や数式をコードから書き換えても、SolidWorksのグラフィック領域やモデルのジオメトリは一瞬で追従しないことがあります(パフォーマンス保護のため)。
そのため、書き換えの処理が終わったあとに、必ず `swModel.ForceRebuild3 True`(すべてのコンフィギュレーションを含めて強制リビルド)を呼び出す必要があります。このひと手間が、バッチ処理の信頼性を飛躍的に高めます。
—
陥りやすいエラーと対策
1. 「数式にエラーがあります」とポップアップが出る
- 原因: 代入する文字列の構文が間違っています(単位の抜け、ダブルクォーテーションの不足など)。
- 対策: まずSolidWorksの画面上の数式マネージャーで手動入力が正常に通るか確認し、その構文をそのままVBAの文字列構築に落とし込みましょう。
2. インデックスがズレて意図しない寸法が変わる
- 原因: 数式を追加・削除すると、インデックス番号(配列の順番)が変動します。
- 対策: インデックス番号(`i`)をハードコーディング(固定値)で指定するのではなく、今回紹介したようにループで文字列を走査し、変数名で一致するもの(ヒットしたもの)を書き換える手法を必ず採用してください。
—
おわりに
お疲れ様でした!今回は `EquationMgr.GetEquationCount` と `Equation` プロパティを活用した、パーツ内寸法の動的数式書き換えの極意をお伝えしました。
このテクニックをベースに、フォルダ内のすべてのパーツファイルを自動で巡回して一括で数式を書き換える「真のバッチ処理」へと発展させることも容易に可能です。
「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」。
あなたの設計自動化の旅は、ここからさらに加速していきます。次のステップも、一緒に楽しみながら極めていきましょう!
