【入門編】【SldWorksオブジェクト完全攻略】AppオブジェクトとActiveDocの正しい取得と使い分け – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺めてみたものの、「これ、どうやって直せばいいんだろう…?」と途方に暮れていませんか?

大丈夫です。そのモヤモヤは、あなたが次のステージへ進むための正しい第一歩です。

今回は、SolidWorks VBAのすべての土台であり、心臓部とも言える「SldWorksオブジェクト」「ActiveDoc(アクティブなドキュメント)」の正体に迫ります。ここを正しく理解するだけで、あなたが書くマクロの安定性は劇的に跳ね上がります。

気負わず、リラックスして読み進めてくださいね。ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!

1. そもそもSolidWorksのオブジェクト階層ってどうなっているの?

SolidWorksのAPI(VBAからSolidWorksを操作するための命令集)は、綺麗に整理された「階層構造(ツリー構造)」を持っています。

イメージとしては、「会社(SolidWorks)」の中に「社員(ドキュメント)」がいて、その社員の中に「持ち物(フィーチャーやスケッチ)」があるようなものです。

[SldWorks アプリケーション] (頂点に君臨する神様のようなオブジェクト)
┣━ [ModelDoc2 (アクティブドキュメント)] ── 部品、アセンブリ、図面
┃ ┣━ [Feature (フィーチャー)]
┃ ┗━ [Configuration (コンフィギュレーション)]
┗━ [文書2]
┗━ [文書3]

この頂点に君臨し、SolidWorksというソフト全体を束ねているのが、今回主役にする`SldWorks`オブジェクトです。そして、今あなたの目の前の画面で開かれているパーツや図面が`ModelDoc2`オブジェクト(ActiveDoc)です。

2. 【SldWorksオブジェクト】の正体と正しい取得方法

VBAを書き始めるとき、多くの入門書やネットの記事では、いきなり `ActiveDoc` を使ったりしていますよね。でも、プロの現場では、まず大元の `SldWorks`オブジェクト をしっかりと捕まえることから始めます。

2.1 魔法の呪文「Application」を使わない理由

実は、Excel VBAなどでは `Application.ActiveWorkbook` のように `Application` から始めることが多いです。しかし、SolidWorks VBAの標準モジュール内では、最初から`SldWorks`型の大元を返すグローバル変数(あるいは関数)が用意されています。

それが `SldWorks.SldWorks`(あるいは暗黙的に使える環境)です。

しかし、マクロの安定性を高める(堅牢なコードを書く)ためには、次のように明示的にSldWorksアプリケーションへの参照を取得する癖をつけるのが、シニアエンジニアの常道です。

‘ 良い例:SldWorksアプリケーションを確実に取得する
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

もし、この `swApp` が何らかの理由で取得できなかった場合(SolidWorksが裏で異常終了している時など)、ここでエラーハンドリングを仕込むことができます。ここをサボると、後で「原因不明のクラッシュ」に悩まされることになります。

3. 【ActiveDoc】の危険性と、安全な使い分け

さて、アプリケーション(SldWorks)が手に入ったら、次は「今開いているモデル」を操作したくなりますよね。ここで登場するのが `ActiveDoc` です。

3.1 ActiveDocとは何か?

文字通り、「現在、SolidWorksの画面上でアクティブ(最前面で選択状態)になっているドキュメント」を指します。

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc ‘ 現在アクティブな文書を取得

一見、とても便利で手軽に思えますよね。「マクロの記録」で生成されるコードも、ほぼ100%この `ActiveDoc` を前提に動いています。

3.2 ⚠️【重要】ActiveDocは「諸刃の剣」である

ここで、現場でよくある恐ろしい失敗談を一つ。

あなたが「パーツA」の図面を作ろうとマクロを走らせました。しかし、マクロが実行されるコンマ数秒の間に、ユーザー(あなた、あるいは他の作業者)がうっかり別のウィンドウ(パーツB)をクリックしてアクティブを切り替えてしまったら…?

マクロは「パーツB」に対して暴走します。 想定していない形状が変更されたり、エラーで強制終了したりする原因になります。

これが、実務で「マクロの記録」をそのまま使ったコードが不安定だと言われる最大の理由です。

4. 実践:安全にドキュメントを操作するテンプレートコード

では、どうすれば安全にSolidWorksを操作できるのでしょうか?
プログラミング初学者がまずマスターすべき、「エラーチェック付きの安全なドキュメント取得コード」をプレゼントします。

そのままコピペして、VBAの標準モジュールに貼り付けて試してみてください。

Sub SafelyGetActiveDocument()
‘ 1. 変数の宣言(型を明確に指定するのがプロの作法)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim docTitle As String

‘ 2. 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 “現在、操作対象となるドキュメントが開かれていません。” & vbCrLf & _
“パーツ、アセンブリ、または図面を開いてから実行してください。”, _
vbExclamation, “ドキュメント未選択”
Exit Sub
End If

‘ 5. 処理の実行(例:アクティブなドキュメントのファイル名を取得して表示)
docTitle = swModel.GetTitle

MsgBox “現在操作中のドキュメントは、以下の通りです:” & vbCrLf & _
“【 ” & docTitle & ” 】”, vbInformation, “成功”

End Sub

このコードのポイント

  • `swApp Is Nothing` のチェック: SolidWorks本体との接続が切れていないか確認します。
  • `swModel Is Nothing` のチェック: 「今、画面に何もモデルが開かれていない(真っ白な状態)」のときにマクロが暴発するのを防ぎます。
  • ユーザーへの優しいフィードバック: いきなりエラーで落ちるのではなく、何が原因で止まったのかをメッセージボックスで伝えます。

5. まとめ:今日から使えるエンジニアの第一歩

今回は、SolidWorks VBAの土台である `SldWorks` オブジェクト`ActiveDoc` について、その裏側の仕組みと安全な扱い方を解説しました。

  • `SldWorks`(swApp) は、SolidWorksアプリケーションそのもの。まずはこいつを確実に捕まえる。
  • `ActiveDoc`(swModel) は今開いている画面のドキュメント。非常に便利だが、「何も開いていない」「意図せず切り替わる」というリスクがある。
  • だからこそ、`If swModel Is Nothing Then` で必ずガード節(安全確認)を入れる

この基本を意識するだけで、あなたが書くマクロの品質は、そこらの「なんちゃって自動化」とは比べものにならないほど堅牢になります。

「マクロの記録」で吐き出されたコードに、今回学んだ `swApp` やガード節を少しずつ組み込んでいく。それだけで、あなたはもう「マクロの記録の奴隷」から、SolidWorksを意のままに操る「業務自動化エンジニア」への道を歩み始めていますよ。

それでは、次回の実践的なAPI攻略でお会いしましょう!お疲れ様でした!

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