Zenn
🎒

Microsoft AccessからLLMに連携する方法

はじめに

Microsoft Accessは、1990年代から企業の業務システムとして広く利用されてきたデータベースアプリケーションです。2025年現在も、多くの経理部門や人事部門では日常業務の基盤としてAccessが活躍しています。使い慣れたインターフェースと開発の容易さから、「レガシー」と揶揄されながらも、現場に根付いたソリューションとして存在感を示し続けています。

一方で、ChatGPTやClaude、Geminiといった大規模言語モデル(LLM: Large Language Model)の登場により、ビジネスプロセスの自動化や効率化に新たな可能性が生まれています。しかし、多くの企業ではLLMの導入が進まないという課題があります。
なぜLLMの導入が進まないのか?
その主な理由は「新しいシステムの導入」という心理的・技術的ハードルです。新しいツールを覚える必要性、既存のワークフローの変更、データ移行の手間など、現場にとっては大きな負担となります。
そこで注目したいのが、既存のAccess環境にLLMを接続するというアプローチです。慣れ親しんだツールを継続利用しながら、最新のAI技術の恩恵を受けることができるのです。

業務効率化やLLM活用を考える場合、SaaSや自前のWebアプリ、チャットボットなど様々な選択肢がありますが、業務の特性やおかれている状況を踏まえて、Microsoft Accessのようなアプリケーションも含めたソリューション選定をすべきと考えています。

この記事では、後半に具体的にMicrosoft AccessからLLM(ChatGPT、Claude、Gemini)へ連携する方法を記載します。記載したaccdbファイルはGithubに公開しています。ぜひ、参考にして頂けると幸いです。
https://github.com/Masa1984a/ms-access-genai

Microsoft Accessの現状と将来展望

Accessは今後もしばらく存続予定

Microsoft Accessは「Office 365(Microsoft 365)」スイートの一部として現在も提供・開発が続けられており、直近のAccess 2024では少なくとも2029年までのサポートが公表されています​。実際、MicrosoftからAccessの終了に関する公式発表はなく、「今後何年も廃止される予定はない」とコミュニティで明言されています​。Microsoft Access System being discontinued? むしろ既存ユーザーのためにバグ修正や小規模な機能追加を継続し、現代のクラウド環境との接続強化(DataverseやMicrosoft Graphへのコネクタ提供など)にも注力しています​。

最近の機能強化の例

Access自体の革新的な新機能は少ないものの、MonacoエディタによるSQLエディタの刷新(2024年)や​、Chromium版Edge(WebView2)対応の新しいブラウザコントロールの導入(2023年)など、現代の技術スタックに合わせた改善が行われています。これらのアップデートは、Accessが依然としてMicrosoftの「シチズンデベロッパー」(一般部門ユーザーによる業務アプリ開発)戦略の一翼を担っていることを示すものです。既存のAccess資産を活かしつつ最新技術とつなぐ取り組みが進められており、Accessは成熟した製品として安定した地位を維持しています。Access Blog

Access VBAを使ったLLMへの連携方法

ChatGPTを例に示します。
AccessからChatGPT API(OpenAI)を利用するには、VBA(Visual Basic for Applications)を用いてHTTPS通信によるAPI呼び出しを行います。以下、その大まかな手順とポイントを紹介します。

APIキーの準備とエンドポイント確認

