こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺め、「なんだか動くけれど、他のPCで動かすと形が狂う……」そんな壁にぶ和れていませんか?
実はそれ、SolidWorksの「単位系(ミリメートル・インチ)」の罠が原因です。
今回は、初心者の方が絶対に押さえておくべき、単位ズレを防ぐための極意`SwApp.SetUserPreferenceIntegerValue`の活用術を、優しく、そして本質的なところまで徹底解説します。ここをクリアすれば、あなたのマクロ開発スキルは一気にプロの領域へ近づきますよ。それでは、一緒に見ていきましょう!
—
1. なぜ「単位の混同」グレートトラブルが起きるのか?
SolidWorksを起動しているとき、画面の右下隅を見たことはありますか? そこには「MMGS(ミリメートル・グラム・秒)」や「IPS(インチ・ポンド・秒)」といった単位系が表示されています。
人間は画面を見ているので「あ、今はミリだな」と分かりますが、VBAなどのプログラムはそんな空気は一切読みません。
例えば、コード内で `ExtrudeFeature2` などの押し出し処理を実行するとき、数値として `50` を渡したとします。
- あなたの頭の中:「50 ミリ(5cm)」のつもり
- SolidWorksの裏側の状態:「50 インチ(約1.27メートル)」に設定されていた場合
結果は……想像を絶するような「バケモノ級の巨大な直方体」が画面いっぱいに生成され、PCがフリーズするかと思いましたよね。これが、マクロ開発者が恐れる「単位ズレの呪い」です。
マクロの記録機能は「その瞬間にユーザーが選んでいた単位系」をそのままコード化するため、環境が変わると全く予期せぬ挙動を引き起こすのです。
—
2. 解決の切り札:`SetUserPreferenceIntegerValue` とは?
この恐怖の単位ズレを根絶するためには、「マクロが実行された瞬間に、ドキュメントの単位系を強制的にミリ(あるいはインチ)に固定する」というアプローチを取ります。
そこで登場するのが、SolidWorksアプリケーション全体の設定をプログラムから書き換えるメソッド、`SwApp.SetUserPreferenceIntegerValue` です。
これを使うことで、ユーザーがどんな単位系でSolidWorksを起動していようとも、マクロが強制的に「今からミリメートル系で処理するぞ!」と裏側で設定を上書きしてくれるようになります。
—
3. 【実践】単位系を完全制御するVBAコード
百聞は一見にしかず。実際に新規パーツを作成し、単位系を「MMGS(ミリメートル)」にガッチリ固定してから、安全にスケッチと押し出しを行う実用コードを見てみましょう。
ご自身のSolidWorks VBAエディタ(Alt + F11)に貼り付けて、そのまま実行してみてください。
‘ ==============================================================================
‘ 【テーマ】単位系の混同を防ぎ、強制的にMMGS(ミリメートル)に固定してパーツを作るマクロ
‘ ==============================================================================
Sub CreatePartSafely()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Dim longstatus As Long
‘ 1. SolidWorksアプリケーションのインスタンスを取得
Set swApp = Application.SldWorks
‘ 2. 【最重要】ドキュメントの単位系を強制的に「ミリメートル (MMGS)」に固定する
‘ swUserPreferenceIntegerValue_e.swUnitSystem という定数カテゴリを使用します
‘ 1 = swUnitSystem_MMGS (ミリメートル・グラム・秒)
‘ 2 = swUnitSystem_IPS (インチ・ポンド・秒)
Dim setUnitResult As Boolean
setUnitResult = swApp.SetUserPreferenceIntegerValue(swUnitSystem, 1)
If setUnitResult = False Then
MsgBox “単位系の設定変更に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
‘ 3. 標準の部品テンプレートを使って新規パーツファイルを開く
‘ ※環境によってテンプレートのパスが異なる場合があるため適宜調整してください
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “パーツドキュメントの作成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
‘ 4. ここから先の処理は、確実に「ミリメートル」を前提として記述できる!
‘ 例:前面平面にスケッチを描き、50mmの押し出しを行う想定の処理
‘ (実際のスケッチ・フィーチャ作成コードは省略しますが、ここまでの準備で単位ズレは100%防げます)
MsgBox “単位系を「MMGS(ミリメートル)」に強制固定して、新規パーツを作成しました!”, vbInformation, “成功”
End Sub
コードのここがポイント!
- `swApp.SetUserPreferenceIntegerValue(swUnitSystem, 1)`
これが今回の主役です。第一引数に環境設定の項目(`swUnitSystem`:単位系)、第二引数に「1(=MMGS)」を指定することで、SolidWorks全体の単位設定をプログラム側からねじ伏せて(安全な状態に)統一します。
- 環境に依存しない安定性
この1行をコードの最初(ドキュメント作成の前後)に仕込んでおくだけで、「あれ?他の人のPCだと図形が小さすぎる/大きすぎるぞ?」というトラブルがピタッと止まります。
—
4. 初心者が陥りやすい罠とアドバイス
ここで、現場でよくある失敗パターンもシェアしておきますね。
1. テンプレート依存の罠
「新規ドキュメントを開いた後に単位を変えればいいや」と後回しにすると、パーツテンプレート側でインチがデフォルト設定されていた場合、テンプレート読み込み時の微小な計算やサードパーティ製アドインの挙動で狂いが生じることがあります。ドキュメントを開く前後(または初期化の段階)で設定を叩くのが鉄則です。
2. 定数の値を忘れてしまう問題
`1` がミリ(`MMGS`)、`2` がインチ(`IPS`)……と数字で覚えるのは大変ですよね。慣れてきたらVBAの列挙体(Enum)や定数として分かりやすい名前を定義しておくと、後から見返したときに「お、分かってるね!」と言われるコードになります。
—
まとめ:ここをクリアすれば、基本はバッチリ!
今回は、SolidWorks VBAにおける単位系の混同を防ぐための極意として、`SwApp.SetUserPreferenceIntegerValue` の活用術をご紹介しました。
- マクロはユーザーの画面の単位系を見ていない。だからこそコードで明示的に制御する。
- `swApp.SetUserPreferenceIntegerValue(swUnitSystem, 1)` でMMGS(ミリ)に強制固定する。
- 環境が変わっても意図通りの寸法を保つ、プロの基礎体力を身につける。
このテクニックを身につければ、もう「謎の巨大モデル生成事件」に怯える必要はありません。ぜひ次のマクロ開発から取り入れてみてくださいね。あなたのSolidWorks自動化ライフが、より快適で素晴らしいものになるよう応援しています!
