在上一期内容中,我们学习了如何通过API接口,将DeepSeek接入到Excel中,实现了在单元格里直接提问并获取AI回答的操作。
但很多跟着实操的朋友反馈了一个体验上的小遗憾:直接在单元格里输入长篇大论的问题,或者阅读AI返回的大段文字,排版非常不美观,且容易破坏原有的表格结构。
有没有一种方法,能在Excel里弹出一个像微信聊天窗口一样的独立面板,专门用来和AI对话呢?
答案是:利用Excel的VBA“用户窗体(UserForm)”。今天,我们就来手把手教大家搭建这个专属的AI交互界面。
第一阶段:绘制你的AI专属面板
想要一个漂亮的窗口,我们需要先把它“画”出来。这就像搭积木一样简单,完全不需要写代码。

首先,在Excel中按下快捷键 Alt + F11 打开VBA编辑器。在左侧的工程窗口空白处点击右键,选择“插入” -> “用户窗体”。这时,你的界面上会出现一个灰色的空白窗口(通常默认名为 UserForm1),以及一个包含各种工具的“工具箱”。

接下来,我们需要将工具箱里的控件拖拽到这个空白窗口上。为了保证后续代码能准确识别这些控件,请大家严格按照下表的名称(Name属性)进行设置(在左下角的“属性”窗口中修改),效果如下:
| 标签 (Label) | |||
| 文本框 (TextBox) | TQuestion | ||
| 标签 (Label) | |||
| 文本框 (TextBox) | TAnswer | ||
| 命令按钮 (CommandButton) | AnswerButton |
(提示:为了能输入多行文字,请选中两个文本框,在属性栏将 MultiLine 设置为 True,将 WordWrap 设置为 True,并将 ScrollBars 设置为 2 - fmScrollBarsVertical 以显示垂直滚动条。)

第二阶段:赋予面板“AI大脑”
面板画好了,但它现在只是一个空壳。我们需要让它和DeepSeek的API连接起来。
如果你不懂代码,这正是AI发挥作用的时刻。你可以直接利用DeepSeek的“识图模式”,把刚才画好的窗体截图发给它,并附上明确的指令:
“我用VBA绘制了一个如截图所示的窗体。问题输入框命名为
TQuestion,回答输出框命名为TAnswer,按钮命名为AnswerButton。 请给我一段VBA代码,实现在点击按钮后,调用DeepSeek API,读取TQuestion的内容,并将回答结果输出到TAnswer中。”
拿到代码后,回到VBA编辑器,双击我们刚才画好的“开始回答”按钮,系统会自动跳入这个窗体的代码编写界面。将AI生成的代码完整粘贴进去,并填入你自己的API Key即可。
(注:为保证大家一次性成功,文章末尾已为大家准备好了调试完毕的完整代码。)
第三阶段:制作一键呼出开关
现在面板和大脑都准备就绪了,我们还需要在常规的Excel表格界面上,做一个能随时唤醒这个窗口的“开关”。
在VBA编辑器左侧,右键选择“插入” -> “模块”。 在空白处输入以下三行极简代码:
Sub 启动AI面板() UserForm1.ShowEnd Sub回到Excel普通表格界面,在“插入”菜单中随意插入一个形状(比如圆角矩形),在上面写上“唤醒AI助手”。 右键点击这个形状,选择“指定宏”,选中我们刚才写的 启动AI面板,点击确定。

