摘要: 本文实现一个从 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 的回答
操作流程:
- 在提示词框里输入:“请用 50 字描述 Access 数据库的优势”
- 点击按钮
- 结果框显示"正在等待 Claude 响应…"
- 几秒后,结果框里出现 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 就知道哪一步不对
- 稳定可靠,适合正式使用
三、准备工作
前提条件
- 已安装 Claude Code CLI,并且在终端里能正常运行
claude -p "你好"拿到回答 - 确认 claude 命令的完整路径——在 PowerShell 里执行:
Get-Command claude
记下它的路径,后面代码里要用。如果你的 PATH 已经配好,直接写 claude 就行。
验证能跑通
先在 PowerShell 里手动测一下:
echo "你好" | claude -p --bare --output-format text
如果能正常返回文字,说明环境没问题,Access 调用也不会有障碍。
四、创建窗体
第一步:新建窗体
- 点击 创建 → 窗体设计
- 这个窗体不需要绑定任何数据表(记录源留空)
第二步:放控件
在主体区域放 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
七、运行测试
- 打开
frmClaude - 在提示词框输入:
请用 50 字描述 Access 数据库的核心优势 - 点击"调用 Claude"按钮
- 结果框先显示"正在等待 Claude 响应,请稍候…"
- 几秒后,Claude 的回答出现在结果框里
如果一切正常,说明 Access 已经成功对接了 Claude Code。

八、总结
这篇文章的核心很简单:
- Claude Code 支持
-p非交互模式,一条命令进去、一段文本出来 - Access VBA 通过
WScript.Shell.Exec可以执行命令行并等待结果 - 用文件中转(prompt.txt → output.txt)比直接拼命令行参数更稳定
- 整个方案只需要一个通用模块 + 一个窗体,十几分钟就能跑通
从这里出发,你可以继续探索很多方向:
- 给
AskClaude加超时控制,避免 Claude 卡住时 Access 一直等 - 用
--output-format json获取结构化返回,方便直接解析写入数据表 - 封装成业务函数,比如"生成商品描述"“翻译备注字段”“自动分类客户”
- 对接其他 CLI AI 工具(思路完全一样,改一下命令就行)
Access 不是最时髦的开发工具,但它胜在门槛低、部署简单、离业务近。当它能直接调用 AI,很多原本需要"另起一个系统"才能做的事情,现在一个 accdb 文件就能搞定。
目前返回的数据比较格式“粗糙”有兴趣的话,自己动手试试,优化优化。


1万+

被折叠的 条评论
为什么被折叠?



