用 Access 调用 Claude Code:VBA 一键获取 AI 回答的完整方案

摘要: 本文实现一个从 Access 窗体直接调用 Claude Code CLI 并获取 AI 回答的完整方案——在窗体上放一个输入框和一个按钮,点击后 VBA 把提示词发给 Claude,等它回答完,结果直接显示在窗体文本框里。包含完整制作步骤 + 全部 VBA 代码,复制即用。

Hi,大家好!

背景

现在大量 AI 工具都提供了命令行界面(CLI),比如 Anthropic 的 Claude Code。

很多人以为要调用 AI,必须写 Python、搭 API 服务器、或者用 Web 界面复制粘贴。

但其实 Claude Code 有一个关键参数:-p--print——非交互模式,执行完直接输出结果然后退出。

这意味着什么?

Access 的 VBA 完全可以像调用一条普通命令行一样调用 Claude Code,拿到 AI 的回答,再写回窗体或数据表。

不需要 Python,不需要 Node.js,不需要 HTTP 请求。一个 Access 窗体 + 一段 VBA 代码就够了。

这篇文章,做一个完整落地的方案:

窗体上放一个输入框写提示词,一个按钮触发调用,一个结果框显示 AI 回答。点击按钮,VBA 把提示词写成文件,调用 Claude Code 处理,再把结果读回来显示。

目标不是讲概念,是完整制作过程 + 完整代码,你复制过去就能跑。

一、先看最终效果

窗体上有 3 个东西:

  • 一个大文本框 txtPrompt:用来写提示词
  • 一个按钮 btnAskClaude:点击调用
  • 一个大文本框 txtResult:显示 AI 的回答

操作流程:

  1. 在提示词框里输入:“请用 50 字描述 Access 数据库的优势”
  2. 点击按钮
  3. 结果框显示"正在等待 Claude 响应…"
  4. 几秒后,结果框里出现 Claude 的回答

就这么简单。

二、为什么用文件中转而不是直接拼命令行参数

你可能想到最简单的方式:

claude -p "请帮我写一段描述"

直接把提示词拼到命令行参数里。但实际用起来会遇到这些问题:

问题说明
引号转义中文里夹杂引号、冒号、换行,拼命令行很容易出错
长度限制Windows 命令行参数有长度上限,长文本会被截断
中文编码命令行参数的编码不一定和 Claude 一致
不好调试出了问题看不到当时到底发了什么

所以我们用文件中转

VBA 把提示词写入 prompt.txt(UTF-8)
→ 执行:claude -p --bare --output-format text < prompt.txt > output.txt
→ VBA 读取 output.txt 的内容
→ 显示在窗体里

这样做的好处:

  • 长文本没压力
  • 中文不乱码
  • 出了问题直接看 prompt.txt 和 output.txt 就知道哪一步不对
  • 稳定可靠,适合正式使用

三、准备工作

前提条件

  1. 已安装 Claude Code CLI,并且在终端里能正常运行 claude -p "你好" 拿到回答
  2. 确认 claude 命令的完整路径——在 PowerShell 里执行:
Get-Command claude

记下它的路径,后面代码里要用。如果你的 PATH 已经配好,直接写 claude 就行。

验证能跑通

先在 PowerShell 里手动测一下:

echo "你好" | claude -p --bare --output-format text

如果能正常返回文字,说明环境没问题,Access 调用也不会有障碍。

四、创建窗体

第一步:新建窗体

  1. 点击 创建窗体设计
  2. 这个窗体不需要绑定任何数据表(记录源留空)

第二步:放控件

在主体区域放 3 个控件:

提示词输入框:

属性
名称txtPrompt
控件来源(留空)
宽度15cm
高度3cm
可以输入
滚动条垂直

调用按钮:

属性
名称btnAskClaude
标题调用 Claude
宽度3cm
高度0.8cm

结果显示框:

属性
名称txtResult
控件来源(留空)
宽度15cm
高度6cm
已锁定
滚动条垂直

