こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押してコードを生成し、「よし、動いた!」と感動したのも束の間、違うファイルを開いた状態で実行した途端に謎のエラーが出て頭を抱えた……そんな経験はありませんか?
マクロの記録が吐き出すコードは、いわば「その場の勢いだけで書かれた使い捨てのメモ」です。実務で使える堅牢なマクロを書くためには、「今、何が開かれているのか」「本当に処理を進めても安全か」をプログラム自身に判断させる知性を持たせる必要があります。
今回は、SolidWorks VBAの第一歩でありながら、プロのエンジニアも最も気を遣う「ActiveDocの安全な取得」と「型安全な判定処理」について、優しく、そして本質的なところまで徹底的に解説していきます。
ここをクリアすれば、あなたの書くマクロは見違えるほど安定感が増しますよ。さあ、一緒に扉を開きましょう!
—
1. なぜ「ActiveDocの取得」でマクロは暴走するのか?
SolidWorks VBAで最もよく使う魔法の呪文(メソッド)がこれです。
Set swDoc = swApp.ActiveDoc
「今アクティブなドキュメントを取ってくる」という非常に分かりやすい命令ですが、ここには初心者が見落としがちな3つの落とし穴が潜んでいます。
1. そもそも何もファイルが開いていない(真っさらな起動直後)
- この状態で `ActiveDoc` を呼ぶと、中身が「空っぽ(Nothing)」なのに無理やり操作しようとして、VBAお馴染みの 「実行時エラー ’91’: オブジェクト変数または With ブロック変数が設定されていません。」 が爆誕します。
2. アセンブリや図面が開かれている
- あなたが作りたいのが「パーツ専用」のマクロだったとしても、SolidWorksはユーザーが今開いているものを問答無用で渡してきます。そのままパーツ用の命令(ボス・押し出しなど)をアセンブリに実行すると、エラーか予期せぬバグを引き起こします。
3. ファイルの種類を取り違える
- 「ファイルが開いているから大丈夫」と油断していると、それが図面(`.slddrw`)だったりして、パーツ特有のフィーチャ操作で盛大にコケることになります。
プロのエンジニアは、現場で動かすマクロに必ず「防波堤(ガード節)」を設けます。「ファイルはあるか?」「それはパーツか?」を厳密にチェックしてから本丸の処理に入るのです。
—
2. 【実践】安全にパーツドキュメントを取得する模範コード
それでは、実務でそのまま使える「安全第一」のVBAコードを見てみましょう。
VBAのエディタ(IDE)を開いて、以下のコードを標準モジュールに貼り付けてみてください。
Option Explicit
Sub SafeGetPartDocumentExample()
‘ =========================================================================
‘ 目的: アクティブなドキュメントを安全に取得し、それがパーツであるか厳密に判定する
‘ =========================================================================
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
‘ 1. SldWorksアプリケーションのルートオブジェクトを取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 2. 現在アクティブなドキュメントを取得
Set swModel = swApp.ActiveDoc
‘ 【防波堤①】そもそもファイルが開かれているか?
If swModel Is Nothing Then
MsgBox “現在、SolidWorksで開かれているドキュメントがありません。” & vbCrLf & _
“パーツファイルを開いてから再度実行してください。”, vbExclamation, “ファイル未オープン”
Exit Sub
End If
‘ 【防波堤②】取得したドキュメントが「パーツ」であるか?
‘ SolidWorksの定数: swDocPART = 1, swDocASSEMBLY = 2, swDocDRAWING = 3
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは「パーツ(Part)」ファイル専用です。” & vbCrLf & _
“現在アクティブなファイルはパーツではありません。”, vbCritical, “ファイルタイプ不一致”
Exit Sub
End If
‘ 3. 型安全なパーツ専用オブジェクトへのキャスト(変換)
‘ ここに到達した時点で、swModelが確実にパーツであることが保証されています
Set swPart = swModel
‘ =========================================================================
‘ ここから先は、安全にパーツ専用の処理を記述できます!
‘ =========================================================================
MsgBox “パーツドキュメントの取得に成功しました!” & vbCrLf & _
“ファイル名: ” & swModel.GetTitle, vbInformation, “成功”
‘ 例:パーツのユーザー定義プロパティを取得するなどの処理へ続く…
End Sub
—
3. コードの心臓部を紐解く:3つの重要ポイント
先ほどのコードで使われている、SolidWorks VBAを極めるための重要な考え方を解説します。
① `Option Explicit` はエンジニアの生命線
コードの最上部に書かれている `Option Explicit`。「変数の宣言を強制する」というお作法です。これを書くことで、うっかりスペルミス(例: `swModel` を `swModle` と書いてしまうなど)をしたときに、VBAが実行前に怒って教えてくれます。実務では絶対にお約束の記述として入れてください。
② `Nothing` 判定でヌルポチャ(NullPointerException)を防ぐ
VBAにおいて、オブジェクト変数に何も入っていない状態を `Nothing` と呼びます。
`If swModel Is Nothing Then` という記述は、「今、キャンバスに何も描かれていない状態(ファイル未オープン)」を検知する不可欠なフィルターです。これがないと、次の行で確実にマクロが強制終了します。
③ `GetType` メソッドによる厳密な型チェック
SolidWorksのドキュメント基底クラスである `ModelDoc2` には、現在のファイルが何であるかを教えてくれる `GetType` という強力なメソッドがあります。
- `swDocPART` (値: 1)= パーツ
- `swDocASSEMBLY` (値: 2)= アセンブリ
- `swDocDRAWING` (値: 3)= 図面
「今開いているのがパーツかどうか」を文字やファイル拡張子ではなく、SolidWorksの内部システムに直接確認するため、非常に確実で安全な判定が可能になります。
—
4. マクロの記録から一歩先へ:アセンブリ・図面への拡張性
今回覚えた「安全に取得して、型を判定する」というスキルは、今後アセンブリや図面を自動化する際にも、全く同じパターンで応用できます。
例えば、アセンブリ専用のマクロを作りたいときは、`swModel.GetType <> swDocASSEMBLY` に書き換えるだけです。この「型安全な判定ロジック」を頭の中にインストールしておけば、どんなに複雑な大規模アセンブリを相手にしても、予期せぬドキュメント違いによるクラッシュを完全に防ぐことができます。
まとめ
- ActiveDocを呼ぶ前に、必ず `Nothing` チェック(ファイルが開かれているか)を行うこと。
- `ModelDoc2.GetType` を使って、目的のファイルタイプ(パーツ等)と一致しているか厳密に検証すること。
- 安全確認が取れてから、専用のオブジェクト変数にキャストして処理を進めること。
この基本をマスターしたあなたは、もうただの「マクロの記録者」ではありません。現場で信頼されるSolidWorks自動化エンジニアへの道を確実に歩み始めています。
ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
さあ、この安全な土台を使って、あなただけの便利な自動化ツールをどんどん作り出していきましょう!
