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

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

AutoCAD VBAの限界を超えろ:Webhook連携による「通知の自動化」と堅牢な設計思想

業務自動化の現場において、「図面が保存された」という事実は、単なるファイルI/Oの完了ではない。それは、プロジェクトの進捗、設計フェーズの遷移、あるいはバッチ処理の完了を意味する「ステータスの変化」である。

多くの初学者は、図面の保存完了時に「メッセージボックスを表示する」程度の処理で満足する。しかし、プロフェッショナルを目指すならば、その通知を設計者個人の画面内に閉じ込めてはならない。TeamsやSlackといったコミュニケーションツールへ、非同期的に、かつ確実に情報を飛ばす。これこそが、現代のリモートワーク環境における「真の自動化」だ。

本記事では、AutoCAD VBAからWebhookを叩き、外部チャットツールへ通知を送る実装について、単なる「動くコード」ではなく、「業務システムとして耐えうる堅牢な設計」の観点から解説する。

1. アーキテクチャの設計思想:なぜ「直書き」は悪なのか

まず、設計段階で陥りやすい致命的なミスを指摘しておく。

初心者は、`ThisDrawing` モジュールの `Document_Save` イベントの中に、直接HTTPリクエストのコードを書き込む。
これは、プロフェッショナルとして最も避けるべき「アンチパターン」だ。

なぜその設計が失敗するのか?

1. メインスレッドのブロッキング: AutoCADはシングルスレッドに近い挙動をする。ネットワーク通信(HTTPリクエスト)は、応答が返ってくるまで処理を待機させる。もし、社内ネットワークの瞬断や、Slack/Teams側のレスポンス遅延が発生した場合、ユーザーは「図面を保存している最中にAutoCADがフリーズした」と感じる。
2. 結合度の高さ: 通知先URLやメッセージ形式がイベントハンドラ内にハードコードされていると、通知先が変わるたびに、図面制御のロジックまで修正・再配布しなければならなくなる。
3. エラーハンドリングの欠如: 通信エラーが発生した際、VBAのランタイムエラーがダイアログとしてユーザーの前に突きつけられる。これは、業務ツールとしての信頼性を著しく損なう。

目指すべき設計:疎結合とエラー隔離

我々が目指すのは、「図面保存というコア業務」と「外部通知という副作用」を論理的に分離した設計である。通信処理は専用のユーティリティモジュールに隠蔽し、万が一の通信失敗が図面操作に影響を与えない「Fail-safe(フェイルセーフ)」な構造を構築する。

2. 実装:堅牢なWebhook通知エンジンの構築

それでは、実戦投入可能なコードを見ていこう。ここでは、`Microsoft XML, v6.0` を参照設定に使用することを前提とする。

Step 1: 通知用ユーティリティモジュールの作成

まず、通知ロジックを独立させた `modNetworkUtils` モジュールを作成する。ここで重要なのは、タイムアウトの設定と、エラーを「握りつぶすのではなく、ログに留める」設計だ。

'==============================================================================
' Module: modNetworkUtils
' Description: 外部API(Webhook)への通信を制御するユーティリティ
'==============================================================================
Option Explicit

