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

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

AutoCADを「孤島」から解き放つ:Webhook連携で図面保存をチームの共有体験に変える

こんにちは。現場の設計業務を支えるエンジニアの皆さん。
日々、巨大なDWGファイルと格闘し、保存が終わるのをじっと待つ……そんな時間は、エンジニアにとって最も「生産性が停止している」時間ですよね。

「重い図面の保存が終わったよ」「バッチ処理が完了したから確認して」
これらをいちいちチャットツールに打ち込むのは、手間ですし、何より「自動化の魂」が足りません。

今日は、AutoCAD VBAを単なる「図形を描く道具」から、「チームと通信するインテリジェントなエージェント」へと進化させる手法を伝授します。ターゲットは、マクロの記録から一歩踏み出し、実務で使える「仕組み」を作りたいと考えている中級者への入り口です。

1. なぜ「Webhook」なのか? ―― 境界線を越える技術

これまでのVBAは、AutoCADという「閉じた世界」の中だけで完結していました。しかし、現代のワークスタイルはリモートが主流です。作業の進捗を周囲に知らせるには、AutoCADの外側にある Teams や Slack と会話する必要があります。

そこで登場するのが 「Webhook(ウェブフック)」 です。

Webhookは、簡単に言えば「特定のURLに対して、決められた形式のデータを投げると、あらかじめ設定されたアクション(チャットへの投稿など)を実行してくれる仕組み」です。

AutoCAD VBAからこのURLに対して「メッセージ」を送信するだけで、あなたの図面作業はリアルタイムでチームに共有されるようになります。

2. 事前準備:通知の「宛先」を手に入れよう

コードを書く前に、まずは通知を送るための「窓口(URL)」を用意しましょう。

Teamsの場合

1. 通知したいチャネルの「コネクタ」または「ワークフロー」から「Incoming Webhook」を選択。
2. 名前を設定し、発行された URL をコピーしてメモしておきます。

Slackの場合

1. 「Incoming Webhooks」アプリをチャンネルに追加。
2. 発行された Webhook URL をコピーしておきます。

3. 実装:魂を込めた「Smart Save」コード

それでは、いよいよコードの世界へ。
今回は、単なる `Save` コマンドではなく、「保存を実行し、成功したらチャットへ報告する」 という一連の流れをパッケージ化した関数を作成します。

⚠️ 重要なステップ:参照設定

このコードを動かすには、VBAエディタのメニューから [ツール] -> [参照設定] を開き、以下にチェックを入れてください。これがないと、インターネットへの通信(HTTPリクエスト)ができません。

  • Microsoft XML, v6.0

実装コード例

Option Explicit

' =================================================================
' 目的: 図面を保存し、完了後にTeams/Slackへ通知を送る
' 開発者: あなたの専属チーフアーキテクト
' =================================================================

Sub SmartSaveAndNotify()
    Dim doc As AcadDocument
    Set doc = ThisDrawing
    
    ' --- 設定エリア ---
    ' 先ほど取得したWebhook URLをここに貼り付けてください
    Const WEBHOOK_URL As String = "https://your-webhook-url-here..."
    ' ------------------

    On Error GoTo ErrorHandler

    ' 1. 図面の保存を実行
    ' ユーザーが保存をキャンセルした場合はここで中断される
    doc.Save

    ' 2. 通知メッセージの構築
    ' JSON形式というルールに従って文字列を作成します
    Dim msg As String
    Dim fileName As String
    fileName = doc.Name
    
    ' Teams/Slackが理解できるJSON形式の組み立て
    ' ※メッセージ内容はツールに合わせて調整が必要な場合があります
    msg = "{""text"": ""✅ 図面保存完了通知\n" & _
          "ファイル名: " & fileName & "\n" & _
          "ステータス: 正常に保存されました。""}"

    ' 3. Webhookの送信実行
    Call SendToWebhook(WEBHOOK_URL, msg)

    MsgBox "保存と通知が完了しました。", vbInformation, "Success"
    Exit Sub

ErrorHandler:
    ' 保存キャンセルやネットワークエラーが発生した場合
    If Err.Number <> -2147012865 Then ' 保存キャンセル等の特定エラーを除外
        MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "Error"
        ' エラー時もチームに知らせるなら、ここで通知関数を呼ぶのも手です
    End If
End Sub

''' <summary>
''' HTTP POSTリクエストを使用してWebhookへデータを送信する低レイヤー関数
''' </summary>
Private Sub SendToWebhook(url As String, jsonPayload As String)
    Dim http As MSXML2.XMLHTTP60
    Set http = New MSXML2.XMLHTTP60

    ' HTTP POSTメソッドで接続を開始
    http.Open "POST", url, False
    
    ' ヘッダーの設定: 「今から送るのはJSONデータですよ」と伝える
    http.setRequestHeader "Content-Type", "application/json"

    ' データの送信
    http.send jsonPayload

    ' レスポンス(サーバーからの返事)の確認
    ' 200番台が成功、それ以外はエラー
    If http.Status < 200 Or http.Status >= 300 Then
        Debug.Print "Webhook送信失敗。Status: " & http.Status & " Response: " & http.responseText
    End If
End Sub

4. アーキテクトの視点:陥りやすい罠とパフォーマンスの重み

ここからは、リファレンスには載っていない「現場の知恵」をお伝えします。

① ネットワークの「待ち時間」というコスト

`http.send` を実行している間、AutoCADは一瞬だけ「通信待ち」の状態になります。図面が非常に重い場合、保存自体に時間がかかりますが、ネットワークが極端に遅い環境だと、保存が終わった後も数秒間AutoCADが固まったように見えることがあります。
「自動化は便利だが、ユーザーの操作感を奪わないこと」。これがプロの設計思想です。

② エラーハンドリングの重要性

もしインターネットが切断されていたら? WebhookのURLが間違っていたら?
もしエラー処理(`On Error GoTo`)を怠ると、「図面は保存できたのに、通知エラーのせいでマクロが止まってしまう」 という本末転倒な事態を招きます。
「図面の保存」というメイン業務を絶対に邪魔させないための、堅牢なエラーハンドリングを心がけてください。

③ JSON形式の「クォーテーション」地獄

コード内で `msg = “{“”text””: …}”` と、ダブルクォーテーションが重なっている部分に気づきましたか?
JSONは文字列を `”` で囲むルールがありますが、VBAの文字列内で `”` を表現するには `””` と2つ重ねる必要があります。ここを間違えると、チャットツール側で「不正なデータです」と拒絶されてしまいます。

まとめ:一歩先の自動化へ

今回のコードは、単にメッセージを送るだけのものではありません。
「AutoCADというツールを、組織のワークフローに組み込むための架け橋」 です。

これができるようになれば、次は「バッチ処理で100個の図面を変換し、最後に一括で完了報告を送る」といった、より高度な自動化へステップアップできます。

「マクロの記録」で終わるか、それとも「システム」を構築するか。
その境界線は、こうした外部連携への挑戦にあります。

さあ、あなたのAutoCADに、新しい「声」を与えてあげてください。
応援していますよ。

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