単位の迷宮を脱出せよ。SolidWorks VBAで図面単位を「ミリメートル」に強制固定する極意
「よし、新しい図面を作成して、自動でビューを配置するマクロを作るぞ!」
そう意気込んでコードを書き始めたあなた。しかし、いざ実行してみると、寸法が「インチ」で表示されたり、スケールが意図しない数値になったりして、頭を抱えたことはありませんか?
実は、SolidWorks VBAの世界において、「単位系(Unit System)」の制御は、初心者が見落としがちな、しかし最も重要な「設計の土台」なのです。
今回は、マクロの記録(レコーディング)という「表面的な操作の記録」から一歩踏み出し、オブジェクトの構造を理解することで、図面作成時の単位系を確実にミリメートル(MMGS)へ強制設定する、堅牢なコードの書き方を伝授します。
ここをクリアすれば、あなたの自動化プログラムは、プロが使う「道具」へと進化します。
1. なぜ「マクロの記録」では単位設定がうまくいかないのか?
多くの初心者は、SolidWorksのメニューから「単位」を変更し、その操作を「マクロの記録」で録画します。しかし、記録されたコードを見てみてください。おそらく、あなたが期待する「単位系をミリメートルにする」という明確な命令ではなく、「特定のボタンをクリックした」という断片的な動作が並んでいるはずです。
これでは、作成する図面ファイルのコンテキスト(文脈)が変わった瞬間に、マクロは沈黙します。
アーキテクトの視点:オブジェクトモデルを理解する
SolidWorks VBAを掌握するコツは、「今、どのオブジェクトに対して命令を下しているのか」を意識することです。
単位を変更するということは、図面ファイルそのもの(`ModelDoc2`)が持つ、設定プロパティ(`Document Properties`)を書き換える行為です。ボタンを押すのではなく、「ドキュメントの属性を、ミリメートルという状態へ遷移させる」。この思考の切り替えが、自動化エンジニアへの第一歩です。
2. 実践:単位系をミリメートルに強制する黄金のスクリプト
それでは、実際に使えるコードを見ていきましょう。単に動くだけでなく、エラーを防ぎ、読みやすく設計した「プロ仕様」の構成です。
Option Explicit
'' <summary>
''' アクティブな図面ドキュメントの単位系をミリメートル(MMGS)に強制設定するマクロ
''' </summary>
Sub Main()
' --- 1. 変数の宣言 (メモリを効率的に使うための作法) ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension
Dim errorCode As Long
' --- 2. SolidWorksアプリケーションへの接続 ---
Set swApp = Application.SldWorks
' --- 3. 現在開いているドキュメントの取得 ---
Set swModel = swApp.ActiveDoc
' --- 4. 安全装置:ドキュメントが開かれているか、図面であるかを確認 ---
If swModel Is Nothing Then
MsgBox "エラー: ドキュメントが開かれていません。", vbCritical
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox "エラー: このマクロは「図面ファイル」専用です。", vbExclamation
Exit Sub
End If
' --- 5. 単位系の設定実行 ---
' Extensionオブジェクトを介して、ドキュメントのユーザー設定(単位系)にアクセスします
Set swExt = swModel.Extension
' swUnitSystem_e.swUnitSystem_MMGS は 「ミリメートル、グラム、秒」を意味する定数です
' これを直接指定することで、設定画面を介さず、内部パラメータを直接書き換えます
errorCode = swExt.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swUnitSystem, swUnitSystem_e.swUnitSystem_MMGS)
' --- 6. 結果の判定とフィードバック ---
If errorCode = 0 Then
' 成功時:リフレッシュして変更を反映させる
swModel.ForceRebuild3 True
Debug.Print "単位系をミリメートルに設定しました。"
Else
' 失敗時
MsgBox "単位系の設定に失敗しました。エラーコード: " & errorCode, vbCritical
End If
End Sub
3. コードの深層解剖:何が起きているのか?
このコードがなぜ「強い」のか。その理由を、3つの重要な要素に分解して解説します。
① `swDocDRAWING` による型チェック(ガード句)
初心者が最も陥りやすいのが、「パーツファイルで図面用マクロを実行してエラーで止まる」というミスです。
`swModel.GetType <> swDocDRAWING` という一行を入れることで、「もし図面じゃなければ、何もしないで終了する」という安全装置を設けています。これをプロの世界では「ガード句」と呼びます。
② `swUnitSystem_e.swUnitSystem_MMGS` という「言葉」
ここが魔法の核心です。
SolidWorks APIには、膨大な「定数(Enum)」が用意されています。
- `swUnitSystem_MMGS`: ミリメートル、グラム、秒(Metric)
- `swUnitSystem_IPS`: インチ、ポンド、秒(Imperial)
マクロの記録では、単なる数字(例: `1`)として記録されることがありますが、コードの中に直接 `swUnitSystem_MMGS` と書くことで、「誰が読んでも、何をしているかが一目でわかる」読みやすいコードになります。
③ `ForceRebuild3` による同期
設定値を書き換えただけでは、画面上の表示が古いまま(インチのまま)に見えることがあります。`ForceRebuild3` を実行することで、SolidWorksに「設定が変わったから、画面をすべて描き直して!」と強制的に命令を出し、表示と実態を一致させています。
4. 陥りやすい罠:システム設定 vs ドキュメント設定
ここで、伝説のアーキテクトから一つ、重要なアドバイスを授けましょう。
SolidWorksには、「システムオプション(すべてのファイルに適用される設定)」と「ドキュメントプロパティ(今開いているファイルだけの設定)」の2種類があります。
今回ご紹介したコードは、「ドキュメントプロパティ」を書き換えるものです。
「マクロを実行した瞬間に、そのファイルがミリメートルになる」という挙動です。
もし、あなたが「これから作るすべての新規ファイルが最初からミリメートルであってほしい」と願うなら、それはVBAの領域ではなく、SolidWorksの「システムオプション」の設定領域です。
「マクロは、今そこにあるオブジェクトを、理想の状態へ導くためのもの」
この違いを理解しておくと、デバッグ(修正)の際に「コードが悪いのか、環境設定が悪いのか」を瞬時に判断できるようになります。
まとめ:次の一歩へ
おめでとうございます。あなたは今、単なる「操作の記録」を超えて、「オブジェクトの属性を直接制御する」という、真の自動化エンジニアの入り口に立ちました。
今回学んだ「型チェック」「定数による明示的な指定」「リフレッシュ」のテクニックは、図面作成だけでなく、パーツの厚み変更や、アセンブリの構成変更など、あらゆる自動化に応用できる普遍的な技術です。
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
さあ、次はビューの配置や、図枠の自動生成に挑戦してみましょう。道は続いています。
