GAS × Access

API連携とイベントドリブン処理

nanikatoaccess

目次

  1. はじめに:API連携とイベントドリブン処理のメリット
  2. AccessでのAPI連携:基本アプローチ
    • 2.1 WinHttp/XMLHTTPを使ったHTTP通信
    • 2.2 Webhookやパススルークエリとの組み合わせ
    • 2.3 セキュリティ考慮(トークン管理など)
  3. イベントドリブン処理の実現パターン
    • 3.1 AccessフォームやVBAイベントをトリガーにする
    • 3.2 SQL Serverトリガーやジョブをトリガーにする
    • 3.3 外部サービスからのWebhookをAccessが受け取るケース
  4. ユースケース例:Slack通知・GAS・Power Automate連携
    • 4.1 Slack連携(Incoming Webhookでチャットへ自動投稿)
    • 4.2 Google Apps Scriptでクラウド処理を呼び出す
    • 4.3 Power Automate(旧Microsoft Flow)やLogic Appsとの統合
  5. 実装サンプル:Accessで在庫数変更時にSlack通知
    • 5.1 SQL Server更新→イベント→Slack API呼び出しフロー
    • 5.2 VBAコード例とポイント解説
  6. 運用・セキュリティ面のポイント
    • 6.1 トークン・キーの安全管理とHTTPS通信
    • 6.2 レートリミット・エラー時のリトライ設計
    • 6.3 ロギング・モニタリングとトラブルシュート
  7. まとめ

ないものはない!お買い物なら楽天市場

1. はじめに:API連携とイベントドリブン処理のメリット

Microsoft Accessは、Windowsデスクトップ上で手軽にフォームやレポートを作成できるツールとして長年利用されてきました。しかし、いわゆる「クライアントだけ」で完結する構成では、

  • 複数システム間のデータ連携
  • リアルタイムな通知や更新
  • クラウドサービスの活用

などの要望に対応しにくい場面が増えてきます。そこで注目されるのがAPI連携イベントドリブン処理です。

  1. API連携: SlackやGoogle Apps Script (GAS)、あるいは自社のWeb APIなどにHTTPリクエストを送り、外部サービスを呼び出したりデータを交換したりする仕組み。
  2. イベントドリブン処理: 「更新が発生したら即座にSlackへ通知」「SQL Serverが特定状態になったらAccessフォームを更新」など、ある“イベント”を契機に自動的にプログラムを動かす仕組み。

これにより、Accessを**「単なるデスクトップDB」から「他システムと連携して業務を自動化・最適化する中心的存在」**へ進化させられます。


2. AccessでのAPI連携:基本アプローチ

2.1 WinHttp/XMLHTTPを使ったHTTP通信

Access(VBA)から外部APIを呼び出す最もシンプルな方法は、WinHttp.WinHttpRequest(またはMSXML2.ServerXMLHTTP)を利用するやり方です。

  • POST/GETリクエストを送信し、JSONやXMLを受け取り、結果をレコードセットやフォームに反映。
  • セキュリティトークンやWebhook URLなどをヘッダ情報にセットし、API側の仕様どおりにデータを送信。

VBAコード例(簡易Slack連携):

Public Sub Slack通知(ByVal strMessage As String)
If IsNull(strMessage) Or strMessage = "" Then
MsgBox "送信メッセージを入力してください。"
Exit Sub
End If

Const SLACK_WEBHOOK As String = "https://hooks.slack.com/services/XXXX/XXXX/XXXX"
Dim jsonData As String
jsonData = "{""text"":""" & Replace(strMessage, """", """""") & """}"

Dim httpReq As Object
Set httpReq = CreateObject("WinHttp.WinHttpRequest.5.1")

httpReq.Open "POST", SLACK_WEBHOOK, False
httpReq.setRequestHeader "Content-Type", "application/json"
httpReq.Send jsonData

If httpReq.Status = 200 Then
MsgBox "Slackへ通知完了!"
Else
MsgBox "送信失敗: HTTP " & httpReq.Status
End If

Set httpReq = Nothing
End Sub

2.2 Webhookやパススルークエリとの組み合わせ

  • Webhook: 外部サービス(Slack, Stripe, PayPal, etc.)が「イベント発生→URLへHTTP POST」する仕組み。Accessは直接受信が難しいため、中間サーバー(IISやAzure Functionsなど)でWebhookを受け取り→AccessのDBを更新といった流れを設計するケースが多いです。
  • パススルークエリ: 主にAccessからSQL Server側へ処理を委ねる仕組みですが、API呼び出しそのものはVBA側で行い、パススルークエリでデータ集計や整形を行う流れもあり得ます。