布局建议:提示词框在上面,按钮在中间,结果框在下面,从上到下排列。

在这里插入图片描述

第三步:保存窗体

保存为:frmClaude

五、通用模块代码

新建一个标准模块,命名为:modClaude

把下面完整代码粘贴进去:

Option Compare Database
Option Explicit

'========================
' 调用 Claude Code 并返回结果
'
' prompt     : 提示词文本
' modelName  : (可选)指定模型,如 "sonnet"、"opus"
' workingDir : (可选)工作目录,默认为数据库所在目录
'========================
Public Function AskClaude(prompt As String, _
                          Optional modelName As String = "", _
                          Optional workingDir As String = "") As String
    On Error GoTo EH
    
    Dim tempFolder As String
    Dim promptFile As String
    Dim outputFile As String
    Dim errorFile As String
    Dim cmd As String
    Dim exitCode As Long
    
    ' 临时文件目录
    tempFolder = Environ$("TEMP") & "\access_claude\"
    EnsureFolderExists tempFolder
    
    promptFile = tempFolder & "prompt.txt"
    outputFile = tempFolder & "output.txt"
    errorFile = tempFolder & "error.txt"
    
    ' 清理上一次的输出文件
    SafeDeleteFile outputFile
    SafeDeleteFile errorFile
    
    ' 把提示词写入文件(UTF-8 编码)
    WriteUtf8File promptFile, prompt
    
    ' 工作目录默认为数据库所在目录
    If Len(Trim$(workingDir)) = 0 Then
        workingDir = CurrentProject.Path
    End If
    
    ' 组装命令行
    ' -p             : 非交互模式,输出结果后退出
    ' --bare         : 跳过钩子和插件,输出更干净
    ' --output-format text : 纯文本输出
    ' < prompt.txt   : 从文件读入提示词
    ' > output.txt   : 标准输出写入文件
    ' 2> error.txt   : 错误输出写入文件
    cmd = "cmd /c cd /d " & QuoteArg(workingDir) & " && " & _
          "claude -p --bare --output-format text"
    
    ' 可选:指定模型
    If Len(Trim$(modelName)) > 0 Then
        cmd = cmd & " --model " & QuoteArg(modelName)
    End If
    
    ' 输入输出重定向
    cmd = cmd & " < " & QuoteArg(promptFile) & _
          " > " & QuoteArg(outputFile) & _
          " 2> " & QuoteArg(errorFile)
    
    ' 执行命令并等待结束
    exitCode = ShellAndWait(cmd)
    
    ' 读取结果
    Dim errText As String
    Dim outText As String
    
    errText = ReadUtf8FileIfExists(errorFile)
    outText = ReadUtf8FileIfExists(outputFile)
    
    ' 判断返回状态
    If exitCode <> 0 Then
        AskClaude = "[调用失败 ExitCode=" & exitCode & "]" & vbCrLf & errText
        Exit Function
    End If
    
    If Len(Trim$(outText)) = 0 And Len(Trim$(errText)) > 0 Then
        AskClaude = "[错误] " & errText
        Exit Function
    End If
    
    AskClaude = outText
    Exit Function

EH:
    AskClaude = "[VBA 错误] " & Err.Number & " - " & Err.Description
End Function

'========================
' 执行命令行并等待进程结束
' 返回进程退出码
'========================
Public Function ShellAndWait(commandLine As String) As Long
    On Error GoTo EH
    
    Dim wsh As Object
    Dim execObj As Object
    
    Set wsh = CreateObject("WScript.Shell")
    Set execObj = wsh.Exec(commandLine)
    
    ' 循环等待,DoEvents 保持 Access 界面响应
    Do While execObj.Status = 0
        DoEvents
    Loop
    
    ShellAndWait = execObj.ExitCode
    Exit Function

EH:
    ShellAndWait = -1
End Function

'========================
' 参数加引号
'========================
Public Function QuoteArg(ByVal s As String) As String
    QuoteArg = """" & Replace(s, """", """""") & """"
