【入門編】【上級プロ向け】SolidWorks図面エクスポートプロセスにおける「イベント駆動型(Event-Driven)非同期自動バックアップシステム」 – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

「マクロの記録」を卒業せよ。SolidWorks VBAで実現する、静かなる守護神「イベント駆動型バックアップシステム」の構築

こんにちは。設計自動化の世界へようこそ。

これまで「マクロの記録」ボタンを押し、生成されたコードを少しずつ書き換えることで、なんとか業務を効率化してきた……そんなあなた。素晴らしい一歩を踏み出しました。でも、もしあなたが「もっとスマートに、設計者が作業している裏側で、まるで魔法のように自動で仕事をしてくれるシステム」を求めているなら、今日、その扉を開く時が来ました。

今日お話しするのは、単なる「ボタンを押したら実行されるマクロ」ではありません。
「SolidWorksの動きを察知し、設計者が気づかないうちに、図面のPDFバックアップとログ記録を完遂する」という、イベント駆動型(Event-Driven)の設計思想についてです。

これは、プログラミング初学者が「次に進むべき壁」であり、ここを突破すれば、あなたは「ツールを作る人」から「システムを設計する人」へと進化できます。

1. 「命令型」から「イベント駆動型」へのパラダイムシフト

まず、これまでのあなたの書き方(命令型)と、これから目指す書き方(イベント駆動型)の違いを理解しましょう。

命令型(Imperative): 「これをやって、次にこれをやって」

あなたがマクロを実行した瞬間から処理が始まります。

  • 「図面を開く」→「PDFに書き出す」→「保存する」
  • 弱点: ユーザーが「保存」ボタンを押したときには、もうマクロは動いていません。ユーザーが操作を忘れたら、バックアップは取られません。

イベント駆動型(Event-Driven): 「もし〜が起きたら、これをやって」

プログラムは常に「待ち」の状態にあります。

  • 「もし、ユーザーが『保存』を押したら、裏でPDFを作って」
  • 「もし、新しい図面が作成されたら、ログに記録して」
  • 利点: ユーザーの作業フローを一切邪魔しません。設計者はいつも通り作業するだけで、システムが「勝手に」守ってくれるのです。

2. 鍵を握るのは「クラスモジュール」という魔法の箱

「でも、どうやってSolidWorksの動きを監視するの?」と思いますよね。
ここで登場するのが、VBAの真の主役、「クラスモジュール」です。

多くの初学者は「標準モジュール」にコードを書き込みますが、標準モジュールは「単発の命令」には向いていても、「状態を監視し続ける」ことには向いていません。

クラスモジュールは、「特定の役割を持った、意思を持つオブジェクト」を作ることができる場所です。今回のテーマでは、このクラスモジュールに「SolidWorksのイベントを待ち構える耳」を持たせます。

3. 実装:静かなる守護神(Silent Guardian)のコード

それでは、実際に「図面が保存された瞬間に、PDFを自動生成してログを残す」システムの心臓部を実装してみましょう。

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

VBAエディタで、`挿入` → `クラスモジュール` を選択し、オブジェクト名を `clsEventWatcher` に変更してください。

' ============================================================
' クラス名: clsEventWatcher
' 役割: SolidWorksのイベントを監視し、保存イベントを検知する
' ============================================================
Option Explicit

' SolidWorksのアプリケーションオブジェクトを「イベント付き」で宣言
' これにより、SwApp内で発生するイベントをこのクラスがキャッチできるようになります
Public WithEvents SwApp As SldWorks.SldWorks

' --- イベントハンドラ ---

' ファイルが保存された時に自動的に呼び出されるイベント
' (注意: VBAの制約上、完全なアドイン形式でない場合、
'  特定の操作をトリガーにするには工夫が必要ですが、ここでは概念的な実装を示します)
Private Sub SwApp_DocumentSaveNotify(ByVal FileName As String)
    On Error GoTo ErrorHandler
    
    ' 1. 保存されたファイルが「図面(Drawing)」かどうかを判定
    ' 拡張子が .slddrw であることを確認
    If LCase(Right(FileName, 6)) = ".slddrw" Then
        Debug.Print "【検知】図面保存を確認しました: " & FileName
        
        ' 2. バックアップ処理を呼び出す(非同期的な動きを模倣)
        Call ExecuteBackupProcess(FileName)
    End If

Exit Sub

ErrorHandler:
    Debug.Print "【エラー】イベント処理中に問題が発生しました: " & Err.Description
End Sub

' --- 内部処理用メソッド ---

