【SolidWorks VBA超入門】VBEの初期設定とマクロセキュリティ解除から始める最初のデバッグ
世に「マクロの記録」から始まるVBA入門書は数あれど、実務の現場――それも数千点の部品を持つアセンブリや、複雑なコンフィギュレーションを抱えるレガシーな設計環境において、素人が書いたコードがいかに無力であるかを知る者は少ない。
SolidWorks VBA(実際にはSldWorks ApplicationとCOMオブジェクト群)は、単なるExcelの延長線上のオモチャではない。背後で強大なC++のコアエンジンが唸りをあげており、一歩実装を誤れば、メモリリークの嵐、未解放のCOMポインタによるSolidWorksプロセスのゾンビ化、そして最悪の場合は数時間分の設計データを吹き飛ばすクラッシュを引き起こす。
今回は、その修羅の道へ足を踏み入れる第一歩として、VBE(Visual Basic Editor)の厳格な初期設定、セキュリティの罠の回避、そしてプロフェッショナルとして最初に身につけなければならない「オブジェクトのライフサイクル管理」の基礎を叩き込む。
—
1. 開発環境の要塞化:VBEの初期設定と隠しコマンド
SolidWorks内蔵のVBEを開く(`Alt + F11`)だけなら誰でもできる。しかし、プロのエンジニアはIDEを開いた瞬間に行うべき儀式がある。これを怠る者は、デバッグの神に見放される。
必須設定:変数の宣言を強制する
モジュールの先頭に必ず `Option Explicit` を自動挿入させる設定は、プログラミングにおける最低限の衛生管理である。
1. VBEメニューの [ツール] > [オプション] を開く。
2. [編集] タブの [変数の宣言を強制する (Require Variable Declaration)] にチェックを入れる。
これを忘れると、タイポによるバグ(例: `swModel` と書くべきところを `swModle` と打つなど)が実行時エラーとして検知されず、静かにサイレントバグを生み出す。
参照設定の最適化
SolidWorks VBAの真価を引き出すには、型ライブラリのバインドを理解する必要がある。早期バインド(Early Binding)を活用することで、IntelliSense(入力補完)が効き、実行速度も最適化される。
1. VBEメニューの [ツール] > [参照設定] を開く。
2. 以下のライブラリにチェックを入れる。
- SldWorks コントロール型ライブラリ (`SldWorks 20xx Type Library`)
- SolidWorks コマンド コントロール型ライブラリ (`SolidWorks 20xx Constant Type Library`)
これにより、マジックナンバー(例: `1` や `2` といった引数の数値)の代わりに、`swDocASSEMBLY` や `swSelectOptionDefault` といった可読性の高い定数群(Enum)が解放される。
—
2. マクロセキュリティと「信頼できるフォルダ」の要件
SolidWorks 2016以降、セキュリティモデルは劇的に厳格化された。野良マクロが勝手にアセンブリを書き換えるような脆弱性を防ぐためである。
社内共有サーバーやローカルの特定開発ディレクトリを「信頼できる場所」として登録しておかなければ、マクロ実行のたびに鬱陶しいセキュリティ警告が出るか、最悪の場合、マクロの実行そのものがブロックされる。
信頼できるフォルダの登録手順
1. SolidWorksを起動し、オプション画面(歯車アイコン)を開く。
2. [システム オプション] > [ファイル拠出 (File Locations)] または [マクロ] セクションへ移動(※バージョンによってUIが異なるが、概ね「マクロセキュリティ」の項目が存在する)。
3. [マクロ セキュリティ (Macro Security)] ボタンをクリック。
4. [信頼できるフォルダ (Trusted Folders)] タブを開き、自社の開発用リポジトリやマクロ置き場のパスを追加する。
これで、署名のない内製マクロであっても安全に実行可能となる。
—
3. 最初の実戦コード:メモリリークを防ぐための「正しい」オブジェクト取得
「動けばいい」という素人のコードと、プロのコードの決定的な違いは「オブジェクトのライフサイクルをコントロールしているか否か」である。
SolidWorks VBAでは、APIを呼び出すたびにCOMオブジェクトが生成され、RAM上にポインタが保持される。これを適切に開放(`Nothing`を代入)しないと、マクロの実行を重ねるごとにメモリ消費量が増大し、最終的にSolidWorks本体が強制終了する。
以下に、実務の現場で通用する、極めて堅牢な最初のマクロのテンプレートを提示する。
‘ ==============================================================================
‘ 担当者: チーフアーキテクト
‘ 概要: アクティブドキュメントの安全な取得と、厳格なメモリ解放を行うテンプレート
‘ ==============================================================================
Option Explicit
Sub ExecuteEnterpriseFirstMacro()
‘ 1. アプリケーションおよびドキュメント変数の宣言(早期バインド)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim docTitle As String
On Error GoTo ErrorHandler
‘ 2. SldWorksインスタンスの取得
‘ ※VBA内では Application.SldWorks を直接叩くのは悪手。GetObjectかCreateObject、
‘ あるいはSolidWorksVBA環境特有のSldWorksオブジェクトを利用する。
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksのインスタンスを取得できませんでした。”, vbCritical
Exit Sub
End If
‘ 3. アクティブドキュメントの取得
Set swModel = swApp.ActiveDoc
‘ 4. ドキュメントが開かれているかのガード節
If swModel Is Nothing Then
MsgBox “現在、アクティブなドキュメントが存在しません。”, vbExclamation
GoTo Cleanup
End If
‘ 5. 処理の実行(例:アクティブドキュメントのタイトルを取得して表示)
docTitle = swModel.GetTitle
MsgBox “現在のアクティブモデル: ” & docTitle & vbCrLf & _
“ドキュメントタイプ: ” & swModel.GetType, vbInformation, “Enterprise Macro”
Cleanup:
‘ ==========================================================================
‘ 【極めて重要】COMオブジェクトの明示的解放
‘ 変数のスコープが切れる前であっても、巨大なメモリを保持するSolidWorksの
‘ オブジェクトは明示的に Nothing を代入して参照カウンタをデクリメントする。
‘ ==========================================================================
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
Resume Cleanup
End Sub
コードの深層解説:なぜ `Set swModel = Nothing` が不可欠なのか?
素人の書くコードには `Set swModel = Nothing` が存在しない。VBAのガジェットとしての自動解放機能に頼り切っているからだ。
しかし、SolidWorks APIの背後にあるCOMコンポーネントは、VBAのガベージコレクタの気まぐれなタイミングでは解放されない。特に大規模アセンブリ(数千パーツ)を巡回するループ処理の中でオブジェクトを解放し忘れると、数回の実行でメモリが枯渇し、Windowsのページファイルが暴走する。
プロのエンジニアは、「取得した順序とは逆に、確実に `Nothing` を代入して参照を切る」。この習慣こそが、数年間にわたり保守され続ける堅牢な社内CAD自動化システムの基盤となる。
—
4. 結言:CAD自動化の荒野へ向けて
今回の設定とコードは、いわば「生きて帰るためのサバイバルナイフ」にすぎない。
この先、フィーチャーの走査、コンフィギュレーションの動的制御、外部データベース(PDMやERP)との連携、さらにはWindows APIを直接叩いての非同期処理など、地獄のように深く美しいSolidWorks APIの世界が広がっている。
甘えを捨て、メモリとポインタの挙動に意識を張り巡らせよ。君の書く一行のコードが、設計現場の数万時間の労働を救うのだ。