End Function

'========================
' 确保文件夹存在
'========================
Public Sub EnsureFolderExists(folderPath As String)
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists(folderPath) Then
        fso.CreateFolder folderPath
    End If
End Sub

'========================
' 安全删除文件
'========================
Public Sub SafeDeleteFile(filePath As String)
    On Error Resume Next
    If Len(Dir(filePath)) > 0 Then Kill filePath
    On Error GoTo 0
End Sub

'========================
' 写 UTF-8 文本文件
'========================
Public Sub WriteUtf8File(filePath As String, text As String)
    Dim stm As Object
    Set stm = CreateObject("ADODB.Stream")
    stm.Type = 2
    stm.Charset = "utf-8"
    stm.Open
    stm.WriteText text
    stm.SaveToFile filePath, 2
    stm.Close
    Set stm = Nothing
End Sub

'========================
' 读 UTF-8 文本文件
'========================
Public Function ReadUtf8File(filePath As String) As String
    Dim stm As Object
    Set stm = CreateObject("ADODB.Stream")
    stm.Type = 2
    stm.Charset = "utf-8"
    stm.Open
    stm.LoadFromFile filePath
    ReadUtf8File = stm.ReadText
    stm.Close
    Set stm = Nothing
End Function

'========================
' 读文件(文件不存在则返回空字符串)
'========================
Public Function ReadUtf8FileIfExists(filePath As String) As String
    If Len(Dir(filePath)) = 0 Then
        ReadUtf8FileIfExists = ""
    Else
        ReadUtf8FileIfExists = ReadUtf8File(filePath)
    End If
End Function

这个模块是通用的,任何窗体都能直接调用 AskClaude() 函数。

六、窗体按钮事件

打开 frmClaude 的代码窗口,粘贴:

Option Compare Database
Option Explicit

Private Sub btnAskClaude_Click()
    Dim prompt As String
    Dim result As String
    
    prompt = Nz(Me.txtPrompt, "")
    
    If Len(Trim$(prompt)) = 0 Then
        MsgBox "请先输入提示词。", vbExclamation
        Exit Sub
    End If
    
    ' 显示等待状态
    Me.txtResult = "正在等待 Claude 响应,请稍候..."
    Me.Repaint
    DoEvents
    
    ' 调用 Claude
    result = AskClaude(prompt)
    
    ' 显示结果
    Me.txtResult = result
End Sub

七、运行测试

  1. 打开 frmClaude
  2. 在提示词框输入:请用 50 字描述 Access 数据库的核心优势
  3. 点击"调用 Claude"按钮
  4. 结果框先显示"正在等待 Claude 响应,请稍候…"
  5. 几秒后,Claude 的回答出现在结果框里

如果一切正常,说明 Access 已经成功对接了 Claude Code。

在这里插入图片描述

八、总结

这篇文章的核心很简单:

  1. Claude Code 支持 -p 非交互模式,一条命令进去、一段文本出来
  2. Access VBA 通过 WScript.Shell.Exec 可以执行命令行并等待结果
  3. 用文件中转(prompt.txt → output.txt)比直接拼命令行参数更稳定
  4. 整个方案只需要一个通用模块 + 一个窗体,十几分钟就能跑通

从这里出发,你可以继续探索很多方向:

  • AskClaude 加超时控制,避免 Claude 卡住时 Access 一直等
  • --output-format json 获取结构化返回,方便直接解析写入数据表
  • 封装成业务函数,比如"生成商品描述"“翻译备注字段”“自动分类客户”
  • 对接其他 CLI AI 工具(思路完全一样,改一下命令就行)

Access 不是最时髦的开发工具,但它胜在门槛低、部署简单、离业务近。当它能直接调用 AI,很多原本需要"另起一个系统"才能做的事情,现在一个 accdb 文件就能搞定。

目前返回的数据比较格式“粗糙”有兴趣的话,自己动手试试,优化优化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Access开发易登软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值