职贝云数AI新零售门户
标题:
11、一个简单功能阐明deepseek处理成绩的运用
[打印本页]
作者:
GBh28zHK
时间:
3 天前
标题:
11、一个简单功能阐明deepseek处理成绩的运用
deepseek大模型可以协助我们轻松处理很多复杂的成绩,在EXCEL中一些看似很简单的功能,在书写公式或VBA,M函数等的时分会比较复杂,甚至于一些逻辑关系都很难理清,这时我们可以借助弱小的deepseek,只需输入相关提示词,AI便可协助我们轻松完成所需的功能。在此以一个简单的功能举例,在A列中存放了一系列的数据,数据用英文逗号隔开,要求将数据序列停止紧缩(延续的数据用末尾数加破折号加结束数表示,单独的数据则单独显示,数据之间用逗号隔开,比如:1,2,4,5,6,8,9紧缩成: 1-3,5-7,9-11),在实践工作中我们能够更多的是手动停止添加,这样操作是可以完成,但效率低,而且也容易出错,在此我们借助deepseek大模型来完成该功能。首先预备表格(如下图),将表格作为附件上传到deepseek,然后输入提示词:“附件表格A列有一串递增的数字序列字符串,为了方便观察规律,现需求将其中的 延续部分停止紧缩,结果如B列所示。请根据要求建立模型完成该紧缩功能。”,全体如截图。留意选择深度思索(R1)
(, 下载次数: 0)
上传
点击文件名下载附件
分析完成后deepseek给出了python完成方式,如下图:这种方式不是我们想要的,接着诘问:excel能否有函数可以完成该功能?
(, 下载次数: 0)
上传
点击文件名下载附件
深度思索后deepseek给出了三种方法,如下截图:
(, 下载次数: 0)
上传
点击文件名下载附件
(, 下载次数: 0)
上传
点击文件名下载附件
(, 下载次数: 0)
上传
点击文件名下载附件
接下就是将各方法复制,到excel表格中停止测试,方法一测试后前往错误值#CALC!,继续诘问,提示词:方法一前往错误值“#CALC!”。deepseek给出修正后的公式:
=IF(A2="", "",
TEXTJOIN(",", TRUE,
LET(
nums, FILTERXML("<a><b>"&SUBSTITUTE(A2,",","</b><b>")&"</b></a>","//b"),
count, ROWS(nums),
seq, SEQUENCE(count),
vals, --nums,
diffs, IF(seq=1,1, vals-INDEX(vals,seq-1)),
starts, FILTER(seq, (seq=1) + (diffs>1)),
ends, IF(ROWS(starts)=1, count,
VSTACK(DROP(starts,1)-1, count)),
MAP(starts, ends, LAMBDA(s,e,
IF(s=e, INDEX(vals,s),
INDEX(vals,s)&"-"&INDEX(vals,e)))
)
)
)
(, 下载次数: 0)
上传
点击文件名下载附件
将公式复制到excel 单元格C2中,向下拖拽复制,得到了想要的结果,如下图:
(, 下载次数: 0)
上传
点击文件名下载附件
同时deepseek也给出了兼容的VBA自定义函数,如下图
(, 下载次数: 0)
上传
点击文件名下载附件
残缺代码为:
Function CompressNumbers(inputStr As String) As String
Dim nums() As String
Dim numList() As Long
Dim i As Long, startVal As Long, endVal As Long
Dim result As String, count As Long
' 分割输入字符串
nums = Split(inputStr, ",")
count = UBound(nums)
If count < 0 Then Exit Function
' 转换为数字数组
ReDim numList(count)
For i = 0 To count
numList(i) = Val(Trim(nums(i)))
Next i
' 紧缩序列
i = 0
Do While i <= count
startVal = numList(i)
endVal = startVal
' 查找延续序列
Do While i < count
If numList(i + 1) = numList(i) + 1 Then
endVal = numList(i + 1)
i = i + 1
Else
Exit Do
End If
Loop
' 添加到结果
If result <> "" Then result = result & ","
If startVal = endVal Then
result = result & startVal
Else
result = result & startVal & "-" & endVal
End If
i = i + 1
Loop
CompressNumbers = result
End Function
按alt+F11键,打开VBA编辑器,点击菜单栏“插入”-“模块”,这时会自动创建一个模块,将deepseek生成的VBA自定义函数代码复制粘贴到模块,如下图:
(, 下载次数: 0)
上传
点击文件名下载附件
关闭VBA编辑器,回到excel界面,在D2单元格输入自定义的函数CompressSequence(输入前三个字母就可以出来,只需选择即可),选择数据系列所在单元格,公式随即前往结果,如下图:超级表中运用公式时参数用的是[@列名]也就是指向列名列,普通表中的参数为详细的单元格,公式需向下复制。超级表中公式会自动填充,无需拖动复制,同时添加新数据时公式也会自动填充。
(, 下载次数: 0)
上传
点击文件名下载附件
接上去验证powerquery中的方式,按下图步骤将表格导入powerquery。
(, 下载次数: 0)
上传
点击文件名下载附件
进入后将数据系列的类型改为文本
(, 下载次数: 0)
上传
点击文件名下载附件
点击高级编辑器,进入M代码编辑界面,将deepseek生成的代码复制粘贴覆盖原有代码,如下图
(, 下载次数: 0)
上传
点击文件名下载附件
此时,M函数报错“Expression.SyntaxError: 应为令牌”,将此错误作为提示词,继续诘问,如下图
(, 下载次数: 0)
上传
点击文件名下载附件
思索后deepseek给出新的语句;
let
// 步骤1:获取数据
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], // 确保这里的表名与实践表名分歧
// 步骤2:添加自定义列处理紧缩逻辑
添加自定义列 = Table.AddColumn(源, "紧缩结果", each
let
// 分割字符串并转换为数字列表
数字列表 = List.Transform(
List.RemoveItems(Text.Split([数字序列], ","), {""}),
each Number.From(Text.Trim(_))
),
// 确保列表有序(虽然输入应该是递增的)
有序列表 = List.Sort(数字列表),
// 运用List.Accumulate停止分组处理
分组结果 = List.Accumulate(
// 从第二个元素末尾处理
List.RemoveFirstN(有序列表, 1),
// 初始形态:{当前起始值, 当前结束值, 结果列表}
{有序列表{0}, 有序列表{0}, {}},
(state, current) =>
let
上一个结束值 = state{1},
当前起始值 = state{0},
结果列表 = state{2},
// 检查能否延续
能否延续 = current = 上一个结束值 + 1
in
if 能否延续 then
// 延续:更新结束值
{当前起始值, current, 结果列表}
else
// 不延续:添加当前组,末尾新组
let
新组 = if 当前起始值 = 上一个结束值 then
Text.From(当前起始值)
else
Text.From(当前起始值) & "-" & Text.From(上一个结束值),
更新后的结果列表 = 结果列表 & {新组}
in
{current, current, 更新后的结果列表}
),
// 添加最后一组
最后一组 = if 分组结果{0} = 分组结果{1} then
Text.From(分组结果{0})
else
Text.From(分组结果{0}) & "-" & Text.From(分组结果{1}),
一切组 = 分组结果{2} & {最后一组},
// 组合最终结果
最终结果 = Text.Combine(一切组, ",")
in
最终结果
),
// 步骤3:删除原始列(可选)
删除原始列 = Table.RemoveColumns(添加自定义列, {"数字序列"})
in
删除原始列
将新的语句复制粘贴覆盖原来的M语句,此时语句未报错,如下图
(, 下载次数: 0)
上传
点击文件名下载附件
点击完成,此时powerquery中前往函数执行的结果,如下图:结果也是我们想要的,
(, 下载次数: 0)
上传
点击文件名下载附件
点击关闭并上载,导入数据对话框中选择表-现有工作表,点击确定,如下图:
(, 下载次数: 0)
上传
点击文件名下载附件
生成的结果便前往到了我们指定的地位,如下图:
(, 下载次数: 0)
上传
点击文件名下载附件
接上去,将上述几种方法得到的结果放在一同停止比对,如下图
(, 下载次数: 0)
上传
点击文件名下载附件
从图中可以看出A5单元的数据序列不是按升序排序的,IF函数前往结果显然是不正确的,阐明该函数对数据序列的顺序有严厉要求,必须升序排序,其它2种方法的都是没有成绩的。
接上去我们停止深度思索,上边的数据系列都是在一个单元格中,假如是放在一列不同的行中呢?此时用VBA自定义函数的第一种方式,即便运用textjoin函数将各个数据衔接也不能前往正确值,由于它的参数是一个单元格,兼容版的VBA函数可以前往得到的结果(参数为数组字符串),但当数据不是升序排序时,前往的结果也不是我们想要的,如下图;
C13单元格中的公式:
=CompressNumbers(TEXTJOIN(",",,SORT(A13:A22,,1))),将数据用sort函数停止升序排序,然后再停止衔接,最后运用自定义函数停止紧缩,结果显然是我们想要的。
明天我们用一个小小实例阐明了deepseek大模型在日常成绩处理时的运用,从运用的过程可以看出,由于各方面缘由(比如软件版本等)deepseek生成的代码不一定能前往我们想要的结果,当出现成绩时,可以将成绩作为提示词继续停止诘问,诘问后生成的代码再停止测试,直到前往想要的结果。任何成绩的处理都是一个按部就班的过程,在处理成绩的过程中需求我们不断的停止测试,纠偏。这个小小的例子希望对大家运用deepseek时有所协助。 欢迎大家在评论区停止讨论。
欢迎光临 职贝云数AI新零售门户 (https://www.taojin168.com/cloud/)
Powered by Discuz! X3.5