【テクニカル・上級編】【実務中級者向け】図面保存完了時に「Teams/Slack」へ通知を飛ばす:VBAとWebhookを連携させた進捗管理 – AutoCAD VBA解析バイブル

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

CADの沈黙を破る:AutoCAD VBAとWebhookによる「可視化」の極致

図面処理の自動化において、多くのエンジニアは「処理を完遂させること」にのみ執着する。しかし、真に堅牢なシステムを設計するアーキテクトの視点は異なる。我々が追求すべきは、「処理のプロセスをいかに外部環境へ同期させ、チーム全体のコンテキストを維持するか」である。

特に、数GBに及ぶ巨大なDWGファイルのバッチ処理や、長時間にわたる複雑な計算処理を走らせている際、CADは「沈黙」する。ユーザーはプロセスが生きているのか、あるいはハングアップしたのかを判断できず、リモートワーク環境下ではその不透明さがチームの生産性を著しく低下させる。

本稿では、AutoCAD VBAを単なる「CAD操作のスクリプト」から、モダンなコラボレーションツール(Teams/Slack)と連携する「インテリジェントなエージェント」へと昇華させるための、極限の知見を共有する。

1. アーキテクチャの設計思想:疎結合な通知メカニズム

外部チャットツールへの通知を実現するには、Webhookを利用するのが最も効率的かつ標準的なアプローチである。しかし、VBAから直接HTTPリクエストを飛ばす実装には、いくつかの落とし穴がある。

避けるべき設計

  • Shell関数による外部コマンド実行: `curl`などを`Shell`関数で呼び出す手法は、プロセスの生成コスト(オーバーヘッド)が高く、エラーハンドリングが極めて困難である。
  • 同期処理によるCADのフリーズ: ネットワークの遅延がCADのメインスレッドを長時間占有し、ユーザー体験を著しく損なう設計。

採用すべき設計

  • WinHTTP Servicesの利用: `WinHttp.WinHttpRequest.5.1` を使用し、低レイヤーに近いレベルでHTTP通信を制御する。
  • 軽量なJSONペイロード: VBAには標準のJSONライブラリが存在しない。外部ライブラリへの依存を最小限に抑えるため、文字列操作による精密なJSON構築を行う。

2. 実装:高信頼性Webhookクライアント

以下に、実務に耐えうる、堅牢な通知モジュールの実装例を示す。ここでは、メモリリークを防ぐためのオブジェクトの明示的な解放と、エラー発生時でもCADのプロセスを中断させないための例外処理を徹底している。

' --- Standard Module: modNotification ---
Option Explicit

' Windows API: システムのタイマーや高精度な待機が必要な場合に使用するが、
' 今回はWinHTTPのタイムアウト制御に注力する。

