【入門編】【上級プロ】SldWorksEventsを利用したアセンブリ内のコンポーネント追加・削除イベントのリアルタイム非同期フック処理 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!先輩エンジニアのボクだよ。
マクロの記録ボタンを押して、生成されたコードをただ眺めるだけの作業はもう卒業したかい?

「自動化のスキルを次のステージへ引き上げたい」
「ボタンを押したときだけでなく、SolidWorksの動きに連動してプログラムを賢く動かしたい」

そんな熱い君に向けて、今回はSolidWorks APIの真骨頂である「イベント駆動型プログラミング(SldWorksEvents)」を徹底解説するよ。
ここをクリアすれば、君はもう初心者マークを外して「上級プログラマー」の仲間入りだ。心してついておいで!

—

1. なぜ「イベントフック」が必要なのか?

通常のVBAマクロは、「人間がボタンを押す」「マクロを実行する」という能動的なアクションがなければ動きません。

しかし、実際の設計現場はどうだろう?

  • アセンブリに部品(Component)が追加された瞬間、自動で外部DBの在庫を引き当てたい
  • 部品が削除されたら、ツリー構造の整合性をリアルタイムにチェックしたい

これらを人間の手動実行に頼ると、どうしても「更新忘れ」や「ヒューマンエラー」が発生するよね。
そこで登場するのが、SolidWorks側で何かが起きた瞬間に自動でプログラムを呼び出す「イベント(Events)」の仕組みなんだ。

—

2. 【超重要】VBAでイベントを扱うための最大の壁

ここで一つ、SolidWorks VBAの宿命的な話をしなければならない。
実は、SolidWorksのメインアプリケーションイベントをVBAで直接受けるには、通常の標準モジュールではなく「クラスモジュール(Class Module)」を使う必要があるんだ。

さらに、アセンブリ内のコンポーネント追加・削除をフックするには、`SldWorks.ModelDoc2` のイベント、あるいは `SldWorks.AssemblyDoc` のイベントを監視する必要がある。

「クラスモジュール? なんか難しそう…」と思ったかい?
大丈夫、先輩が一番分かりやすい道筋を示すから、安心してステップを踏んでいこう。

—

3. 実装の全体像とアーキテクチャ

今回は、以下の2つのステップで実装を行うよ。

1. クラスモジュール(例:`ClsAssemblyEvents`)の作成

  • アセンブリのイベント(コンポーネント追加・削除)を監視する実体を定義する。

2. 標準モジュール(例:`ModMain`)からの初期化

  • 現在開いているアセンブリに対して、イベント監視のフックをかける。

—

4. 実践!コード実装ハンズオン

さあ、実際にコードを書いていこう。VBAエディタ(Alt + F11)を開いて準備してくれ。

ステップ1:クラスモジュールの作成

VBAのメニューから [挿入] > [クラス モジュール] を選択し、プロパティウィンドウで名前を `ClsAssemblyEvents` に変更してね。
ここに以下のコードを貼り付けるんだ。

‘ ==========================================
‘ クラスモジュール名: ClsAssemblyEvents
‘ ==========================================
Option Explicit

‘ WithEventsキーワードを使い、AssemblyDocのイベントを有効にする
Public WithEvents AsmDoc As SldWorks.AssemblyDoc

‘ 【イベント】コンポーネントが追加された瞬間に走る
Private Function AsmDoc_ComponentAdditionNotify(ByVal ComponentModelName As String) As Long
‘ 画面を固めないよう、即座に応答を返す(戻り値 0 は正常終了)
AsmDoc_ComponentAdditionNotify = 0

‘ ログ出力と実務処理へのフック
Debug.Print “【検知】コンポーネントが追加されました: ” & ComponentModelName

‘ TODO: ここに外部DB連携や在庫数チェックのロジックを記述する
MsgBox “部品が追加されました!: ” & ComponentModelName, vbInformation, “SolidWorks リアルタイム監視”
End Function

