【SolidWorks VBA超入門】VBEの初期設定とマクロセキュリティ解除から始める最初のデバッグ
開発プロジェクトのリーダーである私から、これからSolidWorksの自動化に挑む君たちへ最初に伝えておきたいことがある。
ネットの海に転がっている場当たり的なコードをコピペし、動いたから良しとする――そんな開発手法は今日で終わりにしよう。
SolidWorks APIを操るVBA開発は、背後に重厚長大なC++ベースのCADエンジン(SldWorks)を従える、極めて厳密な世界だ。オブジェクトのライフサイクルやコンテキストを理解せずして、実務に耐えうる堅牢なツールなど作れるはずがない。
第一歩として、今回は「VBEの初期設定」「マクロセキュリティの正しい解除」、そして「保守性の高いコードの書き方」を徹底的に叩き込む。ここを疎かにすると、のちに数百万行規模のアセンブリを扱うような巨大な自動化で必ず痛い目を見る。心してついてきてほしい。
—
1. 開発環境の要塞化:VBEの初期設定
まずはVBE(Visual Basic Editor)を開いてくれ。[`Alt` + `F11`] だ。
目の前に広がる灰色の画面こそが、君の城となる。だが、デフォルトのVBEは「戦うにはあまりにも無防備で不親切」だ。まずはここをプロの仕様にカスタマイズする。
必須設定:変数の宣言を強制する (`Option Explicit`)
これを設定していないコードは、時限爆弾を抱えて走るようなものだ。タイポ(入力ミス)によるバグをコンパイル時に検知するため、以下の設定を必ず行う。
1. VBEのメニューバーから [ツール] > [オプション] を開く。
2. [編集] タブにある [変数の宣言を強制する (Require Variable Declaration)] にチェックを入れる。
【なぜこの設定が必要なのか】
これを行うと、新しく標準モジュールを作成した際、自動的に先頭に `Option Explicit` が挿入される。これによって、宣言していない変数に値を代入しようとした瞬間にVBEがエラーを吐いて教えてくれる。デバッグに費やす無駄な時間をゼロにするための、プロにとっての絶対の防壁だ。
エディタの視認性向上
長時間のコーディングで目を潰したくないなら、フォントと色も調整しておこう。
- [ツール] > [オプション] > [エディタの設定]
- フォント:`Consolas` や `MS Gothic` など等幅フォント
- サイズ:11〜12pt(老眼対策ではない、コード構造を俯瞰するためだ)
—
2. セキュリティの壁を突破する:「信頼できる場所」の登録
SolidWorksのマクロを実行しようとして、「マクロセキュリティの警告」に阻まれた者は多いだろう。ここで「すべてのマクロを有効にする」という愚挙に出てはならない。セキュリティリスクが跳ね上がるだけでなく、社内ニートならぬ「社内ウイルス製造機」の烙印を押されかねないからだ。
正攻法は、「自分が開発・運用するフォルダを信頼できる場所(Trusted Locations)に登録すること」だ。
手順
1. SolidWorksを起動し、上部メニューの歯車アイコン(オプション)を開く。
2. [システムオプション] > [ファイル プレースホルダー](または環境によって異なるが、[マクロ] セキュリティ設定を探す)。
- ※SolidWorksのバージョンによりUIが若干異なるが、基本は「マクロセキュリティ」の設定項目に辿り着く。
3. [信頼できる場所 (Trusted Locations)] を選択し、[追加] をクリック。
4. 自分が作成するVBAマクロ(`.swp` や `.vba`)を格納する専用ディレクトリ(例: `C:\SolidWorks_Macro_Projects\`)を指定し、「サブフォルダも信頼する」にチェックを入れて保存する。
これで、セキュリティの盾を無効化することなく、安全かつ円滑にデバッグ作業を進める環境が手に入る。
—
3. 参照設定の魔術:早期バインドと遅延バインド
SolidWorks VBAを本格的に始めるにあたり、避けて通れないのが「参照設定」だ。
VBEの [ツール] > [参照設定] を開き、以下にチェックが入っていることを確認してほしい。
- [SldWorks x.x Type Library]
- [SolidWorks constants x.x Type Library]
これを行うことで、SolidWorksのAPI(`SldWorks.ModelDoc2` など)のインテリセンス(入力補助)が効くようになる。これを「早期バインド(Early Binding)」と呼ぶ。
実務における設計思想:なぜ早期バインドを選ぶのか?
初心者向けの記事では「遅延バインド(`CreateObject`を使う方法)なら参照設定不要で楽ちん」などと書かれていることがあるが、業務自動化の現場においては悪手だ。
型推論が効かない遅延バインドは、メソッド名のタイポに気づけず、実行時エラーの温床になる。パフォーマンスの面でも不利だ。プロダクションコードでは、明確に型を定義する早期バインドを原則とする。
—
4. 【プロダクションコード】最初の堅牢なマクロ
それでは、環境構築の総仕上げとして、現在アクティブなSolidWorksのドキュメント情報を取得し、イミディエイトウインドウに出力するだけのシンプルな、しかし「実務基準の例外処理」を組み込んだコードを記述しよう。
以下のコードを、VBEの標準モジュールにそのままコピペしてほしい。
Option Explicit
‘ =========================================================================
‘ 模範的SolidWorks VBAサンプル: アクティブドキュメントの診断
‘ Author: 開発プロジェクトリーダー
‘ Description:
‘ オブジェクトの存在確認(Nullチェック)とエラーハンドリングを完備した、
‘ 現場でそのまま使える堅牢なテンプレートコード。
‘ =========================================================================
Sub Main_CheckActiveDocument()
‘ 1. エラーハンドラの設定
On Error GoTo ErrorHandler
‘ 2. SldWorksアプリケーションのインスタンス取得
‘ 注: VBAのマクロ環境(SW内部から実行)ではSldWorksオブジェクトを直接取得する。
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksのアプリケーションインスタンスを取得できませんでした。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 3. アクティブドキュメント(モデル)の取得
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
‘ 4. ドキュメントが開かれていない場合のガード節(極めて重要)
If swModel Is Nothing Then
MsgBox “現在、SolidWorksで開かれているドキュメントがありません。”, vbExclamation, “警告”
Exit Sub
End If
‘ 5. ドキュメント情報の取得と出力
Dim docTitle As String
Dim docPath As String
Dim docType As Long
docTitle = swModel.GetTitle
docPath = swModel.GetPathName
docType = swModel.GetType
‘ イミディエイトウインドウ([Ctrl]+[G])に出力
Debug.Print “—————————————-”
Debug.Print “【ドキュメント診断結果】”
Debug.Print “タイトル: ” & docTitle
Debug.Print “パス: ” & IIf(docPath = “”, “(未保存)”, docPath)
Debug.Print “種別コード: ” & GetDocumentTypeName(docType)
Debug.Print “—————————————-”
‘ 正常終了
Exit Sub
ErrorHandler:
‘ 予期せぬ例外の捕捉
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “例外発生”
End Sub
‘ =========================================================================
‘ 補助関数: ドキュメント種別を文字列に変換する
‘ =========================================================================
Private Function GetDocumentTypeName(ByVal docType As Long) As String
Select Case docType
Case swDocPART: GetDocumentTypeName = “部品 (Part)”
Case swDocASSEMBLY: GetDocumentTypeName = “アセンブリ (Assembly)”
Case swDocDRAWING: GetDocumentTypeName = “図面 (Drawing)”
Case Else: GetDocumentTypeName = “不明 (Unknown)”
End Select
End Function
このコードの設計美について(リーダーからの解説)
1. ガード節(Guard Clauses)の徹底
`swApp` や `swModel` が `Nothing`(オブジェクトが存在しない状態)である可能性を常に考慮し、処理の早期段階で弾いている。これを怠ると、後続のメソッド呼び出しで突然VBAが強制終了(クラッシュ)する。
2. マジックナンバーの排除とAPI定数の活用
ドキュメントタイプの判定に `swDocPART` などのSolidWorks標準のAPI定数を使用している。「1, 2, 3」といった魔術的数字(マジックナンバー)をコードに直書きしてはならない。
3. クリーンなエラーハンドリング
`On Error GoTo ErrorHandler` を配置し、予期せぬCAD側の挙動変化によるクラッシュ時にも、最低限のメッセージを出して安全にプロシージャを抜ける構造にしている。
—
5. デバッグの作法:イミディエイトウインドウを制せよ
コードを書いたら、[`F5`] で実行する前に、[`Ctrl` + `G`] でイミディエイトウインドウを表示させておいてほしい。
プログラミング初心者ほど、値の確認をわざわざ `MsgBox` で行おうとする。これは業務効率の観点から最悪のアンチパターンだ。
`Debug.Print` を使いこなし、データの流れを瞬時にコンソール上で確認する。この習慣をつけるだけで、開発スピードは3倍以上に跳ね上がる。
さらに、ブレークポイント(行の左端をクリックして赤丸をつける)を配置し、[`F8`] キーによるステップ実行(1行ずつ実行)をマスターせよ。変数の上にマウスカーソルを乗せれば、その瞬間の値がポップアップで確認できる。
「なぜ動かないのか」と勘で悩む時間は今日で終わりだ。デバッガという科学的ツールを使い倒し、コードの挙動を完全に支配するのだ。
—
結びに代えて
これで君のPCには、SolidWorks VBA開発を遂行するための「強靭な土台」が築かれた。
VBEの設定を整え、セキュリティを正しく担保し、オブジェクトの生死(`Nothing`チェック)に気を配る。この泥臭くも美しいエンジニアリングの基本原則を守り続ければ、どんなに複雑な図面の一括処理も、膨大なアセンブリの構造解析も、君の意のままに自動化できるようになる。
次のステージでは、さらに踏み込んだ「フィーチャーの走査」と「コンテキストの制御」について叩き込む。準備はいいか? 次のステップへ進もう。