はじめにOpenAIのサイトでAPIキーを取得し、ChatGPT(GPT-4oなど)用のエンドポイントURLを確認します。ChatGPT APIはREST形式で提供されており、例えばChatGPTのChat Completion APIではエンドポイント(https://api.openai.com/v1/chat/completions) を利用します。OpenAIのAPI仕様を読み、要求するモデル名やパラメータ、必要なHTTPヘッダー(後述)を把握しましょう​。APIキーは認証に用いる秘密情報なので、ソースコード内に平文で埋め込まないなど安全に管理することが重要です。

HTTPリクエスト送信の実装

VBAから外部のWeb APIを呼び出すには、標準で利用可能なHTTP通信用ライブラリ(たとえばMSXML2.XMLHTTPやWinHttpRequestオブジェクト)を使用します。具体的には、VBAコード上でHTTPリクエストオブジェクトを生成し、OpenメソッドでPOSTリクエストを作成、ヘッダーに「Content-Type: application/json」と「Authorization: Bearer {APIキー}」を設定して、ChatGPT用のJSONメッセージを送信します​。送信にはHTTPS通信が使われますが、TLS1.2以降に対応していれば標準ライブラリで問題なく接続可能です(古い環境ではTLS設定が必要な場合があります)。

JSON形式でのデータ送受信

ChatGPT APIとのやり取りはJSON形式のデータで行われます。
APIからの応答もJSONで返され、メッセージの内容や使用トークン数などの情報が含まれます。このJSONのパース 解析がAccess側のポイントです。VBAにはJSONを直接解析する機能がないため、外部のJSONパーサライブラリ(例:VBA-JSON​)を利用するか、文字列操作で必要な部分を抽出する処理が必要です​。前者のライブラリを使えば、返ってきたJSON文字列を辞書オブジェクトに展開し、response("choices")(0)("message")("content")のようにアクセスしてChatGPTの返答テキストを取得できます。

応答内容の活用

取得したChatGPTの返答は、Accessのフォーム上に表示したり、テーブルに保存したり、あるいは他の処理に渡すことができます。例えばユーザーの質問に対する回答をフォーム上のテキストボックスに表示したり、生成した要約結果をデータベースに格納してレポート出力に使うといった形です。応答時間はインターネット経由になるため多少のタイムラグがありますが、VBAコード内で適切に待機処理を入れることでUIが固まるのを防ぐことも可能です。また、連続で会話のやりとりをする場合は、ChatGPT API側で会話の履歴(messages配列)を維持して送ることで、文脈を踏まえた回答を得ることもできます。

連携によるメリットとデメリット

AccessとLLMのAPIを組み合わせることで得られるメリットと考慮すべきデメリットを整理します。

メリット

  • 既存資産の活用と拡張:
    現在運用中のAccessアプリケーションにAI機能を追加できるため、レガシーシステムの延命・高度化が図れます。Accessは元々「迅速な業務アプリ開発」が可能なツールであり、多くの企業で業務課題を解決してきた実績があります​。その強みを活かしつつ、LLMによる新たな知見提供や自動化を後付けできる点は大きな利点です。
  • 迅速なAI活用の実現:
    Access上でのVBA開発は比較的簡易で、外部APIとの連携も短期間で試せます。ゼロからAI機能を自前開発するよりも、API経由で高度な生成AIサービスを呼び出す方が圧倒的に迅速です。結果として、業務改善のPDCAサイクルを早めることができます。例えば手作業で行っていたテキスト分析を自動化すれば、人手では困難だった高速処理が実現しデータ処理効率が飛躍的に向上します​。
  • 蓄積したデータを活用した高度な分析と洞察:
    LLMの持つ自然言語処理能力を活用することで、Accessに蓄えたデータに対してより深い分析や洞察を引き出せます。例えば、ユーザーの入力した問い合わせ文から適切なレポートを生成したり、大量の文字情報(クレーム内容やアンケート自由記述など)を分析して感情評価や要点抽出を行ったりできます​。従来は解析が難しかった非構造データも扱えるようになり、分析の幅と深さが増す点は大きなメリットです​。
  • 慣れ親しんだユーザーインターフェース:
    Accessフォーム上でLLMを呼び出すことで、自然言語による問い合わせ対応や説明文の自動生成など、エンドユーザーにとって使いやすいインターフェースを提供できます。なにより既にAccessを使って業務している方にとっては慣れ親しんだユーザインターフェースのままLLMの恩恵を享受できます。
    利用例として、たとえば「この商品の特徴を要約して表示」ボタンを設ければ、担当者は商品説明文を一瞬で生成可能です。専門知識のない業務ユーザーでも、平易な言葉でAIの力を引き出せるようになり、業務効率と満足度の向上につながります。

デメリット・留意点

  • セキュリティ・プライバシーの懸念:
    AccessからAPIにデータを送るということは、自社内のデータをインターネット上の第三者(OpenAIなど)のサーバーに送信することを意味します​。機密情報や個人情報を含むデータをそのままAPIに投入するのはリスクが伴います。例えばOpenAIはAPI経由のデータを学習に使用しない方針を表明しており、入力・出力のデータは利用者に帰属するとしています。それでも社外へのデータ持ち出しになる点は多くの企業で懸念事項です。対策としては、機微情報をマスキングしてから送信する、あるいはAzure OpenAI Services、Amazon Bedrock、Google Vertex AIのようなエンタープライズ向けオプション(データがより厳重に管理される)を検討することも必要でしょう。
  • 導入・保守の難易度:
    LLMのAPI連携にはVBAでのコーディングが必要であり、通常のAccessフォームやクエリ操作に比べると技術的ハードルは上がります。特にJSONの取り扱いやHTTPエラー時の例外処理など、Webプログラミングの知識が求められます。加えて、外部ライブラリの参照設定やAPIキーの管理など、標準のAccess開発にはない作業も発生します。これらは実装者個人のスキルに依存する部分が大きく、属人化による保守負担につながる恐れがあります。社内にVBAやAPI連携の知見が少ない場合、トラブルシューティングに時間を要する可能性もあります。
  • 動作パフォーマンスと制約:
    LLMへの問い合わせはクラウド上のAIサービスを呼び出すため、ネットワーク遅延やAPIのレスポンス時間が発生します。リアルタイム性が要求される処理には不向きで、ユーザーが結果を得るまで数秒程度待つ場面も出てくるでしょう。またAPIには多くの場合利用制限(レートリミット)や従量課金が存在します。一度に大量のリクエストを送ると制限に抵触したり、利用料が予想以上に高くなる可能性もあります。Accessは基本的にクライアントPC上で動作するため、複数ユーザーがそれぞれAPI連携を行うとトークン管理やコスト管理が煩雑になる点にも注意が必要です。この辺は、Local LLMやSLMが発達してくると解決できるかもしれません。
  • Access自体の制限:
    Accessはデスクトップ向けのシステムであり、Webサービスとの高度な統合を前提に設計されたプラットフォームではありません。そのため、例えば非同期処理のような高度な並行実行は標準ではサポートされておらず、API呼び出し中は他の処理が止まるケースがあります。また、Accessアプリケーションを配布する際には各PCからインターネット接続が必要になる点や、社内ネットワークポリシーで外部通信がブロックされている場合には別途対応が必要になる点など、運用面で考慮すべき事項もあります。

総評

AccessとLLMの連携は大きな価値をもたらす一方で、技術面・運用面での注意点も存在します。導入にあたってはメリットがデメリットを上回るかを吟味し、必要なら小規模な検証導入から始めると良いでしょう。

Access×LLMの導入ポイント

1. 適切なユースケースの選定

すべての業務を一気にAI化するのではなく、次のような作業から始めるのが効果的です

  • 文書作成・添削: 申請書、報告書、メールなどの文書作成や校正
  • データ分類・整理: 自由記述データの分類やタグ付け
  • 情報検索・要約: 過去のデータから必要な情報を抽出・要約

2. APIキー管理の徹底

APIキーは重要な認証情報であり、適切に管理する必要があります

  • データベース内で暗号化して保存
  • 共有PCでの使用を制限
  • 定期的なキーの更新

3. エラーハンドリングの充実

APIリクエストは様々な理由で失敗する可能性があります

  • ネットワークエラー
  • APIの利用制限
  • サーバー側の障害

これらに対応するエラーハンドリングを実装し、ユーザー体験を損なわないようにしましょう。

4. コスト管理の仕組み

LLMのAPIは従量課金制のため、コスト管理が重要です

  • 利用量の監視機能
  • 上限設定による過剰利用の防止
  • 定期的な利用状況のレポート

具体的な活用シーン

1. 申請書添削

従業員が作成した申請書の文章を添削し、より明確で簡潔な表現に改善します。特に非ネイティブの方や文書作成に不慣れな社員のサポートとなります。

2. OCR

スキャンされた書類からLLMが取引先名、請求金額、支払期日などの情報を抽出し、Accessデータベースを自動的に更新する、あるいは点検補正する機能を使って人のチェックを行い、入力負荷を軽減できます。

3. FAQ自動回答システム

社内規定やマニュアルのデータをもとに、従業員からの質問に自動回答します。人事・総務部門の問い合わせ対応負荷を軽減できます。

4. データ入力支援

自由記述のテキストから、必要な情報を抽出して構造化データに変換します。データ入力の効率化とミス防止に貢献します。

4. レポート自動生成

データベース内の数値データをもとに、自然言語での分析レポートを自動生成します。手作業でのレポート作成時間を大幅に削減できます。

実装例

例として、申請フォームを作りました。業務で自由入力のところ、作業者によってばらつきが出るところと考えています。こういったところをLLMに添削させたり統一できたりできると良いですよね。今回、遊び心で博多弁にするプロンプトを仕込みました!笑

なお、「はじめに」にも書きましたが、実装例のaccdbファイルはGithubに公開しています。
ぜひお試しください!
APIキーは未設定の状態です。ご自身のを設定してくださいね!
https://github.com/Masa1984a/ms-access-genai

構成(テーブル)

下記2テーブル用意しています。

  • tblAPIキー:
    ChatGPT、Claude、GeminiのAPIキーを管理するテーブルです
  • tbl申請書:
    申請書を保存するテーブルです

構成(画面)

下記1m画面用意しています。

  • frm申請書:
    申請を登録する画面です。コンボボックス「APIキー名」で使用するLLMを選択します。テキストボックス「申請内容」を入力したうえで、「添削」ボタンを押下すると、今回の場合LLMが博多弁に変換してくれます。

VBA

ChatGPT、Claude、GeminiのそれぞれのAPI通信について処理を分けており、それぞれの実装が参考になると思います。

VBAのコード
VBAのコード
Option Compare Database

' Claude APIへリクエストを送信する関数
' AI サービスの種類を表す定数
Const SERVICE_CLAUDE As String = "Claude"
Const SERVICE_CHATGPT As String = "ChatGPT"
Const SERVICE_GEMINI As String = "Gemini"


' APIリクエスト実行関数 - サービスタイプによって適切な関数を呼び出す
Public Function ReviewTextWithAI(originalText As String, serviceType As String) As String
    Select Case serviceType
        Case SERVICE_CLAUDE
            ReviewTextWithAI = ClaudeTextReview(originalText)
        Case SERVICE_CHATGPT
            ReviewTextWithAI = ChatGPTTextReview(originalText)
        Case SERVICE_GEMINI
            ReviewTextWithAI = GeminiTextReview(originalText)
        Case Else
            ReviewTextWithAI = "エラー: サポートされていないAIサービスです。"
    End Select
End Function

' Claude APIへリクエストを送信する関数 (既存のコードを修正)
Public Function ClaudeTextReview(originalText As String) As String
    On Error GoTo ErrorHandler
    
    ' XMLHttpRequestオブジェクトの作成
    Dim xhr As Object
    Set xhr = CreateObject("MSXML2.XMLHTTP")
    
    ' APIキーの取得
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim apiKey As String
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT TOP 1 APIキー値 FROM tblAPIキー WHERE APIキー名 = 'Claude'", dbOpenSnapshot)
    
    If Not rs.EOF Then
        apiKey = rs!APIキー値
    Else
        ClaudeTextReview = "エラー: Claudeのキーが見つかりません。"
        Exit Function
    End If
    rs.Close
    
    ' APIエンドポイント
    Dim endpoint As String
    endpoint = "https://api.anthropic.com/v1/messages"
    
    ' リクエストの準備
    xhr.Open "POST", endpoint, False
    xhr.setRequestHeader "Content-Type", "application/json"
    xhr.setRequestHeader "x-api-key", apiKey
    xhr.setRequestHeader "anthropic-version", "2023-06-01"
    
    ' エスケープ処理
    originalText = Replace(originalText, Chr(34), Chr(92) & Chr(34))
    originalText = Replace(originalText, vbCrLf, "\n")
    
    ' リクエストボディの作成
    Dim requestBody As String
    requestBody = "{" & _
                  """model"": ""claude-3-7-sonnet-20250219""," & _
                  """max_tokens"": 1024," & _
                  """messages"": [" & _
                  "{""role"": ""user"", ""content"": ""以下の文章を博多弁に変換してください。【重要】変換後の文言だけ出力ください。\n\n" & originalText & """}" & _
                  "]" & _
                  "}"

    ' リクエストの送信
    xhr.send requestBody
    
    ' レスポンスの確認
    If xhr.Status = 200 Then
        ' JSON解析の改善
        Dim jsonResponse As String
        jsonResponse = xhr.responseText
        
        ' 修正したJSONレスポンス解析ロジック
        Dim textMarker As String
        textMarker = """text"":"""
        Dim startPos As Long, endPos As Long
        
        startPos = InStr(jsonResponse, textMarker)
        If startPos > 0 Then
            startPos = startPos + Len(textMarker)
            endPos = InStr(startPos, jsonResponse, """")
            
            If endPos > 0 Then
                Dim content As String
                content = Mid(jsonResponse, startPos, endPos - startPos)
                
                ' エスケープされた文字を戻す
                content = Replace(content, "\""", """")
                content = Replace(content, "\n", vbCrLf)
                
                ' 先頭の余計な記号をチェックして削除
                If Left(content, 2) = ":" & Chr(34) Then
                    content = Mid(content, 3)
                ElseIf Left(content, 1) = ":" Then
                    content = Mid(content, 2)
                End If
                
                ClaudeTextReview = content
            Else
                ClaudeTextReview = "エラー: レスポンス解析失敗"
            End If
        Else
            ClaudeTextReview = "エラー: レスポンス解析失敗"
        End If
    Else
        ClaudeTextReview = "エラー: API呼び出し失敗 (" & xhr.Status & ")"
    End If
    
    Exit Function
    
ErrorHandler:
    ClaudeTextReview = "エラー: " & Err.Description
End Function

' ChatGPT APIへリクエストを送信する関数
' ChatGPT APIへリクエストを送信する関数(同期)
Public Function ChatGPTTextReview(originalText As String) As String
    On Error GoTo ErrorHandler
    
    ' XMLHttpRequestオブジェクトの作成
    Dim xhr As Object
    Set xhr = CreateObject("MSXML2.XMLHTTP")
    
    ' APIキーの取得
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim apiKey As String
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT TOP 1 APIキー値 FROM tblAPIキー WHERE APIキー名 = 'ChatGPT'", dbOpenSnapshot)
    
    If Not rs.EOF Then
        apiKey = rs!APIキー値
    Else
        ChatGPTTextReview = "エラー: ChatGPTのキーが見つかりません。"
        Exit Function
    End If
    rs.Close
    
    ' 正しいAPIエンドポイント - chat/completions
    Dim endpoint As String
    endpoint = "https://api.openai.com/v1/chat/completions"
    
    ' リクエストの準備
    xhr.Open "POST", endpoint, False  ' 同期的に実行
    xhr.setRequestHeader "Content-Type", "application/json"
    xhr.setRequestHeader "Authorization", "Bearer " & apiKey
    
    ' リクエストボディの作成 - ChatGPT形式
    Dim requestBody As String
    requestBody = "{" & _
                  """model"": ""gpt-4o""," & _
                  """messages"": [" & _
                  "{""role"": ""system"", ""content"": ""以下の文章を博多弁に変換してください。【重要】変換後の文言だけ出力ください。""}," & _
                  "{""role"": ""user"", ""content"": """ & Replace(originalText, """", "\""") & """}" & _
                  "]," & _
                  """temperature"": 0.7" & _
                  "}"

    ' リクエストの送信
    xhr.send requestBody
    
    ' レスポンスの確認
    If xhr.Status = 200 Then
        Dim jsonResponse As String
        jsonResponse = xhr.responseText
        
        ' シンプルな解析方法
        Dim contentStartPos As Long
        contentStartPos = InStr(1, jsonResponse, """content"": """)
        
        If contentStartPos > 0 Then
            ' "content": "" の後の位置
            contentStartPos = contentStartPos + 12
            
            ' 次の " を探す(エスケープされていないもの)
            Dim endPos As Long, i As Long
            i = contentStartPos
            
            Do
                endPos = InStr(i, jsonResponse, """")
                ' エスケープされた引用符でないか確認
                If endPos > 0 And Mid(jsonResponse, endPos - 1, 1) <> "\" Then
                    Exit Do
                End If
                ' 次の検索位置を更新
                If endPos > 0 Then
                    i = endPos + 1
                Else
                    Exit Do
                End If
            Loop
            
            If endPos > 0 Then
                ' テキスト抽出
                Dim content As String
                content = Mid(jsonResponse, contentStartPos, endPos - contentStartPos)
                
                ' エスケープシーケンスを元に戻す
                content = Replace(content, "\""", """")
                content = Replace(content, "\\", "\")
                content = Replace(content, "\n", vbCrLf)
                
                ChatGPTTextReview = content
            Else
                ChatGPTTextReview = "エラー: レスポンスの解析に失敗しました"
            End If
        Else
            ChatGPTTextReview = "エラー: レスポンスの解析に失敗しました"
        End If
    Else
        ChatGPTTextReview = "エラー: API呼び出し失敗 (" & xhr.Status & ") - " & xhr.responseText
    End If
    
    Exit Function
    
ErrorHandler:
    ChatGPTTextReview = "エラー: " & Err.Description
End Function
' Gemini APIへリクエストを送信する関数
Public Function GeminiTextReview(originalText As String) As String
    On Error GoTo ErrorHandler
    
    ' XMLHttpRequestオブジェクトの作成
    Dim xhr As Object
    Set xhr = CreateObject("MSXML2.XMLHTTP")
    
    ' APIキーの取得
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim apiKey As String
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT TOP 1 APIキー値 FROM tblAPIキー WHERE APIキー名 = 'Gemini'", dbOpenSnapshot)
    
    If Not rs.EOF Then
        apiKey = rs!APIキー値
    Else
        GeminiTextReview = "エラー: Geminiのキーが見つかりません。"
        Exit Function
    End If
    rs.Close
    
    ' GeminiのAPIエンドポイントとパラメータ設定
    ' 注意: 実際のGeminiエンドポイントはドキュメントを確認してください
    Dim endpoint As String
    endpoint = "https://generativelanguage.googleapis.com/v1/models/gemini-2.0-flash:generateContent?key=" & apiKey
    
    ' リクエストの準備
    xhr.Open "POST", endpoint, False
    xhr.setRequestHeader "Content-Type", "application/json"
    
    ' エスケープ処理
    originalText = Replace(originalText, Chr(34), Chr(92) & Chr(34))
    originalText = Replace(originalText, vbCrLf, "\n")
    
    ' リクエストボディの作成 - Gemini形式
    Dim requestBody As String
    requestBody = "{" & _
                  """contents"": [" & _
                  "{""parts"": [{""text"": ""以下の文章を博多弁に変換してください。【重要】変換後の文言だけ出力ください。。\n\n" & originalText & """}]}" & _
                  "]" & _
                  "}"

    ' リクエストの送信
    xhr.send requestBody
    
    ' レスポンスの確認と解析 (Gemini用)
    If xhr.Status = 200 Then
        Dim jsonResponse As String
        jsonResponse = xhr.responseText
        
        ' Geminiのレスポンス解析
        Dim startPos As Long, endPos As Long
        startPos = InStr(jsonResponse, """text"": """)
        
        If startPos > 0 Then
            startPos = startPos + 9 ' ""text": "" の長さ
            endPos = InStr(startPos, jsonResponse, """")
            
            If endPos > 0 Then
                Dim content As String
                content = Mid(jsonResponse, startPos, endPos - startPos)
                
                ' エスケープされた文字を戻す
                content = Replace(content, "\""", """")
                content = Replace(content, "\n", vbCrLf)
                
                GeminiTextReview = content
            Else
                GeminiTextReview = "エラー: レスポンス解析失敗"
            End If
        Else
            GeminiTextReview = "エラー: レスポンス解析失敗"
        End If
    Else
        GeminiTextReview = "エラー: API呼び出し失敗 (" & xhr.Status & ")"
    End If
    
    Exit Function
    
ErrorHandler:
    GeminiTextReview = "エラー: " & Err.Description
End Function

' フォームロード時のイベント
Private Sub Form_Load()
End Sub

' 添削ボタンのクリックイベント
Private Sub 添削_Click()
    On Error GoTo ErrorHandler
    
    ' サービスタイプの取得 - エラーハンドリング追加
    Dim serviceType As String
    
    ' コントロールが利用可能かチェック
    If Me.cboAIService.Visible Then
        ' エラー回避のために値を安全に取得
        On Error Resume Next
        serviceType = Me.cboAIService.Value
        If Err.Number <> 0 Or Len(Trim(serviceType)) = 0 Then
            serviceType = "Claude" ' デフォルト値
        End If
        On Error GoTo ErrorHandler
    Else
        serviceType = "Claude" ' デフォルト値
    End If
    
    ' 数値の場合は表示名に変換
    If IsNumeric(serviceType) Then
        Select Case CInt(serviceType)
            Case 1: serviceType = "Claude"
            Case 2: serviceType = "ChatGPT"
            Case 3: serviceType = "Gemini"
            Case Else: serviceType = "Claude"
        End Select
    End If
    
    ' 申請内容の取得
    Dim originalText As String
    originalText = Me.申請内容.Value
    
    If Len(Trim(originalText)) = 0 Then
        MsgBox "添削するテキストを入力してください。", vbInformation
        Exit Sub
    End If
    
    ' 処理中表示
    Me.申請内容.Value = originalText & vbCrLf & vbCrLf & "添削中です(" & serviceType & ")。しばらくお待ちください..."
    DoEvents
    
    ' 選択されたAIサービスでテキスト添削を実行
    Dim reviewedText As String
    Select Case serviceType
        Case "Claude"
            reviewedText = ClaudeTextReview(originalText)
        Case "ChatGPT"
            reviewedText = ChatGPTTextReview(originalText)
        Case "Gemini"
            reviewedText = GeminiTextReview(originalText)
        Case Else
            reviewedText = ClaudeTextReview(originalText) ' デフォルト
    End Select
    
    ' 結果表示
    Me.申請内容.Value = "【元の文章】" & vbCrLf & originalText & vbCrLf & vbCrLf & _
                     "【" & serviceType & "による添削】" & vbCrLf & reviewedText
    
    Exit Sub
    
ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

おわりに

いかがでしたか。
Microsoft AccessとLLMの連携は、既存の業務やシステムを活かしながらAIの力を取り入れるという現実的なアプローチの1つです。新しいシステムの導入によるリスクを最小化しつつ、業務効率化を実現することができます。
特に中小企業や、短期間で業務の見直しやシステム更新が難しい部門においては、既存のAccessアプリケーションにLLM機能を追加することで、低コストかつ短期間でAI活用を始めることができると考えています。
将来的には、抜本的な業務改革やより高度な統合や専用システムへの移行も視野に入れつつ、まずは身近なツールからAI活用を始めることが、多くの企業にとって現実的な一歩となるのではないでしょうか。
技術は常に進化していきますが、それを活用するのは現場の人間です。使い慣れたツールでのAI活用は、テクノロジーと人間の橋渡しとなり、可能性を秘めていると考えています。

Accenture Japan (有志)

Discussion

Apps DevApps Dev

いつも拝見しております。AccessからのLLM利用について、大変参考になりました。細かな点となり恐縮ですが、コメントさせて頂きます。

導入・保守の難易度

弊社で類似する仕組みとして、Excelカスタム関数からLLMを呼び出すツールを開発した際、挙げて頂いたVBA保守の懸念がございました。
多少の保守性改善やセキュリティを意図して、LLMの呼び出す際、Azure Functionsサービスを経由する方式としました。同サービスにLLM関連の処理をまとめ、VBA側の処理を極力シンプルとしました。

まずは身近なツールからAI活用を始めることが、多くの企業にとって現実的な一歩

まさにおっしゃる通りと思います。AIエージェントを含め、日々様々な技術が登場しますが、まずはAIを身近に感じ、その利点や利用上の留意点を理解し、今後の業務改革に向けた準備を進める形が現実的と考えておりました。

上記のExcelカスタム関数は、国内金融系グループにおけるIT部門のエンジニアに加え、業務企画や事務を担う総合職も活用が広がっております。

ご紹介頂いたAccessの活用についても、参考にさせて頂きます。

マッサン (Masanori Yoshida)マッサン (Masanori Yoshida)

Apps Devさん、コメントありがとうございます!大変嬉しく思います!
Azure Functionsを採用している点、大変参考になります。
保守性やセキュリティということで、LLMへのロジックの集約化や、APIキー以外の認証方式が取れる点、たしかに!と思いました。
また、ITエンジニアだけではなく、総合職への活用も広がっている点素晴らしいですね。ハードだけではなくソフト面もケアも必要と推察しており、頭が下がります。。。
今後ともよろしくお願いします!

ログインするとコメントできます