【入門編】【上級プロ】FlexLMやアドイン連携を見据えたSolidWorks APIセッション管理とCOMオートメーション制御の深層 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握せよ:プロが教える「インスタンス制御」と「セッション管理」の極意

こんにちは。現場で泥臭い自動化と格闘し、時に洗練されたコードで工数を削り出す――そんな日々に喜びを感じているエンジニアです。

今日は、皆さんが「マクロの記録」の先へ進むための第一歩、そして避けては通れない壁である「SolidWorksインスタンスの確実なアタッチ(接続)」についてお話しします。

「複数のSolidWorksが立ち上がっている時、マクロがどっちを操作しているか分からない」「突然エラーで止まる」……そんな悩みは、これからお教えする「セッション管理」の勘所を押さえるだけで、驚くほど劇的に改善されます。

—

1. なぜ「インスタンス」を意識する必要があるのか?

VBAで `Set swApp = Application.SldWorks` と書くのは教科書通りですが、これは「現在アクティブな、あるいは最後に起動したプロセス」を拾うだけです。

もしあなたが「設計途中の検証用SolidWorks」と「量産データ用のSolidWorks」を同時に開いていたら? 運任せの接続は、致命的なヒューマンエラー(誤った設計データの書き換え等)を引き起こします。

プロは、「今、目の前にあるSolidWorksと確実に握手をする」ための手段を心得ています。

—

2. 実践:安全にSolidWorksを捕まえるコード

まずは、現在のセッションを安全に取得するテンプレートをご覧ください。ここには、アドイン連携やFlexLMライセンス認証の待機にも応用できる「堅牢な接続ロジック」が詰まっています。

‘ プロ御用達:堅牢なSolidWorksインスタンス接続テンプレート
Option Explicit

Public Sub ConnectToSolidWorks()
Dim swApp As SldWorks.SldWorks
Dim errCode As Long

‘ 1. すでに起動しているSolidWorksがあるか試行
On Error Resume Next
Set swApp = GetObject(, “SldWorks.Application”)
On Error GoTo 0

‘ 2. 起動していなければ、新規で立ち上げる(または警告を出す)
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。手動で起動してから実行してください。”, vbCritical
Exit Sub
End If

‘ 3. 接続成功の確認とセッション情報の取得
Debug.Print “接続成功: ” & swApp.RevisionNumber()

‘ ここからアセンブリ操作のロジックを展開する
‘ Set swModel = swApp.ActiveDoc
End Sub

【ここがポイント!】

  • `GetObject(, “…”)` の真価: 第1引数を空にすることで、「現在メモリ上に存在する唯一のインスタンス」を確実に取得します。
  • `On Error Resume Next` の使い所: ここは「エラーが発生したら止まる」のではなく、「エラーを検知して次へ進む」という意図的な制御です。この後すぐにエラーハンドリングを戻すのが「プロの作法」です。

—

3. アセンブリ操作の罠:モデルの「再取得」を忘れるな

アセンブリの新規作成や合致(Mate)定義を行う際、最も多いミスが「ドキュメントの状態を更新しないこと」です。

SolidWorks APIは、バックグラウンドで `ModelDoc2` オブジェクトを操作します。しかし、APIで合致を追加した直後、SolidWorks側で再構築(Rebuild)が完了していないと、次のコマンドが「そんな構成部品は見当たらないよ!」と怒り出します。

合致自動定義の際の「黄金律」

1. SelectByID2 で部品を選択する。
2. AddMate5 を実行する。
3. 必ず `swModel.EditRebuild3` を呼び出す。

この「再構築の儀式」を怠ると、どんなに美しいコードを書いても、複雑なアセンブリでは必ずスタックします。

—

4. アドイン連携を見据えた「COMオートメーション」の心得

将来的に、VBAからさらに高度なC#アドインへ移行したり、外部からSolidWorksを制御(オートメーション)したりする予定があるなら、以下の2点だけは覚えて帰ってください。

  • インターフェースを明示的に解放せよ: `Set swApp = Nothing` をコードの最後に入れるのは基本ですが、複雑なオブジェクト操作時は、スコープが終わるごとに明示的にメモリを解放する意識が、大規模な自動化では必須です。
  • FlexLMライセンスを意識する: 大規模な解析やバッチ処理を行う際、APIを通じて高速にドキュメントを開閉しすぎると、ライセンスサーバーとの通信が追いつかず、SolidWorksがフリーズすることがあります。ループ処理の間に `DoEvents` を入れ、SolidWorksの「呼吸」を整える猶予を作ってください。

—

最後に:エンジニアとしての第一歩

ここまで読んでくださったあなたは、もうただの「マクロ利用者」ではありません。システムの裏側にあるプロセス、そしてメモリ上のオブジェクトの振る舞いを想像できる「開発者」の視点に立っています。

まずは、今日紹介した「安全なアタッチ」のコードを、既存のマクロに組み込んでみてください。それだけで、あなたの自動化ツールは「たまに動く」ものから「いつでも頼れる相棒」へと進化します。

何か分からないことがあれば、いつでもまた聞きに来てください。あなたのエンジニアリングライフが、より効率的で、より創造的なものになることを応援しています!

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