本文讲解用VBA调用DeepSeek API,在Excel中实现单元格问答、批量分类和自动摘要,并覆盖密钥、错误重试和成本控制。
Excel 是很多团队处理订单、客户反馈、财务流水和运营报表的主界面,DeepSeek 则提供了可编程的文本理解能力。把两者连接起来,价值不在让表格会聊天,而在于让每一行数据都能按统一规则完成分类、抽取、改写和摘要。大量教程只给出接口地址,缺少 Excel 场景里的落地细节,本文按配置、调用、提示词、批量运维四个环节展开,重点解决密钥安全、返回解析、限速和成本问题。
1. 接入前的准备:API密钥、模型和网络环境
开始前需要明确调用入口。DeepSeek 提供 OpenAI 兼容接口,基础地址是 ,聊天补全端点为 /chat/completions,常用模型包括 deepseek-chat 和 deepseek-reasoner。前者响应快,适合分类、摘要、字段抽取;后者推理强,适合复杂规则判断,但延迟和费用更高。密钥在 DeepSeek 开放平台创建,形式以 sk- 开头,只应在服务端或本机环境使用。Excel 本身没有内置 DeepSeek 连接器,因此最直接方案是 VBA 加 HTTP 请求,把 API 当成远程函数调用。
环境方面,建议使用 Windows 桌面版 Microsoft 365 或 Office 2019 以上版本,32 位和 64 位均可,但 64 位 Office 要注意 PtrSafe 声明。启用开发者工具后,在信任中心允许宏运行,若文件从网络下载还需解除锁定。VBA 中可引用 Microsoft WinHTTP Services 5.1,也可以用后期绑定 CreateObject 创建 WinHttp.WinHttpRequest.5.1 对象,避免引用丢失。JSON 解析推荐导入 VBA-JSON 的 JsonConverter.bas,否则手工拆字符串容易在中文、换行和引号上出错。网络需能访问 api.deepseek.com,企业代理要配置系统代理或 WinHttp SetProxy,TLS 版本应支持 1.2 以上。
教学指导上,先用 3 到 5 行测试数据验证链路。把 API 密钥临时放在 VBA 常量中仅用于本机测试,正式使用改为 Environ 读取 DEEPSEEK_API_KEY 环境变量,或在启动时输入并保存在模块级变量。不要写进单元格、命名区域或共享工作簿。确认模型名、余额和限速后,再逐步扩大数据量。DeepSeek 按输入输出 token 计费,测试阶段设置 max_tokens 为 100 到 200,温度设为 0.2 到 0.4,减少随机性和费用。记录一次请求的 token 消耗,能为批量估算提供依据。
2. 用VBA封装DeepSeek接口的核心步骤