2.3 セキュリティ考慮(トークン管理など)

APIを叩くときに必要なAPIキーやBearerトークンをVBAコード内にベタ書きするのはリスクが高いです。

  • ConfigテーブルやINIファイル、環境変数などへ保存し、Accessファイル配布時に漏洩しないように気を付ける。
  • HTTPS通信が必須なAPIが多いため、TLS対応ドライバとWinHttpの設定を確認。

3. イベントドリブン処理の実現パターン

3.1 AccessフォームやVBAイベントをトリガーにする

  • フォームイベント: AfterUpdate、OnClickなどで、データ更新のタイミングやボタン操作時にAPIを呼ぶ。
  • Timerイベント: 定期的にAPIチェックを行い、外部システムのステータスをAccess上に反映。
  • マクロ or VBA: AutoExecマクロで起動時に処理を仕込み、アプリ起動のイベントをフックする例もあります。

3.2 SQL Serverトリガーやジョブをトリガーにする

  • INSTEAD OF / AFTER トリガー: 受注テーブルがINSERTされた際に「HTTPリクエストを送る」ロジックをSQL Serverで書くことも可能。ただしT-SQLでHTTP呼び出しするにはCLRなどの拡張が必要となり、ハードルが上がる。
  • SQL Server Agent ジョブ: 定期実行やスケジュール処理により、Accessのデータ更新をトリガーにし、API連携を行う(ただし、細かいリアルタイム性は落ちる)。

3.3 外部サービスからのWebhookをAccessが受け取るケース

Access自体はローカルアプリなので、HTTPリスナーとしてWebhookを直接受信するのは難しいです。そこで:

  1. クラウド上のWebサービス(Azure FunctionsやGASなど)でWebhookを受け取る
  2. 必要なデータをSQL Serverに書き込み(またはAccessに通知)
  3. Accessが定期的にデータをポーリング or SQL Server通知で同期

これにより外部サービスとAccessを間接的に連携させることが可能です。


4. ユースケース例:Slack通知・GAS・Power Automate連携

4.1 Slack連携(Incoming Webhookでチャットへ自動投稿)

  • 在庫が閾値を下回ったらSlackへ投稿
  • 顧客登録されたら新規顧客通知を送信

いずれもAccessフォームやSQL Serverトリガーが連携のきっかけになり、SlackのWebhook URLへHTTP POSTで実装が簡単です。

4.2 Google Apps Scriptでクラウド処理を呼び出す

GASをWebアプリとして公開し、HTTPでAccess→GASへリクエストを送ります。

  • GAS側がSpreadSheetやGmail、カレンダーなどを制御し、結果をJSONで返信。
  • Access側ではWinHttpを使い、戻り値をDBに保存したり、フォームに表示したりできます。

4.3 Power Automate(旧Microsoft Flow)やLogic Appsとの統合

  • 「Access→SQL Server更新」をトリガーにPower Automateが起動して別システムに反映、メール送信などワークフローが進む。
  • 逆に**「外部システム→Power Automate」**が呼び出され、SQL Serverを更新、それをAccessで参照する流れもOK。

5. 実装サンプル:Accessで在庫数変更時にSlack通知

ここでは「在庫数が変動したらSlack通知を飛ばす」というユースケースを例に、連携方法をざっくり示します。

5.1 SQL Server更新→イベント→Slack API呼び出しフロー

  1. Accessフォームで数量を更新 → SQL Serverテーブル(dbo.在庫マスタ)に反映。
  2. AfterUpdateイベント(VBA)で、変更された数量をチェックし、在庫が閾値以下ならSlack通知サブを呼ぶ。
  3. Slack通知サブではWinHttpを使い、Incoming Webhook URLにPOST。
  4. Slackチャンネルに在庫警告メッセージが表示される。

5.2 VBAコード例とポイント解説

'------------------------------------------------------------------------------------------
'【目的】 在庫数を更新後、閾値を下回った場合はSlackに通知する
'【ポイント】
' - AfterUpdateイベントやフォームの任意ボタンから呼び出し
' - WinHttpでSlackのWebhookを叩く
' - ADOでSQL Serverへの更新を行う前提
'------------------------------------------------------------------------------------------
Public Sub 在庫数更新通知(ByVal lng商品ID As Long, ByVal lng数量 As Long)

'①Ado接続
Call データベース接続 ' グローバル変数cn

'②SQLで在庫更新
Dim strSQL As String
strSQL = "UPDATE dbo.在庫マスタ SET 在庫数 = " & lng数量 & " WHERE 商品ID = " & lng商品ID
cn.Execute strSQL

