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に限らず、あらゆるソフトウェア開発における鉄則だ。この設計思想を武器に、単なる「スクリプター」から、真の「オートメーション・エンジニア」へと昇華してほしい。