在 VBA 模块中可封装 Function CallDeepSeek,参数为 prompt 和可选的 systemPrompt。函数内部创建 WinHttpRequest,以 POST 请求 ,设置 Content-Type 为 application/json,Authorization 为 Bearer 加密钥。请求体可用 JsonConverter.ConvertToJson 构造字典,包含 model、messages、temperature、max_tokens、stream 等字段。若手工拼 JSON,必须替换双引号和换行,否则接口会返回 400。系统提示可固定为严谨的 Excel 数据处理助手,用户消息则传入单元格内容或拼接后的提示词。
发送后要检查 Status 属性。200 表示成功,401 是密钥错误,402 可能余额不足,429 是触发限速,5xx 是服务端异常。成功时用 JsonConverter.ParseJson 解析响应,取 choices 第一项的 message.content,并去掉首尾空白。若模型返回 Markdown 代码块或多余解释,可在提示词中要求只输出结果,不要解释。失败时返回统一错误码,例如 ERR_401,不要直接把原始异常抛给单元格。设置 SetTimeouts 30 秒连接、60 秒发送、60 秒接收,能避免 Excel 长时间无响应。
性能方面,VBA UDF 在单元格公式中调用 API 会阻塞计算,每次重算都可能重复请求。更稳妥的做法是封装成 Sub 过程,读取选区后循环写回,而不是使用等于 CallDeepSeek 的公式。若必须用 UDF,应加缓存字典,相同 prompt 直接返回旧值,并避免 Application.Volatile。批量前关闭 ScreenUpdating 和 EnableEvents,用 StatusBar 显示进度。测试时监控立即窗口,输出状态码、耗时和返回长度,便于定位网络或解析问题。
3. 单元格提示词设计和返回值解析
Excel 集成中,提示词不是聊天,而是数据转换规则。例如在客户反馈表里,C2 可拼接为判断以下反馈类别,只返回咨询、投诉、售后、其他之一,然后连接 B2 内容。在合同表里,要求从以下文本提取签约方、金额、到期日,用 JSON 返回,键可设为 party、amount、expiry。系统提示固定角色、输出格式和边界条件,温度设为 0 到 0.3,max_tokens 按任务设定。输入前用 LEFT 和 SUBSTITUTE 清理换行、制表符,超长文本截断到 2000 到 4000 字,避免超出上下文限制。
返回解析要区分任务类型。分类任务直接把标签写入 C2,并设置为文本格式。JSON 返回可用 VBA-JSON 解析后写入多个单元格,也可用 Excel 365 的 TEXTBEFORE、TEXTAFTER、FILTERXML 辅助提取。不要依赖模型每次格式完全一致,解析失败时应记录原始返回,转人工复核。对于金额和日期,要求模型统一为 YYYY-MM-DD 和数字格式,减少二次清洗。若返回多行文本,使用 Replace 去除换行再写入,避免撑高行高或破坏表格结构。

实际案例中,客服工单表有 5000 行,人工分类需要数小时。用宏分批读取 B 列,按 100 行一组调用,返回标签写入 C 列,再用数据透视统计类别。费用估算时,若每行输入 80 token、输出 5 token,5000 行约消耗 42.5 万 token,按 deepseek-chat 的低单价可以控制。关键是缓存相同文本,重复工单不重复请求。对情感分析、关键词抽取、摘要也类似,但摘要输出更长,需要单独设置 max_tokens 和截断策略,否则容易超出预算或触发限速。
4. 批量处理、错误重试和安全合规
批量架构不要逐行触发 UDF,而应使用 Sub BatchProcess。读取 UsedRange,循环从第 2 行到最后一行,若目标列已有值则跳过。每 50 到 100 行提交一次,或逐行提交并 Sleep 200 毫秒,控制 QPS。遇到 429 时采用指数退避,等待 1 秒、2 秒、4 秒,最多重试 3 次。每次结果写入日志表,记录时间、行号、状态码、耗时、token 估算和错误信息。这样中断后可续跑,避免重复扣费,也便于排查哪一批数据失败。
错误重试要分类处理。网络超时、DNS 失败、代理断开可以重试;401、402 不应重试,需要检查密钥和余额。返回内容为空或格式不符时,可换用更明确的提示词重试一次。VBA 中用 On Error GoTo 捕获运行时错误,把 Err.Number 和 Err.Description 写入日志。对 5xx 服务端错误,等待后重试。所有重试都要有上限,否则可能死循环。批量结束后恢复 ScreenUpdating 和 EnableEvents,并弹出摘要对话框显示成功、失败、跳过数量。
安全和合规同样重要。API 密钥通过 Windows 环境变量或凭据管理器读取,VBA 用 Environ 获取,不写入工作簿。共享文件前删除密钥和日志中的敏感返回。客户数据应脱敏,身份证号、手机号、地址、银行卡号用正则替换为占位符,只发送必要字段。若企业有数据出境或隐私要求,先确认 DeepSeek 服务条款和内部合规政策。代理环境用 SetProxy 设置服务器和端口,必要时添加绕过列表。最后设置定期轮换密钥,并限制 API 余额,防止脚本异常消耗。