Private Sub ExecuteBackupProcess(ByVal TargetPath As String)
    Dim swModel As SldWorks.ModelDoc2
    Dim swExportData As SldWorks.ExportPdfData
    Dim strPdfPath As String
    Dim fileNum As Integer
    
    ' PDFの保存パスを作成 (例: original_name.pdf)
    strPdfPath = Left(TargetPath, InStrRev(TargetPath, ".") - 1) & ".pdf"
    
    ' --- ここからが「裏側」の仕事 ---
    
    ' A. PDFエクスポート処理
    Set swModel = SwApp.ActiveDoc
    If Not swModel Is Nothing Then
        ' PDF保存の実行
        swModel.Extension.SaveAs strPdfPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing
        Debug.Print "【完了】PDFバックアップ作成: " & strPdfPath
    End If
    
    ' B. ログ記録処理 (テキストファイルに追記)
    fileNum = FreeFile
    Open ThisWorkbook.Path & "\backup_log.txt" For Append As #fileNum
    Print #fileNum, Now & " | Saved: " & TargetPath & " | PDF: " & strPdfPath
    Close #fileNum
    
End Sub

ステップ2:標準モジュールでの起動

次に、この「耳」を持つクラスを、SolidWorksの中で「生きて」いさせるためのコードを標準モジュールに書きます。

' ============================================================
' 標準モジュール
' 役割: クラスのインスタンス化とライフサイクル管理
' ============================================================
Option Explicit

' クラスのインスタンスを「モジュールレベル」で保持する
' これを忘れると、マクロが終わった瞬間にクラスが消滅(メモリ解放)してしまいます!
Private Watcher As clsEventWatcher

Sub StartSystem()
    ' 1. クラスのインスタンスを作成
    Set Watcher = New clsEventWatcher
    
    ' 2. SolidWorks本体とクラスを紐付ける
    ' これにより、WatcherがSolidWorksの動きを「監視」し始めます
    Set Watcher.SwApp = Application.SldWorks
    
    MsgBox "バックアップシステムが起動しました。" & vbCrLf & _
           "図面を保存すると、自動的にPDFが作成されます。", vbInformation
End Sub

Sub StopSystem()
    ' システムを停止する場合
    Set Watcher = Nothing
    MsgBox "システムを停止しました。", vbExclamation
End Sub

4. アーキテクトの視点:陥りやすい「3つの罠」

このコードを動かす際、プロフェッショナルとして絶対に避けて通れない注意点があります。ここが、初心者と上級者を分ける境界線です。

① オブジェクトのライフサイクル(生存期間)の罠

標準モジュールのコードで `Dim Watcher As clsEventWatcher` を `Sub StartSystem()` の中に書いていませんか?
もしそうなら、マクロを実行した瞬間に `Watcher` は作成されますが、`Sub` が終了した瞬間にメモリから消え去り、監視は止まってしまいます。
「クラスのインスタンスは、モジュールレベル(一番上)で宣言して、ずっと生存させ続ける」。これが鉄則です。

② UIブロッキング(フリーズ)の罠

VBAは基本的に「シングルスレッド」です。つまり、バックアップ処理(PDF作成)が重すぎると、設計者が図面を操作しようとしたときにSolidWorksが「応答なし」になってしまいます。
実運用では、`DoEvents` を適切に挟むか、あるいは非常に重い処理は別のアプリケーション(外部のPythonスクリプトなど)に投げるといった、「重い仕事をメインの作業から切り離す」設計思想が求められます。

③ エラーハンドリングの欠如

イベント駆動型は「いつ、何が起きるか分からない」世界です。
保存中にネットワークドライブが切断された……そんな時、エラーでマクロが止まってしまうと、設計者の作業を妨害することになります。必ず `On Error GoTo` を使い、「エラーが起きても、設計者の作業には一切影響を与えない(静かにログだけ残す)」という謙虚な設計を心がけてください。

最後に:ここをクリアすれば、あなたはもう「自動化エンジニア」です

いかがでしたか?
「マクロの記録」で得られるのは、単なる操作の録画です。しかし、今回学んだ「クラスモジュールによるイベント監視」は、ソフトウェアの振る舞いをコントロールする設計力です。

最初はクラスモジュールの概念に戸惑うかもしれません。しかし、一度この「イベント」の感覚を掴めば、あなたの作るツールは、単なる便利道具から、設計チームの「頼れる相棒」へと進化します。

一歩ずつ、確実に。コードの裏側にある「オブジェクトの命」を感じながら、素晴らしい自動化の世界を進んでください。応援していますよ!

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