‘ 【イベント】コンポーネントが削除された瞬間に走る
Private Function AsmDoc_ComponentRemovalNotify(ByVal ComponentModelName As String) As Long
AsmDoc_ComponentRemovalNotify = 0

Debug.Print “【検知】コンポーネントが削除されました: ” & ComponentModelName

‘ TODO: ここに削除時のツリー整合性チェック処理を記述する
MsgBox “部品が削除されました!: ” & ComponentModelName, vbExclamation, “SolidWorks リアルタイム監視”
End Function

> 💡 ここがエンジニアの知見:
> イベントハンドラ内の処理(Notify系)は、SolidWorksのメインスレッドをブロックしないよう、極力軽量に保つのが鉄則です。重たいDB通信やファイルI/Oを行う場合は、非同期処理(キューイング)を挟む設計にするのがプロの技だよ。

—

ステップ2:標準モジュールでのイベント有効化

次に、標準モジュール(例:`ModMain`)を追加し、作成したクラスをインスタンス化してSolidWorksにフックさせます。

‘ ==========================================
‘ 標準モジュール名: ModMain
‘ ==========================================
Option Explicit

‘ Ứng dụng SolidWorksのグローバル参照
Public swApp As SldWorks.SldWorks

‘ イベント用クラスのインスタンスを保持する変数(スコープを維持するためパブリックまたはフォーム等で保持)
Public Eventhandler As ClsAssemblyEvents

Sub HookAssemblyEvents()
Set swApp = Application.SldWorks

Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

‘ アクティブなドキュメントが存在するかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical
Exit Sub
End If

‘ アセンブリ文書であるかチェック(文書タイプ: swDocASSEMBLY = 2)
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “現在のアクティブドキュメントはアセンブリではありません。”, vbExclamation
Exit Sub
End If

‘ クラスのインスタンスを生成し、アセンブリドキュメントを紐付ける
Set Eventhandler = New ClsAssemblyEvents
Set Eventhandler.AsmDoc = swModel

MsgBox “アセンブリのイベント監視を開始しました!” & vbCrLf & _
“部品の追加・削除を行ってみてください。”, vbInformation, “イベントフック成功”
End Sub

—

5. 動作テストのやり方

1. 適当なアセンブリファイルをSolidWorksで開く。
2. VBAエディタに戻り、`HookAssemblyEvents` マクロを実行する。
3. マクロのメッセージボックスが出たら、SolidWorksの画面に戻る。
4. アセンブリに新しい部品をドラッグ&ドロップで追加したり、既存の部品を削除(Delete)してみよう!

見事にVBAの `MsgBox` がポップアップし、イミディエイトウィンドウにログが出力されたはずだ。これで君もリアルタイム非同期フックの仕組みを手に入れた!

—

6. 陥りやすい罠と現場で役立つ注意点

最後に、現場でこの仕組みを運用する際によくある「ハマりポイント」を伝授しておくね。

  • 変数のスコープ切れ(VBA特有の罠)
  • 標準モジュール内のプロシージャ内でローカル変数としてクラスを宣言すると、マクロの実行が終わった瞬間にメモリから解放され、イベントが反応しなくなります。必ず今回のようにグローバル変数(モジュールレベル変数)として保持し続けてください。
  • モデルの切り替え(アクティブドキュメントの変更)
  • 別の図面を開いたり閉じたりすると、フックしている `AsmDoc` の参照が無効になることがあります。本格的なツールを作る場合は、`SwAppEvents_ActiveDocChangeNotify` などを併用して、ドキュメント切り替え時にもイベントを再アタッチする仕組みが必要になります。

—

まとめ

今回は、`SldWorksEvents` を使ったアセンブリ内のコンポーネント追加・削除のリアルタイムフック処理を解説しました。

ここをクリアできれば、単なる「マクロの自動化」から、「SolidWorksと外部システムを完全に同期させるシステム開発」へと視座が大きく広がります。

ぜひ自分の開発環境に組み込んで、業務効率化の爆速化を体感してみてください。
分からないところがあれば、いつでも先輩に聞いてくれよな!バッチリサポートするよ!

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