- ねらい:Excelの一覧から、Slackに「自動でメッセージ投稿」する“型”を作る
- Slack 側の準備:Incoming Webhook の URL を手に入れる
- シート設計:Slack に「何を」「どこに」送るかを Excel に書いておく
- 共通基盤:HTTP POST とテンプレ差し込みのユーティリティ
- Slack 向け JSON ペイロードの組み立て
- 一括配信ロジック:SlackList をループして投稿する
- 例題:日次レポートを Slack に自動投稿する
- 重要ポイントの深掘り:Slack 自動配信を“安全に”“壊れにくく”運用する
- まとめ:Excel で“通知シナリオ”を管理し、VBA で Slack に投げる
ねらい:Excelの一覧から、Slackに「自動でメッセージ投稿」する“型”を作る
毎日・毎週・毎月、同じような通知を Slack に貼っていませんか。
そのたびにコピペして、チャンネルを選んで…を続けると、時間もミスも積み上がります。
「自動配信ツール(Slack)」のゴールは、こうです。
Excel のシートに「どの Webhook に、どんなメッセージを送るか」を一覧にしておき、VBA で一気に Slack に投稿する。
通知内容を変えたいときはシートを書き換えるだけで済む“超再利用部品”にします。
ここでは、プログラミング初心者向けに、
Slack 側の準備(Incoming Webhook の URL を取る)
Excel シート設計(誰に、何を)
VBA から Webhook に JSON を投げるコード
差し込みテンプレートの作り方
日次・月次処理との組み合わせ例
まで、かみ砕いて説明します。
Slack 側の準備:Incoming Webhook の URL を手に入れる
Incoming Webhook の考え方
Excel VBA から直接「Slack アプリ」に話しかけるのではなく、
Slack が用意する「Incoming Webhook」という“受け口の URL”に対して、Excel から HTTP POST を送ります。
やることは一つだけです。
Slack のワークスペースで Incoming Webhook を作成し、投稿したいチャンネルにひも付ける。
そのときに発行される URL(だいたい https://hooks.slack.com/services/...)を控えておきます。
この URL を、あとで Excel のシートに書き込んでおき、VBA からそこに JSON を投げる、という流れになります。
シート設計:Slack に「何を」「どこに」送るかを Excel に書いておく
SlackList シートの列構成(最小構成)
メール版や Teams 版と同じ発想で、「SlackList」というシートを一枚作ります。
最低限、次のような列があると運用しやすいです。
A列: SendFlag(送信対象フラグ。Y の行だけ送る)
B列: WebhookUrl(投稿先 Slack Webhook URL)
C列: ChannelName(任意。どのチャンネル用かのメモ)
D列: Username(投稿時に表示する名前。空なら Webhook 側の設定)
E列: IconEmoji(:warning: など。空でも可)
F列: MessageTemplate(メッセージ本文テンプレート)
G列: Extra1(差し込み用1。日付やタイトルなど)
H列: Extra2(差し込み用2。数値やURLなど)
I列: Result(実行結果ログ)
J列: SentAt(送信日時)
MessageTemplate には、次のようなプレースホルダ入りテキストを書きます。
{Extra1} のバッチ処理が完了しました。
対象件数:{Extra2} 件
詳細はレポートをご確認ください。
後で VBA で {Extra1} や {Extra2} を置き換えます。
共通基盤:HTTP POST とテンプレ差し込みのユーティリティ
JSON を Slack Webhook に POST する関数
Slack の Webhook は、Content-Type: application/json の HTTP POST を受け取ります。
VBA からは MSXML2.XMLHTTP を使うのが簡単です。
' ModSlack_Base.bas
Option Explicit
Public Function HttpPostJson(ByVal url As String, ByVal jsonBody As String) As Boolean
On Error GoTo ErrHandler
Dim xhr As Object
Set xhr = CreateObject("MSXML2.XMLHTTP")
xhr.Open "POST", url, False ' 同期リクエスト
xhr.setRequestHeader "Content-Type", "application/json"
xhr.send jsonBody
If xhr.Status >= 200 And xhr.Status < 300 Then
HttpPostJson = True
Else
HttpPostJson = False
End If
Exit Function
ErrHandler:
HttpPostJson = False
End Function
VB戻り値 True/False で「成功/失敗」を返します。
本番で使うときは、ステータスコードやレスポンスをログに書き出す拡張もできますが、最初はこれくらいのシンプルさで十分です。
プレースホルダ差し込みユーティリティ
メール・Teams と同じ考え方で、{Key} を差し替える小さな関数を用意します。
' ModSlack_Template.bas
Option Explicit
Public Function ApplyPlaceholder(ByVal template As String, ByVal key As String, ByVal value As String) As String
ApplyPlaceholder = Replace(template, "{" & key & "}", value)
End Function
Public Function BuildMessage(ByVal template As String, _
ByVal extra1 As String, _
ByVal extra2 As String) As String
Dim msg As String
msg = template
msg = ApplyPlaceholder(msg, "Extra1", CStr(extra1))
msg = ApplyPlaceholder(msg, "Extra2", CStr(extra2))
BuildMessage = msg
End Function
VB差し込み項目を増やすときは、BuildMessage 内の行を追加するだけで対応できます。
Slack 向け JSON ペイロードの組み立て
最小構成のペイロード(テキストのみ)
Slack Webhook は、非常にシンプルな JSON でも動きます。
{
"text": "こんにちは、これは Excel VBA からの自動投稿です。"
}
これに、username や icon_emoji を加えると、投稿時の表示ユーザーやアイコンを変えられます。
VBA 側では、次のように組み立てます。
' ModSlack_Payload.bas
Option Explicit
Private Function EscapeJson(ByVal s As String) As String
Dim t As String
t = s
t = Replace(t, "\", "\\")
t = Replace(t, """", "\""")
t = Replace(t, vbCrLf, "\n")
t = Replace(t, vbCr, "\n")
t = Replace(t, vbLf, "\n")
EscapeJson = t
End Function
Public Function BuildSlackJson(ByVal message As String, _
ByVal username As String, _
ByVal iconEmoji As String) As String
Dim json As String
Dim textPart As String
textPart = """text"":""" & EscapeJson(message) & """"
Dim userPart As String
If Len(Trim$(username)) > 0 Then
userPart = ",""username"":""" & EscapeJson(username) & """"
Else
userPart = ""
End If
Dim iconPart As String
If Len(Trim$(iconEmoji)) > 0 Then
iconPart = ",""icon_emoji"":""" & EscapeJson(iconEmoji) & """"
Else
iconPart = ""
End If
json = "{" & textPart & userPart & iconPart & "}"
BuildSlackJson = json
End Function
VBEscapeJson で最低限のエスケープ(", 改行, \)を行っています。
Slack のペイロードはシンプルなので、まずは text + username + icon_emoji の構成から始めるのが楽です。
一括配信ロジック:SlackList をループして投稿する
SlackList を読み込み、各行ごとに Webhook へ POST
' ModSlack_Bulk.bas
Option Explicit
Public Sub BulkPost_ToSlack()
Dim ws As Worksheet
Set ws = Worksheets("SlackList")
Dim a As Variant
a = ws.Range("A1").CurrentRegion.Value ' ヘッダ含む全体
Dim r As Long
Dim total As Long, success As Long, failed As Long
total = 0: success = 0: failed = 0
For r = 2 To UBound(a, 1)
Dim flag As String
flag = UCase$(Trim$(CStr(a(r, 1)))) ' SendFlag
If flag = "Y" Then
total = total + 1
Dim url As String
Dim channelName As String ' メモ用。ペイロードには使っていない
Dim username As String
Dim iconEmoji As String
Dim tmpl As String
Dim extra1 As String
Dim extra2 As String
url = Trim$(CStr(a(r, 2)))
channelName = CStr(a(r, 3))
username = CStr(a(r, 4))
iconEmoji = CStr(a(r, 5))
tmpl = CStr(a(r, 6))
extra1 = CStr(a(r, 7))
extra2 = CStr(a(r, 8))
If Len(url) = 0 Then
ws.Cells(r, 9).Value = "URLなし"
failed = failed + 1
GoTo NextRow
End If
Dim msg As String
msg = BuildMessage(tmpl, extra1, extra2)
Dim json As String
json = BuildSlackJson(msg, username, iconEmoji)
Dim ok As Boolean
ok = HttpPostJson(url, json)
If ok Then
ws.Cells(r, 9).Value = "OK"
success = success + 1
Else
ws.Cells(r, 9).Value = "NG"
failed = failed + 1
End If
ws.Cells(r, 10).Value = Now ' SentAt
End If
NextRow:
Next r
MsgBox "Slack自動投稿が完了しました。" & vbCrLf & _
"対象: " & total & " 行" & vbCrLf & _
"成功: " & success & ", 失敗: " & failed, _
vbInformation
End Sub
VBこの Sub の動きは次の通りです。
SlackList の 2 行目以降を順に見ていきます。
SendFlag が “Y” の行だけ処理対象にします。
WebhookUrl(B列)が空なら即スキップし、Result に「URLなし」と書きます。
MessageTemplate と Extra1/Extra2 から本文を生成し、username/icon_emoji を含めた JSON を組み立てます。
HttpPostJson で Webhook に POST し、成功なら「OK」、失敗なら「NG」とログします。
SentAt 列(J列)に「投稿した日時」を書き込みます。
これで、「どの行が送れたのか/どれが失敗したのか」が一目で分かるようになります。
例題:日次レポートを Slack に自動投稿する
想定シナリオ
Summary シートに、何らかの日次集計結果があるとします。
Summary!B2:本日の売上合計
Summary!B3:本日の注文件数
これを、毎日「#daily-report」チャンネルに自動投稿したい、というケースを考えます。
Incoming Webhook で、そのチャンネル用の URL を一つ取得し、SlackList の B2 に書いておきます。
差し込みを含んだ実行例
' ModSlack_Example.bas
Option Explicit
Public Sub Run_DailySummary_ToSlack()
Dim salesTotal As Double
Dim orderCount As Long
salesTotal = Worksheets("Summary").Range("B2").Value
orderCount = CLng(Worksheets("Summary").Range("B3").Value)
Dim ws As Worksheet
Set ws = Worksheets("SlackList")
ws.Range("A2").Value = "Y" ' SendFlag
' B2: WebhookUrl は事前に手入力しておく
ws.Range("C2").Value = "#daily-report" ' ChannelName(メモ用)
ws.Range("D2").Value = "Daily Bot" ' Username
ws.Range("E2").Value = ":bar_chart:" ' IconEmoji
ws.Range("F2").Value = _
"{Extra1} の集計結果です。" & vbCrLf & _
"売上合計:{Extra2} 円" & vbCrLf & _
"件数:" & orderCount & " 件"
ws.Range("G2").Value = Format(Date, "yyyy-mm-dd") ' Extra1
ws.Range("H2").Value = Format(salesTotal, "#,##0") ' Extra2
BulkPost_ToSlack
End Sub
VB動きとしては、
Summary シートから売上・件数を読み込む。
SlackList 2 行目に SendFlag やテンプレートを埋め込む。
BulkPost_ToSlack を呼んで、実際に Slack に投稿する。
という流れです。
日次処理マクロの最後にこの Sub を呼び出すようにしておけば、
集計完了と同時に Slack へ通知が飛ぶようになります。
重要ポイントの深掘り:Slack 自動配信を“安全に”“壊れにくく”運用する
Webhook URL をどう管理するか
Webhook URL は「その URL を知っている人なら誰でもそのチャンネルに投稿できる」という性質を持っています。
そのため、セキュリティ的な配慮も必要です。
共有ブックにベタ書きしない。
できれば Webhook URL を記載したシート(またはブック)はアクセス権を絞る。
開発・テストでは“テスト用チャンネルの Webhook”を使い、本番チャンネルの URL は狭い範囲だけが触れるようにする。
といった運用をおすすめします。
いきなり本番チャンネルに流さない
まずは専用のテストチャンネルを用意し、そこに対して投稿してみてください。
テキストの整形(改行や日本語・絵文字がどう見えるか)
JSON のエスケープ漏れがないか
想定通りの行数・タイミングで投稿されるか
を確認してから、本番用 Webhook に切り替えると事故が減ります。
メッセージを“凝りすぎない”ところから始める
Slack は本当は Block Kit などを使ってリッチなメッセージも作れますが、
JSON の構造が一気に複雑になり、VBA から扱うハードルが上がります。
まずは「text とアイコン・ユーザー名」だけのシンプルな投稿から始めてみてください。
慣れてきたら、
見出し行と本文を分ける
改行やマークダウン(*強調* や > 引用)を使って読みやすくする
といった“テキストの工夫”で十分実用レベルになります。
エラー時のログを残す
BulkPost_ToSlack は、結果を I列(Result)と J列(SentAt)に書いています。
それでも、実務では「なぜ NG だったのか」を知りたい場面が出てきます。
余裕があれば、
HttpPostJson の中で xhr.Status や xhr.responseText を取得し、
SlackList の別列(ErrorDetail など)に書き込む
ように拡張すると、トラブルシュートがかなり楽になります。
まとめ:Excel で“通知シナリオ”を管理し、VBA で Slack に投げる
自動配信ツール(Slack)は、
Slack 側で Incoming Webhook を作り、URL を取得する。
Excel 側で SlackList に「送る/送らない」「WebhookUrl」「テンプレ」「差し込み値」を書いておく。
VBA でテンプレ差し込み → JSON ペイロード生成 → HttpPostJson で一括送信。
という型さえ作ってしまえば、
日次レポート、バッチ完了通知、エラーアラート、締切リマインドなど、
いくらでも“シナリオ”を追加していけます。