'③閾値チェック(とりあえず在庫数10以下で通知する例)
If lng数量 <= 10 Then
' Slack通知サブを呼ぶ
Call Slack在庫警告(lng商品ID, lng数量)
End If

MsgBox "在庫数を更新しました。", vbInformation
End Sub

Private Sub Slack在庫警告(lng商品ID As Long, lng数量 As Long)
'④SlackWebhook呼び出し
Dim strMessage As String
strMessage = "【在庫警告】商品ID=" & lng商品ID & " の在庫が残り " & lng数量 & " です。"

Const SLACK_WEBHOOK As String = "https://hooks.slack.com/services/XXXX/XXXX/XXXX"
Dim jsonData As String
jsonData = "{""text"":""" & Replace(strMessage, """", """""") & """}"

Dim httpReq As Object
Set httpReq = CreateObject("WinHttp.WinHttpRequest.5.1")

httpReq.Open "POST", SLACK_WEBHOOK, False
httpReq.setRequestHeader "Content-Type", "application/json"
httpReq.Send jsonData

If httpReq.Status = 200 Then
Debug.Print "Slack通知完了:" & strMessage
Else
Debug.Print "Slack通知失敗:ステータス " & httpReq.Status
End If

Set httpReq = Nothing
End Sub

ポイント解説:

  • 更新と通知のきっかけをフォームのAfterUpdateイベントやボタン押下時にすることで、在庫が変わった瞬間にAPIリクエストを実行。
  • もっとリアルタイムに、サーバーサイドで処理したいならSQL ServerトリガーCLRなどを使う手段もあるが、Access上のVBAで制御するほうが導入が簡単。

6. 運用・セキュリティ面のポイント

6.1 トークン・キーの安全管理とHTTPS通信

  • Webhook URLAPIキーは機密情報なので、外部に漏れないようにAccessコードやINIファイルでしっかり管理。
  • HTTPではなくHTTPSを使い、通信内容を暗号化(多くのAPIがHTTPS必須)。

6.2 レートリミット・エラー時のリトライ設計

  • 外部APIの呼び出し回数制限(レートリミット)に注意。
  • エラーが返った場合にリトライバックオフを行うか、業務要件に応じて設計。大量連続発行する場合はバッチ化など検討。

6.3 ロギング・モニタリングとトラブルシュート

  • ログテーブルにAPIリクエストの内容やステータスコードを記録しておけば、後日トラブル時に調査しやすい。
  • Accessがクラッシュしても分かるように、モニタリングや通知を別途設定するのがおすすめ(SQL Serverのジョブ監視、Windowsログ監視など)。

7. まとめ

API連携とイベントドリブン処理を取り入れることで、Accessは単なるローカルDBツールから外部サービス・クラウド・他システムを結びつけるハブへと進化します。具体的には:

  1. フォームイベント・VBAイベントをトリガーにAPI呼び出し→リアルタイム連携
  2. SQL Serverのトリガーやジョブを使い、Access外で自動化するアプローチ
  3. 外部サービス(Webhook)→クラウド中継→Access というルートで双方向連携
  4. Slack連携やGAS連携、Power Automateなどでさらに業務プロセスを可視化・自動化

ただし、実装の際にはセキュリティ(トークン管理、HTTPS)やレート制限、ログ収集などの運用面を見逃すとシステムトラブルにつながりやすい点に注意が必要です。

「AccessはVBAが書けないと難しい…」というハードルも、近年は生成AIを使ったコード自動生成ネット上のサンプルが充実してきたことで、十分クリア可能になりました。是非、API連携やイベントドリブン処理を活用して、Accessの可能性をさらに広げてみてください。

今後も当ブログでは、Access×SQL Serverを起点に、APIやクラウドサービスとの高度な連携方法や事例を発信していきます。ぜひ参考にしていただき、イベントドリブン型の業務システム構築に挑戦してみてください。

DMM
ABOUT ME
管理人
管理人
駆け出しブロガー
入社した会社では、Accessを活用した基幹システムが長年運用されていました。しかし、開発者の高齢化により保守が困難となり、システムの維持・更新が急務に。 ほぼAccessに触れたことのなかった私は、ゼロから学びながら基幹システムを再構築してみることに。ついにはAccessによるシステム開発エンジニアとしてのスキルを身につけるまでに成長。 元々の業務のノウハウとそれを効率化するためのツール(Access)によって業務効率化システムをいくつも開発してきました。 みなさんの”なにか(業務のノウハウ)”とAccessで業務効率化を実現するお役に立てれば幸いです。
googleアドセンス
記事URLをコピーしました