こんにちは!SolidWorks自動化の世界へようこそ。
これまで「マクロの記録」ボタンを押して、決まった手順をただ再現させるだけの自動化に物足りなさを感じていませんか?
「アセンブリに新しい部品が組み込まれた瞬間、自動で独自の品番規則をチェックさせたい」
「部品が削除されたら、外部のデータベースやBOM(部品表)をリアルタイムで同期させたい」
今回は、そんなワンランク上の要求を叶える秘伝の技術、「カスタムイベントハンドラ(`SldWorksEvents`)によるリアルタイム検知」を授けましょう。ここをクリアすれば、あなたのVBAマクロは「単なる作業代行ツール」から「賢いシステム」へと劇的に進化します。
肩の力を抜いて、じっくりとついてきてくださいね。
—
1. なぜ「イベント駆動型」が必要なのか?
これまでのVBAマクロは、人間が「マクロを実行するボタン」を押したときだけ動く、いわば「指示待ち人間」でした。
しかし、実際の設計現場はどうでしょう?
設計者はアセンブリ画面で、部品をドラッグ&ドロップしたり、不要な部品をDeleteキーで消したりします。この「設計者のマウスの動き」そのものをトリガー(引き金)にしてVBAを走らせるのが、イベント駆動型プログラミングの本質です。
これを実現するために、SolidWorksの裏側で常に監視の目を光らせてくれるのが「イベントハンドラ」です。
—
2. 実装の全体像と「お約束のトラップ」
イベントを扱うためには、標準の「標準モジュール」だけでは足りません。
SolidWorksからの「今、部品が追加されたよ!」という叫び(イベント)を聞き取るための「クラスモジュール」という特別な設計図が必要になります。
📁 今回作成する構成
1. クラスモジュール(名前:`EventClass`)
- SolidWorksのイベントをキャッチし、独自の処理を割り当てる心臓部。
2. 標準モジュール(名前:`Module1`)
- クラスを起動し、監視をスタート・ストップさせるスイッチ役。
> ⚠️ ここが最重要!初心者が100%ハマる罠
> VBAのクラスは、そのままではSolidWorksのイベントを聴き取れません。`WithEvents`という魔法のキーワードを使い、「私はこのSolidWorksアプリケーションのイベントを監視します」と宣言(フック)してあげる必要があります。
—
3. 実践!コードを書いてみよう
それでは、実際に動くコードを書いていきましょう。
コピペするだけで動くように設計していますが、中の構造を先輩と一緒に読み解いていきますね。
① クラスモジュールの作成
VBAエディタ(Alt + F11)を開き、メニューの `挿入` > `クラス モジュール` を選択してください。プロパティウィンドウで名前を `EventClass` に変更します。
ここに以下のコードを貼り付けます。
‘ =================================================================
‘ クラスモジュール名: EventClass
‘ 役割: SolidWorksのイベントをフックし、部品追加・削除を検知する
‘ =================================================================
Option Explicit
‘ WithEventsキーワードを使い、SldWorksオブジェクトのイベントを監視対象にする
Public WithEvents swApp As SldWorks.SldWorks
‘ 【重要】アセンブリ内の操作をフックするためには、ドキュメント側のイベントも必要です
‘ ここでは簡易的にアプリケーションレベルの通知を受け取る基本形を示します。
‘ 実務では AssemblyDoc に対するイベントも組み合わせます。
‘ 1. ドキュメントが新規作成・オープンされたときのイベント
Private Function swApp_OnDocOpenNotify(Byaly As String, ByVal DocTitle As String, ByVal DocType As Long) As Long
Debug.Print “ドキュメントが開かれました: ” & DocTitle
swApp_OnDocOpenNotify = 0
End Function
‘ 2. 部品がアセンブリに追加されたときなどのトリガーを検知する基盤
‘ ※実務的なコンポーネント追加検知には、AssemblyDocイベント(ComponentAddNotify等)をクラスで受け取る必要があります。
‘ ここでは「SolidWorks全体でドキュメント構造に変化があった瞬間」の概念を掴んでください。
> 💡 先輩からの補足アドバイス
> アセンブリ内の「個別の部品(Component)」の追加・削除を完璧に捉えるには、アセンブリが開かれたタイミングで `SldWorks.ModelDoc2` から `AssemblyDoc` へキャストし、ドキュメント固有のイベント (`ComponentAddNotify`, `ComponentRemovalNotify`) をフックするのがプロの常道です。今回はイベントハンドラの導入編として、全体の仕組みを体感してもらいます。
—
② 標準モジュールの作成
次に、メニューの `挿入` > `標準モジュール` を選択し、名前を `Module1` とします。
ここに以下のコードを貼り付けます。
‘ =================================================================
‘ 標準モジュール名: Module1
‘ 役割: イベント監視の開始と終了をコントロールする司令塔
‘ =================================================================
Option Explicit
‘ クラスのインスタンスを保持するグローバル変数(これが消えるとイベント監視が切れます)
Public myEventListener As EventClass
‘ 監視をスタートするマクロ
Sub StartSolidWorksEventListener()
‘ すでに起動していなければ新しく生成
If myEventListener Is Nothing Then
Set myEventListener = New EventClass
‘ 実行中のSolidWorksアプリケーションとクラスを紐付ける
Set myEventListener.swApp = Application.SldWorks
MsgBox “SolidWorksのイベント監視を開始しました!”, vbInformation, “イベント駆動システム”
Else
MsgBox “すでに監視は稼働中です。”, vbExclamation
End If
End Sub
‘ 監視をストップするマクロ
Sub StopSolidWorksEventListener()
‘ 変数を解放してイベントを解除
Set myEventListener = Nothing
MsgBox “イベント監視を終了しました。”, vbInformation, “イベント駆動システム”
End Sub
—
4. 実際に動かして挙動を確認しよう!
1. `StartSolidWorksEventListener` マクロを実行してください。メッセージボックスが表示されれば、監視の網が張られた状態になります。
2. そのままSolidWorksで適当なアセンブリを開き、部品を配置したり操作してみてください。
3. VBAエディタに戻り、イミディエイトウィンドウ(Ctrl + G)を確認してみましょう。裏側で何が起きているかがログとして出力されます。
4. 終わったら `StopSolidWorksEventListener` を実行して監視を安全に終了させます。
—
5. 陥りやすいエラーとプロの回避術
イベントハンドラを実装する際、多くのエンジニアが以下の「罠」にハマります。
⚠️ トラップ1: 「マクロが終わったらイベントが反応しなくなった」
原因: 標準モジュール内で通常のローカル変数としてクラスを宣言してしまい、マクロの終了と共にメモリから消去(ガベージコレクト)されてしまったため。
解決策: 今回のコードのように、変数を `Public` にするか、別モジュールで永続的に保持させることでメモリ上に留めておく必要があります。
⚠️ トラップ2: 予期せぬ無限ループやSolidWorksのフリーズ
原因: イベントの処理の中で、さらにドキュメントを保存したり部品を追加するコードを書いた結果、「イベント発火 ➔ マクロ実行 ➔ 部品追加 ➔ またイベント発火…」という無限地獄(デッドロック)に陥る。
処理の鉄則: イベントハンドラ内の処理は極力軽量にし、フラグ変数(`isProcessing = True` など)を設けて、処理中の再入を防ぐガードを必ず組み込みましょう。
—
まとめ
いかがでしたでしょうか?
今回はカスタムイベントハンドラ(`SldWorksEvents`)の導入という、少し歯応えのあるテーマを解説しました。
ここをクリアできたあなたなら、単なるマクロの自動化の枠を超え、SolidWorksとVBAを完全手足のように操る「システムエンジニア」の領域に足を踏み入れています。
「こんな自動化もできるかな?」と疑問に思ったときは、いつでもまたこの扉を叩いてください。
あなたのSolidWorksライフが、より知的で快適なものになることを応援しています!
