在办公自动化场景里,大模型Prompt的构造往往散落在Excel的多个单元格中,人工拼串既慢又容易漏字段。通过VBA宏,可以把表头、用户输入、固定指令自动合并成完整提示词,并直接调用本地或云端的大模型接口。这种方式不需要部署额外服务,只要Office和能访问模型的网络即可,特别适合财务、运营、客服等需要批量生成文案或做轻量分类的团队。

VBA宏拼接Prompt的基础原理与模板设计
Prompt自动生成的核心,是先定义一套文本模板,再把Excel里的动态数据填进占位符。比如模板写成“你是一名审核员,请判断下面内容是否合规:{content}”,其中{content}来自某个单元格。VBA里可以用Replace函数做字符串替换,也可以直接用Format拼接。重要的是把系统指令、示例、用户输入分层存放,避免后期调整语气时到处改代码。
在表格设计上,建议把固定提示词放在单独的工作表,动态数据放在“数据”表。宏启动时先读配置表,再循环数据表每行,拼出最终Prompt。这样运营同事只改单元格,不必碰宏代码。同时要注意,如果Prompt里本身包含花括号或百分号,拼接逻辑要做转义,否则会被当成格式符处理,导致发给模型的内容残缺。
下面示例展示最基础的拼接函数,它把系统语、用户输入、输出要求合成一个字符串,并保留换行。实际项目中可把模板抽到单元格,用Range("A1").Value读取,提升灵活性。
Function BuildPrompt(sysText As String, userText As String, ruleText As String) As String
Dim p As String
p = sysText & vbCrLf & vbCrLf
p = p & "用户输入:" & vbCrLf & userText & vbCrLf & vbCrLf
p = p & "输出要求:" & vbCrLf & ruleText
BuildPrompt = p
End Function
通过VBA发送HTTP请求调用大模型接口
拼好Prompt后,下一步是把它发给模型。Windows下的VBA可以用MSXML2.XMLHTTP对象发POST请求。请求体一般是JSON,需要把Prompt放进messages或prompt字段,并带上鉴权头。由于VBA没有原生JSON库,简单结构可用字符串拼接,复杂嵌套建议引用ScriptControl走JScript构造,或者提前在表里维护好JSON片段。
鉴权信息不要写死在多处,最好放在配置表的一个单元格,宏读取后塞进setRequestHeader "Authorization", "Bearer " & token。超时方面,XMLHTTP默认可能卡很久,可以用setTimeouts方法分别设置解析、连接、发送、接收的毫秒数,避免一条坏数据拖垮整个批量任务。返回文本用responseText拿到后,再按模型返回格式提取内容写回单元格。
下面代码演示一次最简调用。注意<和>在VBA字符串里不需要转义,但在我们这篇文章的HTML里已转义展示。真正写进模块时直接用半角尖括号即可。
Sub CallModel()
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
Dim url As String
url = "https://api.ipipp.com/v1/chat"
Dim body As String
body = "{""prompt"":""请总结以下:VBA宏很实用""}"
http.Open "POST", url, False
http.setRequestHeader "Content-Type", "application/json"
http.setRequestHeader "Authorization", "Bearer your_token_here"
http.Send body
Debug.Print http.responseText
End Sub
批量生成与错误隔离的工程化实践
当数据量到几百行,单条失败不能中断全部任务。工程上要在循环里包一层On Error Resume Next,把出错行号、错误描述记到日志列,然后继续下一行。同时给每个请求加微小间隔,既降低接口限流风险,也方便观察进度。若模型返回异常JSON,可用InStr判断标志位,避免Mid提取越界。
另一个常见问题是编码。VBA内部是GBK环境,发UTF-8 JSON时若直接拼中文,某些旧接口会乱码。解决方法是用ADODB.Stream把字符串转成UTF-8字节再发,或者选用明确支持GBK的网关。收到回复后同理,若含乱码可用同一流对象转回。下表列出两种批量策略的差异:
| 策略 | 优点 | 缺点 |
|---|---|---|
| 同步逐条 | 逻辑简单,易调试 | 速度慢,一条卡死全停 |
| 异步队列 | 吞吐高,互不阻塞 | 需写回调,代码复杂 |
对于绝大多数表格用户,同步逐条加错误隔离已经够用。下面示例展示带日志的批量骨架,它把结果写回B列,把错误写回C列,保证千行数据也能跑完。
Sub BatchRun()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("数据")
Dim last As Long
last = ws.Cells(ws.Rows.Count, 1).End(-4162).Row
Dim i As Long
For i = 2 To last
On Error Resume Next
Dim p As String
p = BuildPrompt("你是助手", ws.Cells(i, 1).Value, "简短回答")
Dim r As String
r = PostToModel(p)
If Err.Number <> 0 Then
ws.Cells(i, 3).Value = "错误" & Err.Description
Else
ws.Cells(i, 2).Value = r
End If
On Error GoTo 0
Next i
End Sub
Function PostToModel(p As String) As String
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "POST", "https://api.ipipp.com/v1/chat", False
http.setRequestHeader "Content-Type", "application/json"
http.Send "{""prompt"":""" & p & """}"
PostToModel = http.responseText
End Function
把以上模块组合进个人宏工作簿,就能在任何Excel里选中数据一键生成提示词并拿回大模型结果。后续还可把模板做成下拉选择,让业务人员自己切换“翻译”“摘要”“分类”等模式,进一步降低使用门槛。