Excel接入qwen大模型,实现智能清洗数据
背景
场景1:智能清洗数据
需求:A列手机号格式混乱,需要统一为“123-4567-8901”
家人偶尔提到需求通过Excel接入大模型,解决一些常用的excel表格处理。遍寻网络发现了几个参考资料,除了丢进去,要么使用Excel的ai模块,再么就是接入AI的方式了。
这里我选择接入AI的方式,道理大家都懂。
参考编写这篇文章Excel接入DeepSeek超详细教程 | 手把手实现AI自动化办公]的=DeepSeek_Query(A1)函数实现功能,结果发现:返回语句是json格式,vba本身不支持json格式处理
主要有以下3个问题待办:
- DeepSeek的API收费,考虑用其他的大模型API替代了。
- Excel的VBA还需要解决API返回的接口JSON格式处理。
- 改写请求体代码,不同大厂的API调用方式有点不一样。
准备材料
1、复制qwen大模型api-key
具体就是支付宝登陆阿里云,打开阿里云百炼的密钥管理,新建一个,点击复制就行。
2、下载 VBA-JSON 的JsonConverter.bas
下载链接:https://github.com/VBA-tools/VBA-JSON
具体用法参考链接:Excel/WPS中直接操作JSON数据
实施手册
1.话不多讲,直接上代码,如下:
Function AliQwen_Query(Prompt As String) As String
Dim Http As Object, Url As String, APIKey As String
APIKey = "sk-xxxxxxxxxxx" '改成你从阿里百炼复制的API Key
Url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
Set Http = CreateObject("MSXML2.ServerXMLHTTP")
Http.Open "POST", Url, False
Http.setRequestHeader "Content-Type", "application/json"
Http.setRequestHeader "Authorization", "Bearer " & APIKey
Dim Body As String
' 转义特殊字符
Dim EscapedPrompt As String
EscapedPrompt = Replace(Prompt, """", "\""")
Body = "{""model"":""qwen-plus"",""input"":{""messages"":[{""role"":""user"",""content"":""" & EscapedPrompt & """}]}}"
Http.send Body
' 检查HTTP状态码
If Http.Status = 200 Then
' 成功响应
AliQwen_Query = JsonExtractValue(Http.responseText, "output.text")
Else
AliQwen_Query = Http.responseText
End If
End Function
Function JsonExtractValue(jsonText As String, path As String) As String
Dim json As Object
Set json = JsonConverter.ParseJson(jsonText)
Dim keys() As String
keys = Split(path, ".")
Dim temp As Object
Set temp = json
Dim i As Integer
For i = LBound(keys) To UBound(keys) - 1
Set temp = temp(keys(i))
Next i
JsonExtractValue = temp(keys(UBound(keys)))
End Function
2.好了,复制这段代码,打开你的excel,两个手指头同时按一下Alt+F11键,打开VBA编辑器 → 右键项目(VBAProject) → 插入新模块,接着把复制的代码直接粘贴进去。

同时把APIkey改成你从阿里云百炼复制的apikey,点击ctrl+s,先保存一下避免丢失。

3.导入你下载的JsonConverter.bas文件

导入后模块那里增加了一个JsonConverter模块。是不是很简单。
3.最后一步【关键:解析json格式返回值】,工具->引用,打开引用界面,勾选" Microsoft Scripting Runtime"组件,点击确定,配置完成。然后ctrl+s,关闭vba界面,返回Excel即可调用=AliQwen_Query(A1)函数。
用户手册
1.A列测试数据为11位的手机号码,在B1输入公式:
=AliQwen_Query("把" & A1 & "转换成带空格分隔符的手机号,保留前3位+中间4位+后4位,只返回结果,不要解释")

下拉填充B2,B3,……。可看到,全部修改为规定格式(前3位 中间4位 后4位)的手机号了,是不是很好用。

通关心得
1.(被智能编码工具带偏)因为vba写代码不太会,所以刚开始发现抱报后,尝试用Trae、qoder、comate调试为啥报错,直接让他自己生成python代码调式,结果他将报错理解成报错后需要重新发起尝试,最多3次,我竟然当真了,反正AI写的就用吧。
接着用python调试没问题,结果放在vba里就不行了,最终发现生成的python代码在3次调用失败后,自动把输入的手机号给处理成功作为最终的结果,导致我在那里纳闷了半小时为啥python没问题,到了vba里就不行了,无语。
可见用智能AI编程工具写代码还是得懂点代码才能行,避免ai糊弄你,哈哈哈。
2.免费api探索:有好多平台都接入了deepseek,比如知乎直达,但他没提供api调用的方式。百度的大模型api调用一两次,再调用同一个模型好像也得买套餐了吧,不然报错。发现用阿里的api目前还可以用很多次,不知道能用多少次,结果发文章后第二天查询阿里云一看,也不是免费的,收费也不高,不知道我N年前啥时候给充值了10元,还有9.97元。
其他个人开发者必看大模型免费Tokens获取攻略也可搜搜看。
看来想要用的畅快,还是买api套餐吧,不然真费劲
3.解决问题的思路:当然是佛挡杀佛,神挡杀神,全靠百度+AI+直觉,才能遇水搭桥了。
最后小tip+
1、文中已经介绍了怎么用vba处理json和大模型调用函数,已经做好的函数,可以直接保存为xslm格式,这样下次打开就能直接用了。
2、如果发现vba宏命令不执行,那就在信任中心开下权限就行。
3、还有其他功能待探索,先到这里吧
4、写提示词时,尽量加上“只返回结果,不要解释”,可以减少推理的输出占tokens,省得找结论。
后记
后来我再仔细看了下阿里的免费额度,我的qwen-plus不能开启免费体验,qwen3-max可以,打开免费额度体验开关,修改代码里的模型为qwen3-max。

本来要试试,用起来,结果qwen3-max的json返回值不一样了,带数组了,上面那个JsonExtractValue函数不支持json数组的解析。我只好优化一下这个函数JsonExtractValue,以下是代码,把原来的替换了就行。
Function JsonExtractValue(jsonText As String, path As String) As String
On Error GoTo ErrorHandler
Dim json As Object
Set json = JsonConverter.ParseJson(jsonText)
Dim pathParts() As String
pathParts = Split(path, ".")
Dim temp As Object
Set temp = json
Dim i As Integer
For i = LBound(pathParts) To UBound(pathParts) - 1
' 检查是否包含数组索引
If InStr(pathParts(i), "[") > 0 Then
Set temp = GetArrayElement(temp, pathParts(i))
Else
Set temp = temp(pathParts(i))
End If
Next i
' 处理最后一个元素
Dim lastPart As String
lastPart = pathParts(UBound(pathParts))
If InStr(lastPart, "[") > 0 Then
Set temp = GetArrayElement(temp, lastPart)
JsonExtractValue = CStr(temp)
Else
JsonExtractValue = CStr(temp(lastPart))
End If
Exit Function
ErrorHandler:
JsonExtractValue = "Error: " & Err.Description
End Function
' 辅助函数:处理数组元素提取
Private Function GetArrayElement(parentObj As Object, pathWithIndex As String) As Object
Dim keyName As String
Dim index As Integer
Dim openBracketPos As Integer
Dim closeBracketPos As Integer
' 提取键名和索引
openBracketPos = InStr(pathWithIndex, "[")
closeBracketPos = InStr(pathWithIndex, "]")
keyName = Left(pathWithIndex, openBracketPos - 1)
index = CInt(Mid(pathWithIndex, openBracketPos + 1, closeBracketPos - openBracketPos - 1))
' VBA 数组通常是从1开始,但JSON数组是从0开始
' 这里假设JSON数组索引从0开始,需要+1转换为VBA索引
Set GetArrayElement = parentObj(keyName)(index + 1)
End Function
同时修改最终的返回值,把图上原来那句修改成新的。
AliQwen_Query = JsonExtractValue(Http.responseText, "output.choices[0].message.content")

又可以愉快的使用了。当然补充代码也用了deepseek,不然人脑补充vba-json解析数组代码又得研究数小时了。
更多推荐


所有评论(0)