【テクニカル・上級編】【SolidWorks VBA超入門】VBEの基本操作とイミディエイトウインドウを使ったオブジェクト構造の覗き方 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

序:CAD自動化の現場における「堕落」と「真実」

数多の製造業の現場を見てきた。そこには、マウスをクリックし続ける人間の手首の痛みと、場当たり的にネットの断片をコピペした「ゴミのようなVBAコード」が溢れている。

「動けばいい」という甘言は、アセンブリの大規模化、コンフィギュレーションの爆発、そして図面枚数の増大という現実の前に、必ずや破綻する。SolidWorks APIは、COM(Component Object Model)の深淵の上に成り立っている。メモリリーク、ゾンビプロセスの発生、そして不意のクラッシュ。これらを制御下に置くためには、VBE(Visual Basic Editor)の表層を撫でるだけの学習など百害あって一利なしだ。

本稿では、全てのCAD自動化の起点となる「VBEの環境設定」と、APIの内部構造を暴く「イミディエイトウインドウの極限活用法」について、シニアエンジニアの視座から叩き込む。

1. 開発環境の要塞化:VBEの真のポテンシャルを引き出す設定

多くの初心者が、デフォルトのVBEのままコーディングという名の苦行に挑んでいる。これは夜間に無灯火で高速道路を逆走するようなものだ。まずは開発環境を「要塞化」する。

必須設定:変数の明示的宣言(Option Explicit)

VBAの最大の悪習は、変数を宣言せずに使えることだ。タイプミスによるバグは、デバッグの時間を無駄に溶かす。

1. VBEを開く(`Alt + F11`)。
2. メニューバーの `ツール` > `オプション` を開く。
3. `[編集]` タブの 「変数の宣言を強制する (Require Variable Declaration)」 にチェックを入れる。

これにより、新規作成されるすべてのモジュールの先頭に強制的に `Option Explicit` が挿入される。型安全性の確保は、プロフェッショナルの第一歩である。

マクロセキュリティと外部参照の罠

SolidWorksマクロを実行する際、セキュリティの壁に阻まれる者は多い。

  • `オプション` > `マクロセキュリティ` から、開発元が信頼できるマクロのみ、あるいは警告を表示して有効化する設定を確認せよ。

また、早期バインド(Early Binding)を行うための参照設定(`SldWorks x.x Type Library` および `SolidWorks constants x.x Type Library`)の導入は、IntelliSense(入力補完)を有効化し、開発効率を爆発的に向上させる。しかし、バージョン互換性のリスク(遅延バインド / Late Bindingとのトレードオフ)を常に意識せよ。

2. オブジェクト構造の覗き方:イミディエイトウインドウの魔術

SolidWorks APIの仕様書(API Help)は分厚いが、実際のメモリ上に展開されたオブジェクトがどのような状態にあるかを知るには、VBEのイミディエイトウインドウ(`Ctrl + G`)を使いこなすほかない。

ブレークポイントを張り、実行を一時停止させた状態で、イミディエイトウインドウにコードを打ち込む。これがAPI探索の最短ルートだ。

実践:現在のドキュメント構造を暴く

以下のコードをVBEに貼り付け、適当な部品(Part)またはアセンブリ(Assembly)を開いた状態で `Main` プロシージャにブレークポイントを置き、実行せよ。

Option Explicit

‘ —————————————————————-
‘ 概要: SolidWorksのルートオブジェクトからアクティブドキュメントを安全に取得し、
‘ イミディエイトウインドウへ情報を出力する検証用プロシージャ
‘ —————————————————————-
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim docTitle As String
Dim docType As Long

‘ 1. 実行中のSolidWorksプロセスへの参照を取得 (GetAppDispatchの活用)
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

‘ 2. アクティブなドキュメント(ModelDoc2)を取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation
Exit Sub
End If

‘ 3. イミディエイトウインドウへの出力テスト
Debug.Print “=== アクティブドキュメント解析開始 ===”
Debug.Print “タイトル: ” & swModel.GetTitle()
Debug.Print “ファイルパス: ” & swModel.GetPathName()

‘ ドキュメントタイプの判別 (1:Part, 2:Assembly, 3:Drawing)
docType = swModel.GetType()
Select Case docType
Case swDocPART
Debug.Print “種別: 部品 (Part)”
Case swDocASSEMBLY
Debug.Print “種別: アセンブリ (Assembly)”
Case swDocDRAWING
Debug.Print “種別: 図面 (Drawing)”
Case Else
Debug.Print “種別: 不明”
End Select

Debug.Print “=== 解析完了 ===”

‘ 【極重要】メモリ解放の作法
‘ COMオブジェクトの参照を明示的に破棄し、メモリリークを防ぐ
Set swModel = Nothing
Set swApp = Nothing
End Sub

イミディエイトウインドウでの「生SQLならぬ生API」の実行

ブレークポイントで処理が止まっているとき、イミディエイトウインドウに以下のように直接打ち込んで `Enter` を押すことで、オブジェクトの状態をリアルタイムで確認できる。

? swModel.GetTitle()

(アクティブなファイル名が即座に出力される)

さらに、選択されているエンティティの数を調べることも可能だ。

? swModel.Extension.GetSelectionManager.GetSelectedObjectCount2(0)

この「対話的な探索」こそが、APIヘルプの海で溺れかけたときにあなたを救う唯一の羅針盤となる。

3. シニアアーキテクトが教える:オブジェクトライフサイクルとメモリ最適化の極意

ここからが本題だ。多くのVBAプログラマが犯す最大の過ちは、「オブジェクトの解放(Destruction)を放置すること」にある。

VBAのガベージコレクションは頼りにならない。特にSolidWorksのような肥大化したCOMサーバーを相手にする場合、`Set obj = Nothing` を怠ると、バックグラウンドで `SLDWORKS.exe` のゾンビプロセスが残存し、ライセンスを占有し続けたり、メモリリークを引き起こしたりする。

オブジェクト解放の鉄則

1. スコープを最小限に絞る
グローバル変数としてSolidWorksアプリケーションを保持するのは極力避けよ。必要なプロシージャ内で取得し、処理が終わったら即座に解放する。
2. 参照の逆順で破棄する
`App` から `Model`、`Model` から `SelectionManager`、`Component` へと降りていった場合、解放時はその逆、あるいは個別に確実に `Set xxx = Nothing` を実行する。

‘ 悪い例
Dim swApp As SldWorks.SldWorks
Set swApp = New SldWorks.SldWorks ‘ ※無闇にNewしてはならない(既存プロセスと別インスタンスが立ち上がる地獄)

‘ 良い例
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks ‘ 稼働中のインスタンスをフックする
‘ … 処理 …
Set swApp = Nothing ‘ 確実に解放

結:自動化の荒野へ踏み出す者へ

VBEの基本操作とイミディエイトウインドウ。これらは地味な基礎技術に映るかもしれない。だが、数万部品を抱える巨大アセンブリをプログラムで制御する日、あなたを救うのは華やかなコードではない。こうした泥臭いデバッグ手法と、メモリ構造に対する厳格なアプローチなのだ。

恐れるな。オブジェクトモデルはすべてを語っている。イミディエイトウインドウでその内臓を暴き、CADの挙動を完全に支配せよ。

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