''' <summary>
''' SlackやTeamsのWebhook URLへJSON形式でメッセージを送信する
''' </summary>
''' <param name="webhookUrl">送信先のWebhook URL</param>
''' <param name="message">送信するメッセージ本文</param>
Public Sub SendWebhookNotification(ByVal webhookUrl As String, ByVal message As String)
    Dim http As Object
    Dim jsonPayload As String
    
    ' エラーハンドリング:通信エラーがAutoCAD本体の動作を阻害しないようにする
    On Error GoTo ErrorHandler

    ' MSXML2.ServerXMLHTTP を使用(通常のXMLHTTPよりネットワーク制御に強い)
    Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")

    ' JSONペイロードの構築 (簡易的な文字列結合による実装)
    ' 本来はJSONライブラリを使うべきだが、単一メッセージならこれで十分軽量かつ高速
    ' Teams用(Adaptive Cards)やSlack用(Standard)に合わせて調整が必要
    jsonPayload = "{""text"": """ & message & """}"

    ' HTTPリクエストの初期化
    http.Open "POST", webhookUrl, False
    http.setRequestHeader "Content-Type", "application/json"

    ' 通信実行
    ' 注意: ここでネットワーク遅延が発生すると、AutoCADの操作が一時停止する。
    ' 究極の回避策は、VBScript等を用いて別プロセスで実行することだが、
    ' VBAの範囲内では、ServerXMLHTTPによるタイムアウト管理が現実的な解となる。
    http.Send jsonPayload

    ' ステータスチェック
    If http.Status <> 200 And http.Status <> 204 Then
        Debug.Print "Webhook Error: Status " & http.Status & " - " & http.responseText
    End If

CleanUp:
    Set http = Nothing
    Exit Sub

ErrorHandler:
    ' ユーザーにダイアログを出さず、イミディエイトウィンドウにのみエラーを記録する
    ' これが「業務ツール」としてのマナーである
    Debug.Print "Critical Network Error: " & Err.Description
    Resume CleanUp
End Sub

Step 2: イベントハンドラへの組み込み

次に、`ThisDrawing` モジュールにて、保存イベントをフックする。ここでは、通知内容に「ファイル名」や「ユーザー名」を含めることで、情報の価値を高める。

'==============================================================================
' Module: ThisDrawing
' Description: 図面イベントのハンドリング
'==============================================================================
Option Explicit

' 通知設定(本来は外部設定ファイルやレジストリから読み込むべき)
Private Const WEBHOOK_URL As String = "https://hooks.slack.com/services/TXXXX/BXXXX/XXXX"

Private Sub Document_Save()
    ' 1. 図面の保存処理自体はAutoCADのネイティブ処理に任せる
    ' (このイベントが呼ばれた時点で、保存処理は進行中または完了直後)

    ' 2. 通知情報の構築
    Dim msg As String
    Dim fileName As String
    Dim userName As String
    
    fileName = ThisDrawing.Name
    userName = Environ("USERNAME") ' OSのログインユーザー名を取得
    
    msg = "【図面保存完了】" & vbCrLf & _
          "ファイル: " & fileName & vbCrLf & _
          "担当者: " & userName & vbCrLf & _
          "時刻: " & Now()

    ' 3. 非同期的な通知の実行(設計思想に基づき、通知失敗が保存を妨げないように呼び出す)
    ' ここで直接呼ぶのではなく、エラーハンドリングが完結しているモジュールを呼び出す
    Call modNetworkUtils.SendWebhookNotification(WEBHOOK_URL, msg)
End Sub

3. プロフェッショナルとしての「次の一手」:さらなる高度化に向けて

上記のコードは、実務で即座に利用できるレベルに達している。しかし、伝説的なアーキテクトを目指すならば、以下の発展的な課題についても思考の端に置いておく必要がある。

A. 非同期処理の極限(True Asynchronous)

VBAの限界は、通信中にメインスレッドを止めてしまうことだ。これを完全に回避するには、VBAから `WScript.Shell` を経由して、外部のVBScriptやPowerShellスクリプトを「非同期(WindowStyle 0)」で起動する手法がある。これならば、AutoCADはHTTPレスポンスを待たずに、即座に次の操作を受け付けることが可能になる。

B. 設定の外部化

`WEBHOOK_URL` をコード内に持つことは、保守性の観点から避けるべきだ。

  • INIファイル または JSONファイル
  • レジストリ

これらから設定を読み込むように実装を変更することで、プログラムを書き換えることなく、通知先の変更や運用環境の切り替えが可能になる。

C. ログ管理の徹底

`Debug.Print` は開発用だ。プロダクション環境では、通信失敗の履歴を テキストログファイル に書き出す仕組みを実装せよ。これにより、「通知が届いていない」というクレームに対し、「〇時〇分にネットワークエラーが発生していた」という客観的なエビデンスを持って回答できるようになる。

まとめ

AutoCAD VBAによる自動化の本質は、単に「作業を楽にする」ことではない。「人間が介在しなくても、システムが正しく、安定して、周囲と連携して動く状態を作る」ことにある。

今回紹介した「エラーを隔離し、疎結合に設計する」という手法は、VBAに限らず、あらゆるソフトウェア開発における鉄則だ。この設計思想を武器に、単なる「スクリプター」から、真の「オートメーション・エンジニア」へと昇華してほしい。

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