''' <summary>
''' Teams/SlackのWebhookへ通知を送信する
''' </summary>
''' <param name="webhookUrl">WebhookのURL</param>
''' <param name="message">送信するメッセージ内容</param>
Public Sub SendRemoteNotification(ByVal webhookUrl As String, ByVal message As String)
    Dim http As Object
    Dim jsonPayload As String
    
    ' エラーハンドリング: ネットワークエラーがCADの停止を招かないように隔離する
    On Error GoTo ErrorHandler

    ' WinHTTPオブジェクトの生成
    ' MSXML2.XMLHTTPよりも、WinHttp.WinHttpRequestの方がエンタープライズ用途(タイムアウト制御等)に適している
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    ' JSONペイロードの構築(簡易的なエスケープ処理を含む)
    ' 本来はJSONライブラリを使用すべきだが、依存関係を排除するため直接構築する
    jsonPayload = "{""text"": """ & EscapeJsonString(message) & """}"

    ' HTTPリクエストの設定
    With http
        .Open "POST", webhookUrl, False ' Falseは同期通信。ただし、処理時間を最小化する
        .SetRequestHeader "Content-Type", "application/json"
        
        ' タイムアウト設定 (Resolve, Connect, Send, Receive)
        ' ネットワークの不調でCADが固まるのを防ぐための生命線
        .SetTimeouts 5000, 5000, 5000, 5000
        
        ' リクエスト送信
        .Send jsonPayload
        
        ' ステータスコードの検証
        If .Status <> 200 And .Status <> 204 Then
            Debug.Print "Notification Failed. Status: " & .Status & " Response: " & .ResponseText
        End If
    End With

CleanUp:
    ' 【極めて重要】オブジェクトの明示的な解放
    ' AutoCADのCOMモデルにおいて、オブジェクトの解放漏れはメモリリーク、
    ' さらにはAutoCAD自体のクラッシュを引き起こす。
    Set http = Nothing
    Exit Sub

ErrorHandler:
    ' ログ出力(実務ではファイル出力やイベントログへの記録を推奨)
    Debug.Print "Critical Error in SendRemoteNotification: " & Err.Description
    Resume CleanUp
End Sub

''' <summary>
''' JSON文字列内の特殊文字をエスケープする
''' </summary>
Private Function EscapeJsonString(ByVal str As String) As String
    Dim res As String
    res = Replace(str, "\", "\\")
    res = Replace(res, """", "\""")
    res = Replace(res, vbCr, "\r")
    res = Replace(res, vbLf, "\n")
    res = Replace(res, vbTab, "\t")
    EscapeJsonString = res
End Function

3. ライフサイクルへの統合:イベントハンドラの掌握

通知を「いつ」飛ばすかは、システムの信頼性を左右する。最も効果的なタイミングは、図面が保存された直後、あるいはバッチ処理のループの終端である。

図面保存完了時のトリガー

`ThisDrawing` モジュール内で `Document_Close` または、保存をラップしたカスタムメソッド内で呼び出す。

' --- ThisDrawing Module ---
Option Explicit

Private Sub Document_Close()
    ' 図面が閉じられる(=保存プロセスが完了した)タイミングで通知
    ' 注意: ユーザーが「保存しない」で閉じた場合の判定ロジックを組み込むべき
    
    Const WEBHOOK_URL As String = "https://hooks.slack.com/services/TXXXX/BXXXX/XXXX"
    Dim msg As String
    
    msg = "✅ 図面処理完了: " & ThisDrawing.Name & vbCrLf & _
          "👤 実行者: " & Environ("USERNAME") & vbCrLf & _
          "⏰ 完了時刻: " & Now()
          
    ' 通知処理の呼び出し
    modNotification.SendRemoteNotification WEBHOOK_URL, msg
End Sub

4. アーキテクトの深淵:パフォーマンスとメモリ管理の真実

この実装を実務に投入する際、シニアエンジニアが留意すべきは「副作用の最小化」である。

1. オブジェクトのライフサイクルとCOMの整合性

VBAにおける `Set obj = Nothing` は、単なる作法ではない。AutoCADは大規模なCOMサーバーとして動作しており、参照カウントが正しく管理されない場合、AutoCADプロセス内に「ゾンビオブジェクト」が残留する。これは、次にAutoCADを起動した際のメモリ不足や、アドインのロード失敗の主因となる。特に、`WinHttp` のような外部通信オブジェクトは、例外発生時でも必ず `CleanUp` セクションを通るよう `On Error GoTo` を設計しなければならない。

2. ネットワーク遅延の局所化

本コードでは `SetTimeouts` を使用している。これは極めて重要だ。もし社内プロキシや不安定なVPNを経由して通知を飛ばす場合、タイムアウト設定がないと、通信がタイムアウトするまでCADのUIスレッドが完全にロックされる。ユーザーは「CADが死んだ」と誤認し、強制終了(Task Kill)を行う。これは、保存中のデータ破損を招く最も危険なシナリオである。

3. レガシー環境への配慮

`WinHttp.WinHttpRequest.5.1` は、Windowsの標準コンポーネントであるため、多くのレガシーなWindows環境でも動作する。しかし、環境によってはプロキシ設定が必要になる場合がある。その際は、`http.SetProxy` メソッドを用いて、環境変数に基づいたプロキシ設定を動的に注入する設計へとアップグレードせよ。

結論

AutoCAD VBAによる自動化の完成形は、単に図面を操作することではない。その自動化プロセスを、組織のコミュニケーションフローの中に「組み込む」ことにある。

Webhookを利用した通知の実装は、一見すると些末な機能に見えるかもしれない。しかし、この「可視化」というレイヤーを加えることで、自動化システムは「孤立したスクリプト」から「信頼されるインフラ」へと進化を遂げるのである。

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