总结
从在网页端来回切换,到单元格内的生硬调用,再到今天拥有一个独立、美观的交互面板。我们通过这三节课,一步步将最前沿的AI能力深度融入到了个人的工作流中。
掌握了利用AI辅助编写VBA窗体的逻辑,以后无论是做数据查询面板、录入系统,都可以用同样的思路轻松搞定。
以下是本次窗体交互的完整VBA核心代码,请复制后在窗体代码页中使用(务必替换为你自己的API Key):
' 在UserForm的代码窗口中粘贴以下代码' 需要先在模块中保留之前提供的API调用函数Option Explicit' API配置(与之前相同)Private Const API_KEY As String = "sk-..." ' 替换为您的实际API KeyPrivate Const API_URL As String = "https://api.deepseek.com/v1/chat/completions"' 窗体加载事件Private Sub UserForm_Initialize() ' 设置TAnswer为多行显示 TAnswer.Multiline = True TAnswer.WordWrap = True TAnswer.ScrollBars = fmScrollBarsVertical ' 清空输入和输出 TQuestion.Text = "" TAnswer.Text = "" ' 设置提示文字 TQuestion.Text = "请输入您的问题..." TQuestion.ForeColor = RGB(128, 128, 128) ' 设置窗体标题 Me.Caption = "DeepSeek AI 助手"End Sub' 按钮点击事件Private Sub AnswerButton_Click() Dim question As String Dim answer As String ' 获取问题 question = Trim(TQuestion.Text) ' 验证输入 If question = "" Or question = "请输入您的问题..." Then MsgBox "请输入您的问题!", vbExclamation, "提示" TQuestion.SetFocus Exit Sub End If ' 显示加载状态 TAnswer.Text = "正在思考中,请稍候..." TAnswer.ForeColor = RGB(128, 128, 128) Me.Repaint ' 立即更新界面 ' 调用API On Error GoTo ErrorHandler answer = CallDeepSeekAPI(question) ' 显示答案 TAnswer.Text = answer TAnswer.ForeColor = RGB(0, 0, 0) ' 自动调整文本框高度以适应内容 AutoFitTextHeight Exit SubErrorHandler: TAnswer.Text = "错误:" & Err.Description & vbCrLf & "错误代码:" & Err.Number TAnswer.ForeColor = RGB(255, 0, 0) MsgBox "发生错误,请检查网络连接和API Key是否正确。", vbCritical, "错误"End Sub' 自动调整文本框高度Private Sub AutoFitTextHeight() Dim lineCount As Long Dim totalHeight As Long Dim singleLineHeight As Long ' 计算文本行数 lineCount = Len(TAnswer.Text) - Len(Replace(TAnswer.Text, vbCrLf, "")) + 1 ' 估算高度(可以根据字体大小调整) If lineCount > 1 Then ' 如果文本超过一行,增加高度 singleLineHeight = TAnswer.Height / 2 ' 估算单行高度 totalHeight = singleLineHeight * lineCount If totalHeight > 400 Then totalHeight = 400 ' 设置最大高度 If totalHeight < 30 Then totalHeight = 30 TAnswer.Height = totalHeight End IfEnd Sub' 文本框获得焦点事件(添加提示文字效果)Private Sub TQuestion_Enter() If TQuestion.Text = "请输入您的问题..." Then TQuestion.Text = "" TQuestion.ForeColor = RGB(0, 0, 0) End IfEnd Sub' 文本框失去焦点事件Private Sub TQuestion_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Trim(TQuestion.Text) = "" Then TQuestion.Text = "请输入您的问题..." TQuestion.ForeColor = RGB(128, 128, 128) End IfEnd Sub' 按下Enter键快速提问Private Sub TQuestion_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then ' Enter键 KeyCode = 0 ' 阻止换行 AnswerButton_Click End IfEnd Sub' 清空按钮(可选功能)Private Sub ClearButton_Click() TQuestion.Text = "请输入您的问题..." TQuestion.ForeColor = RGB(128, 128, 128) TAnswer.Text = ""End Sub' 复制答案按钮(可选功能)Private Sub CopyButton_Click() If TAnswer.Text <> "" Then Dim dataObj As MSForms.DataObject Set dataObj = New MSForms.DataObject dataObj.SetText TAnswer.Text dataObj.PutInClipboard MsgBox "答案已复制到剪贴板!", vbInformation, "成功" End IfEnd Sub以下代码粘贴到一个标准模块中:
' 在标准模块中保留以下代码(与之前相同,但需要确保API_KEY等常量一致)Option Explicit' API配置Private Const API_KEY As String = "sk-您的API密钥"' 替换为您的实际API KeyPrivate Const API_URL As String = "https://api.deepseek.com/v1/chat/completions"' 核心API调用函数Function CallDeepSeekAPI(question As String) As String Dim http As Object Dim jsonRequest As String Dim jsonResponse As String Dim responseText As String' 创建HTTP对象 Set http = CreateObject("MSXML2.XMLHTTP") ' 构建JSON请求体 jsonRequest = "{" jsonRequest = jsonRequest & """model"": ""deepseek-chat""," jsonRequest = jsonRequest & """messages"": [" jsonRequest = jsonRequest & "{""role"": ""system"", ""content"": ""You are a helpful assistant.""}," jsonRequest = jsonRequest & "{""role"": ""user"", ""content"": """ & EscapeJSON(question) & """}" jsonRequest = jsonRequest & "]," jsonRequest = jsonRequest & """temperature"": 0.7," jsonRequest = jsonRequest & """max_tokens"": 2000" jsonRequest = jsonRequest & "}"' 发送请求 On Error GoTo ConnectionError With http .Open "POST", API_URL, False .setRequestHeader "Content-Type", "application/json" .setRequestHeader "Authorization", "Bearer " & API_KEY .send jsonRequest ' 检查状态 If .Status = 200 Then jsonResponse = .responseText responseText = ParseDeepSeekResponse(jsonResponse) Else responseText = "API调用失败!状态码:" & .Status & vbCrLf & "响应:" & .responseText End If End With CallDeepSeekAPI = responseText Set http = Nothing Exit FunctionConnectionError: CallDeepSeekAPI = "网络连接错误,请检查网络设置。" & vbCrLf & "错误:" & Err.Description Set http = NothingEnd Function' 解析DeepSeek返回的JSONFunction ParseDeepSeekResponse(jsonStr As String) As String Dim startPos As Long Dim endPos As Long Dim content As String ' 查找 "content": 字段 startPos = InStr(jsonStr, """content"":""") If startPos = 0 Then startPos = InStr(jsonStr, """content"": """) If startPos = 0 Then ParseDeepSeekResponse = "无法解析API响应" Exit Function End If startPos = startPos + 12 Else startPos = startPos + 11 End If' 查找结束引号 endPos = InStr(startPos, jsonStr, """") If endPos = 0 Then ParseDeepSeekResponse = "无法解析API响应" Exit Function End If content = Mid(jsonStr, startPos, endPos - startPos) ' 处理转义字符 content = Replace(content, "\n", vbCrLf) content = Replace(content, "\t", vbTab) content = Replace(content, "\""", """") content = Replace(content, "\\", "\") ParseDeepSeekResponse = contentEnd Function' 转义JSON字符串中的特殊字符Function EscapeJSON(str As String) As String Dim result As String Dim i As Integer Dim ch As String result = "" For i = 1 To Len(str) ch = Mid(str, i, 1) Select Case ch Case """" result = result & "\""" Case "\" result = result & "\\" Case vbCr result = result & "\r" Case vbLf result = result & "\n" Case vbTab result = result & "\t" Case Else result = result & ch End Select Next i EscapeJSON = resultEnd Function' 显示窗体的宏(在模块中)Sub ShowDeepSeekForm() ' 加载并显示窗体 Load UserForm1 ' 如果您的窗体名称不同,请修改此处 UserForm1.ShowEnd Sub如果你觉得这种“授人以渔”的办公提效干货对你有帮助,欢迎点赞、收藏,并分享给被表格折磨的同事们。我们下期再见。
夜雨聆风