背景

场景1:智能清洗数据
需求:A列手机号格式混乱,需要统一为“123-4567-8901”

家人偶尔提到需求通过Excel接入大模型,解决一些常用的excel表格处理。遍寻网络发现了几个参考资料,除了丢进去,要么使用Excel的ai模块,再么就是接入AI的方式了。
这里我选择接入AI的方式,道理大家都懂。

参考编写这篇文章Excel接入DeepSeek超详细教程 | 手把手实现AI自动化办公]的=DeepSeek_Query(A1)函数实现功能,结果发现:返回语句是json格式,vba本身不支持json格式处理

主要有以下3个问题待办:

  1. DeepSeek的API收费,考虑用其他的大模型API替代了。
  2. Excel的VBA还需要解决API返回的接口JSON格式处理。
  3. 改写请求体代码,不同大厂的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) → 插入新模块,接着把复制的代码直接粘贴进去。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/efc768eeae2741db8a6e5aeba6dd9254.pn
同时把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解析数组代码又得研究数小时了。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