【入門編】【上級プロ】SldWorksEventsを活用したアセンブリ内のコンポーネント追加・削除イベントのリアルタイム非同期監視システム – SolidWorks VBA解析バイブル

スポンサーリンク

【上級プロへの登竜門】SolidWorksイベントフックでアセンブリを「監視」する:リアルタイム同期システムの構築

こんにちは。自動化の深淵へようこそ。
「マクロの記録」ボタンを押して生成されたコードを並べるだけの時代は、今日で終わりにしましょう。

アセンブリを操作する際、最も困難なのは「ユーザーが今、何をしたか」をシステムが知ることです。パーツを追加したのか、削除したのか。それをVBAで追いかけるには、単なるコマンドの実行ではなく、「SldWorksのイベント駆動型アーキテクチャ」を掌中に収める必要があります。

今回は、SolidWorksアセンブリ内のコンポーネント変動をリアルタイムでフックする、プロフェッショナルな監視システムの設計図を伝授します。

—

1. なぜ「イベント」を使うのか?

従来の「ボタンを押してマクロを実行する」手法では、ユーザーの手動操作(ドラッグ&ドロップでの追加など)を検知できません。

私たちが目指すのは、「アセンブリが自律的に自身の変化を外部へ通知する」状態です。これには`SldWorks.AssemblyDoc`インターフェースが持つイベントを利用します。

必要な準備

1. クラスモジュールを使用する(イベントをキャッチする「窓口」を作るため)。
2. `WithEvents`キーワードでSolidWorksオブジェクトを宣言する。

—

2. 監視システムの構築:実装コード

まずは、アセンブリ内のコンポーネント増減をキャッチするクラスモジュールを作成します。

クラスモジュール(名前: `clsAssemblyMonitor`)

Option Explicit

‘ WithEventsを使い、AssemblyDocのイベントを監視対象にする
Public WithEvents swAssy As SldWorks.AssemblyDoc

‘ コンポーネントが追加された瞬間に走るイベント
Private Function swAssy_ComponentAddedNotify(ByVal ComponentModel As Object, ByVal CompName As String) As Long
Debug.Print “検知: コンポーネントが追加されました -> ” & CompName
‘ ここに外部データベースへの書き込みや、ログ出力処理を書く
swAssy_ComponentAddedNotify = 0 ‘ 0を返すのが作法
End Function

‘ コンポーネントが削除された瞬間に走るイベント
Private Function swAssy_ComponentDeletingNotify(ByVal ComponentModel As Object, ByVal CompName As String) As Long
Debug.Print “警告: コンポーネントが削除されます -> ” & CompName
‘ 削除前の最終確認や、依存関係のチェックが可能
swAssy_ComponentDeletingNotify = 0
End Function

標準モジュール(監視を起動するトリガー)

Option Explicit

‘ インスタンスを保持する変数
Public myMonitor As clsAssemblyMonitor

Sub StartMonitoring()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

‘ 現在のアクティブドキュメントを監視対象にする
If swApp.ActiveDoc Is Nothing Or swApp.ActiveDoc.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”
Exit Sub
End If

Set myMonitor = New clsAssemblyMonitor
Set myMonitor.swAssy = swApp.ActiveDoc

MsgBox “アセンブリ監視システムが起動しました。”
End Sub

—

3. 陥りやすい罠:なぜ監視が止まるのか?

このシステムを組む際、多くの初学者が直面する壁が「メモリからの変数の消失」です。

「変数の寿命」を理解する

標準モジュールで宣言した `myMonitor` は、VBAの実行が終わるとメモリから解放されようとします。監視を継続させるには、この変数が「生き続けている」必要があります。

  • 解決策: 上記のように標準モジュールで `Public` 変数として宣言するか、あるいは常駐型のフォーム(UserForm)を表示し続け、そのモジュールレベルで保持するのが定石です。

—

4. プロの視点:パフォーマンスと安定性

リアルタイム監視システムで最も注意すべきは「イベントハンドラ内での重い処理」です。

  • 再帰呼び出しの回避: イベントの中で再びアセンブリ操作(パーツの追加など)を行うと、無限ループ(イベントがイベントを呼ぶ)に陥り、SolidWorksがクラッシュします。
  • 非同期的な設計: 重い外部通信やデータベース接続を行う場合は、イベント内には「フラグを立てる」ことだけを記述し、実際の処理は `OnTime` メソッドなどで非同期に実行する工夫が必要です。

—

最後に:エンジニアとしてのステップアップ

ここをクリアしたあなたは、もう「マクロを動かす人」ではありません。「SolidWorksというプラットフォームを制御するアーキテクト」です。

イベント駆動を使いこなせば、設計ミスを未然に防ぐチェックツールや、PDMと連携したリアルタイムパーツリスト作成など、現場の生産性を劇的に変えるシステムが構築できます。

「動くコード」を書くのではなく、「壊れない設計」を書く。
その意識を持てば、あなたのコードは格段に洗練されるはずです。

何か不明点があれば、またいつでも聞いてください。あなたの自動化の旅を、全力でサポートします。

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