こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「おっ、動いたぞ!」と感動したのも束の間、少し複雑な処理をさせようとした途端にエラーで止まってしまう……。そんな壁にぶつかっていませんか?
今回は、その原因のほとんどを占める「ActiveDocへの依存」を綺麗さっぱり断ち切り、プロのエンジニアが使っている「安全なドキュメント制御の極意」を伝授します。
ここをクリアすれば、あなたの書くマクロの信頼性は劇的に跳ね上がります。一緒にSolidWorks VBAの本質をマスターしていきましょう!
—
1. なぜ「ActiveDoc」に頼ってはいけないのか?
マクロの記録を使うと、必ずと言っていいほど次のようなコードが登場します。
‘ マクロの記録が吐き出す典型的なコード
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
一見、何の問題もないように見えますよね。「今、画面に開いているアクティブな図面やモデルを取得しているんだな」と分かります。
しかし、現場のエンジニアリングにおいて、これは「地雷原を裸足で歩くようなもの」です。
アクティブウィンドウの罠
- ユーザーの気まぐれ: マクロが実行される瞬間に、ユーザーが別のウィンドウをクリックしてアクティブ画面を切り替えてしまったら? 意図しない別の図面やアセンブリに対して処理が走り、最悪の場合、大切なデータを破壊してしまいます。
- そもそも開いていない: 対象のドキュメントがバックグラウンドで開かれている状態や、ウィンドウが最小化されている場合、`ActiveDoc` は `Nothing`(空っぽ)を返し、コードは無慈悲な実行時エラーでクラッシュします。
プロの自動化エンジニアは、「人間が画面で何を操作していようとも、プログラムが意図したドキュメントの首根っこを確実に掴んで離さない」という気構えでコードを書きます。そのための武器が `SldWorks` オブジェクトとドキュメント制御です。
—
2. 秘密兵器:SldWorksオブジェクトとGetDocuments
SolidWorksの根幹には、アプリケーション全体を統括する `SldWorks` オブジェクト(通常 `swApp` と呼びます)が鎮座しています。
この `swApp` は、現在メモリ上に読み込まれているすべてのドキュメントのリスト(コレクション)を把握しています。それを取り出す魔法のメソッドが `GetDocuments` です。
これを使うと、現在開かれているすべてのモデルを配列として一網打尽に取得できます。
安全なドキュメント走査の基本パターン
まずは、現在開いているすべてのドキュメントの名前をイミディエイトウィンドウに列挙する、安全なコードを見てみましょう。
Sub ListOpenDocuments()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
‘ 1. 現在メモリ上に開かれている全ドキュメントの配列を取得
Dim vDocs As Variant
vDocs = swApp.GetDocuments
‘ 2. 一枚も開かれていない場合のガード処理(超重要!)
If IsEmpty(vDocs) Then
MsgBox “現在、開かれているドキュメントはありません。”, vbExclamation
Exit Sub
End If
‘ 3. 配列をループして、1つずつ安全に点検する
Dim i As Long
Dim swModel As SldWorks.ModelDoc2
For i = LBound(vDocs) To UBound(vDocs)
Set swModel = vDocs(i)
‘ ドキュメントのタイトルとファイルパスを表示
Debug.Print “タイトル: ” & swModel.GetTitle & ” | パス: ” & swModel.GetPathName
Next i
End Sub
このコードの美しいところは、「画面上でどれがアクティブかなんて関係ない」という点です。メモリ上に存在さえしていれば、すべてのドキュメントを確実に捉えて処理することができます。
—
3. 実践:特定の条件でドキュメントを確実に対象に収める
「開いているドキュメントのリストは分かったけれど、特定のファイル名や、アセンブリ・部品といった種類で絞り込んで操作したいんだよ!」という声が聞こえてきそうですね。
実務でそのまま使える、「名前の一部が一致するドキュメントを探し出し、それを確実にアクティブ(操作対象)にして処理を行う」という安全な切り替え手法のテンプレートをプレゼントします。
Sub SafeActivateAndModify()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Const TARGET_NAME As String = “bracket.sldprt” ‘ ターゲットのファイル名
Dim swTargetModel As SldWorks.ModelDoc2
Set swTargetModel = Nothing
Dim vDocs As Variant
vDocs = swApp.GetDocuments
If IsEmpty(vDocs) Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
‘ 1. メモリ上のドキュメントから目的のものを「探す」
Dim i As Long
Dim swModel As SldWorks.ModelDoc2
For i = LBound(vDocs) To UBound(vDocs)
Set swModel = vDocs(i)
‘ ファイル名が一致するかチェック(大文字小文字を区別しない LCase使用)
If LCase(swModel.GetTitle) = LCase(TARGET_NAME) Then
Set swTargetModel = swModel
Exit For ‘ 見つかったらループを抜け出す
End If
Next i
‘ 2. 見つかったかどうかの厳密なチェック(エディタの責任感)
If swTargetModel Is Nothing Then
MsgBox TARGET_NAME & ” が見つかりません。先にファイルを開いてください。”, vbExclamation
Exit Sub
End If
‘ 3. 確実にそのドキュメントをウィンドウの前面にアクティブ化する
Dim lErrors As Long
Dim lWarnings As Long
‘ ActivateDoc3 メソッドを使って安全にウィンドウを切り替える
swApp.ActivateDoc3 swTargetModel.GetTitle, False, 0, lErrors
‘ 4. ここから先は、swTargetModel は確実に意図したドキュメントを指している!
MsgBox “現在制御中のドキュメント: ” & swTargetModel.GetTitle, vbInformation
‘ 例:ここでプロパティを変更したり、保存したりする処理を書く
‘ swTargetModel.Save3 … 等
End Sub
このコードの優れたポイント
1. `Is Nothing` による存在チェック: 目的のファイルが開かれていない場合に、容赦なくエラーを吐くのではなく、優しくユーザーに警告を促します。
2. `ActivateDoc3` の活用: 単に `ActiveDoc` を信じるのではなく、ファイル名を名指しして「このウィンドウをアクティブにしなさい」とSolidWorksに命令しています。
—
4. プログラミング初学者が陥りやすいエラーと回避の呪文
最後に、これからマクロをバリバリ書いていくあなたへ、知っておくべきエラーと「お守り」を授けます。
陥りやすい罠:ドキュメントタイプの混同
SolidWorksには、部品(Part / .sldprt)、アセンブリ(Assembly / .sldasm)、図面(Drawing / .slddrd)の3種類があります。
`ModelDoc2` はすべての基本クラスですが、図面特有の操作を部品に対して行うと、実行時エラーが発生します。
【回避の呪文】 処理を行う前に、必ずドキュメントのタイプを判別しましょう。
Select Case swModel.GetType
Case swDocPART
Debug.Print “これは部品です”
Case swDocASSEMBLY
Debug.Print “これはアセンブリです”
Case swDocDRAWING
Debug.Print “これは図面です”
End Select
この分岐を挟むだけで、予期せぬ型ミスマッチエラーを完全に防ぐことができます。
—
まとめ
お疲れ様でした!今回の内容をギュッとまとめます。
- `ActiveDoc` への依存は百害あって一利なし。 人間の操作やウィンドウの状態に左右されないコードを書こう。
- `swApp.GetDocuments` を使え。 メモリ上のドキュメント配列を安全に走査して、目的のターゲットを自分の手で探し出そう。
- 見つかったら `ActivateDoc3` で確実にフォーカスを合わせる。 これにより、意図したドキュメントを確実に制御下における。
ここをクリアしたあなたは、もう「マクロの記録をなんとなく動かしている初心者」ではありません。堅牢でプロフェッショナルなSolidWorks自動化エンジニアへの道を確実に歩んでいます。
日々の設計業務の退屈な繰り返し作業はマクロに任せて、あなたしかできないクリエイティブな仕事に集中しましょう。それでは、次回の極限の知見でお会いしましょう!
