前天收到一位网友的求助,大致意思是:需要经常从一个大的excel信息汇总表中获取到数据,然后生成几个固定的格式的表单,希望使用VBA实现查找特定使用单位名称后,能够自动获取并在表单中填写对应的信息。
具体如下(我将示例数据进行了修改,应该不会侵犯那位朋友的隐私。若有,请给我留言,我将立即删除):
如下图1所示的“信息总表”工作表中,汇总有完整的数据。
图1
下图2为固定格式的表单。
图2
我理解他的意图是,从“信息总表”中提取数据自动填写到“委托单”中带有“自动获取”字样的单元格,且有多少条数据就填写多少个委托单。考虑到其需求,我想自动生成一个新工作簿,包含所查找的特定数据的所有“委托单”。
刚开始,我认为deepseek应该不大可能会处理这样的问题,于是自己编写了一段VBA代码来实现。但是,我还是太低估了deepseek的能力!
昨天晚上,我还是想让deepseek试试,看它能否完成这样的需求。
经过几次试提问题答复不满意后,我再一次修正,向deepseek提问如下:
附件中有一个包含两个工作表的工作簿,工作表“信息总表”中包含一系列数据,工作表“委托单”是一个模版。我想新建一个工作簿,其工作表以“委托单”为模版,然后在原工作簿的“信息总表”的列A中查找特定的使用单位,查找到多少条使用单位就在刚才新建的工作簿中创建几个工作表,例如查找“完美生活服务集团股份有限公司”有2条,则在新工作簿中以“委托单”为模版创建2个工作表,并将相关行信息分别填入这些工作表中带有 “自动获取”字样的单元格中,“自动获取”字样的单元格中填入的数据为其左侧单元格中的数据在“信息总表”中查找的结果。请帮我使用VBA实现。
同时,我上传示例工作簿作为附件。
deepseek给出了它的思考过程,比较符合我的意图。同时,给出的代码如下:
Sub GenerateCommissionSheets()` `Dim srcWB As Workbook, newWB As Workbook` `Dim infoSheet As Worksheet, templateSheet As Worksheet` `Dim criteria As String, lastRow As Long, i As Long` `Dim matchedRows As New Collection` `Dim headerRow As Range, targetSheet As Worksheet` `Dim cell As Range, leftCell As Range, colIndex As Variant`` ` `Set srcWB = ThisWorkbook ' 假设代码在当前工作簿运行` `Set infoSheet = srcWB.Sheets("信息总表")` `Set templateSheet = srcWB.Sheets("委托单")`` ` `' 获取用户输入的使用单位` `criteria = InputBox("请输入要筛选的使用单位名称:", "输入筛选条件")` `If criteria = "" Then Exit Sub`` ` `' 在信息总表中查找匹配行` `With infoSheet` `lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row` `For i = 2 To lastRow ' 假设第1行为标题行` `If .Cells(i, 1).Value = criteria Then matchedRows.Add i` `Next i` `End With`` ` `If matchedRows.Count = 0 Then` `MsgBox "未找到匹配的使用单位记录。", vbInformation` `Exit Sub` `End If`` ` `' 创建新工作簿` `Set newWB = Workbooks.Add` `Application.DisplayAlerts = False` `While newWB.Sheets.Count > 1` `newWB.Sheets(1).Delete` `Wend` `Application.DisplayAlerts = True`` ` `' 为每个匹配行创建委托单` `For Each Item In matchedRows` `templateSheet.Copy Before:=newWB.Sheets(1)` `Set targetSheet = newWB.Sheets(1)` `With targetSheet` `.Name = "委托单" & newWB.Sheets.Count` `' 查找所有自动获取单元格` `For Each cell In .UsedRange` `If cell.Value Like "*自动获取*" Then` `Set leftCell = cell.Offset(0, -1)` `colIndex = Application.Match(leftCell.Value, infoSheet.Rows(1), 0)`` ` `If Not IsError(colIndex) Then` `cell.Value = infoSheet.Cells(Item, colIndex).Value` `Else` `cell.Value = "数据未找到"` `End If` `End If` `Next cell` `End With` `Next Item`` ` `' 删除初始空白表并整理工作簿` `newWB.Sheets(1).Delete` `newWB.Sheets(1).Activate` `newWB.SaveAs Filename:=Environ("USERPROFILE") & "\Desktop\" & criteria & "委托单.xlsx"` `MsgBox "已生成 " & matchedRows.Count & " 张委托单!", vbInformation``End Sub
很好!基本实现了我的意图。但是有两点小瑕疵:
1.Item变量未定义。
2.newWB.Sheets(1).Delete不是删除在新建工作簿时自带的空工作表,而是将新添加的填写了信息的工作表给删除了。
我对其进行了调整后,代码实现了我需要的功能。我修改后的代码如下:
Sub GenerateCommissionSheetsPlus()` `Dim srcWB As Workbook, newWB As Workbook` `Dim infoSheet As Worksheet, templateSheet As Worksheet` `Dim criteria As String, lastRow As Long, i As Long` `Dim matchedRows As New Collection` `Dim Item As Variant` `Dim headerRow As Range, targetSheet As Worksheet` `Dim cell As Range, leftCell As Range, colIndex As Variant`` ` `Set srcWB = ThisWorkbook ' 假设代码在当前工作簿运行` `Set infoSheet = srcWB.Sheets("信息总表")` `Set templateSheet = srcWB.Sheets("委托单")`` ` `' 获取用户输入的使用单位` `criteria = InputBox("请输入要筛选的使用单位名称:", "输入筛选条件")` `If criteria = "" Then Exit Sub`` ` `' 在信息总表中查找匹配行` `With infoSheet` `lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row` `For i = 2 To lastRow ' 假设第1行为标题行` `If .Cells(i, 1).Value = criteria Then matchedRows.Add i` `Next i` `End With`` ` `If matchedRows.Count = 0 Then` `MsgBox "未找到匹配的使用单位记录。", vbInformation` `Exit Sub` `End If`` ` `' 创建新工作簿` `Set newWB = Workbooks.Add` `Application.DisplayAlerts = False` `While newWB.Sheets.Count > 1` `newWB.Sheets(1).Delete` `Wend` `Application.DisplayAlerts = True`` ` `' 为每个匹配行创建委托单` `For Each Item In matchedRows` `templateSheet.Copy after:=newWB.Sheets(Worksheets.Count)` `Set targetSheet = newWB.Sheets(Worksheets.Count)` `With targetSheet` `.Name = "委托单" & newWB.Sheets.Count - 1` `' 查找所有自动获取单元格` `For Each cell In .UsedRange` `If cell.Value Like "*自动获取*" Then` `Set leftCell = cell.Offset(0, -1)` `colIndex = Application.Match(leftCell.Value, infoSheet.Rows(1), 0)`` ` `If Not IsError(colIndex) Then` `cell.Value = infoSheet.Cells(Item, colIndex).Value` `Else` `cell.Value = "数据未找到"` `End If` `End If` `Next cell` `End With` `Next Item`` ` `' 删除初始空白表并整理工作簿` `newWB.Sheets(1).Delete` `newWB.Sheets(1).Activate` `newWB.SaveAs Filename:=Environ("USERPROFILE") & "\Desktop\" & criteria & "委托单.xlsx"` `MsgBox "已生成 " & matchedRows.Count & " 张委托单!", vbInformation``End Sub
运行后的结果如下图3所示。生成了一个包含所查找的数据的所有委托单的工作簿,并自动填写了相应的信息。
图3
但我并没有结束,我想看看deepseek是怎么修改的。于是,我接着向它提问:
上述代码调试时显示Item变量未定义,请帮我修改
deepseek仔细检查了代码并进行了修正和优化。这次给出的代码如下:
Sub GenerateCommissionSheets()` `Dim srcWB As Workbook, newWB As Workbook` `Dim infoSheet As Worksheet, templateSheet As Worksheet` `Dim criteria As String, lastRow As Long, i As Long` `Dim matchedRows As New Collection` `Dim headerRow As Range, targetSheet As Worksheet` `Dim cell As Range, leftCell As Range, colIndex As Variant` `Dim rowNum As Variant ' 声明循环变量`` ` `Set srcWB = ThisWorkbook` `Set infoSheet = srcWB.Sheets("信息总表")` `Set templateSheet = srcWB.Sheets("委托单")`` ` `criteria = InputBox("请输入要筛选的使用单位名称:", "输入筛选条件")` `If criteria = "" Then Exit Sub`` ` `' 查找匹配行(优化空值处理)` `With infoSheet` `lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row` `For i = 2 To lastRow` `If Trim(.Cells(i, 1).Value) = criteria Then` `matchedRows.Add i` `End If` `Next i` `End With`` ` `If matchedRows.Count = 0 Then` `MsgBox "未找到匹配的使用单位记录。", vbInformation` `Exit Sub` `End If`` ` `' 创建新工作簿(增加错误处理)` `On Error Resume Next` `Set newWB = Workbooks.Add` `Application.DisplayAlerts = False` `Do While newWB.Sheets.Count > 1` `newWB.Sheets(1).Delete` `Loop` `Application.DisplayAlerts = True`` ` `' 生成委托单(优化命名逻辑)` `For Each rowNum In matchedRows` `templateSheet.Copy Before:=newWB.Sheets(1)` `Set targetSheet = newWB.Sheets(1)` `With targetSheet` `.Name = Left("委托单_" & criteria, 25) & "_" & (newWB.Sheets.Count - 1)`` ` `' 增强字段匹配逻辑` `For Each cell In .UsedRange` `If InStr(cell.Value, "自动获取") > 0 Then` `Set leftCell = cell.Offset(0, -1)` `colIndex = Application.Match(Trim(leftCell.Value), infoSheet.Rows(1), 0)`` ` `If Not IsError(colIndex) Then` `' 处理日期格式` `If IsDate(infoSheet.Cells(rowNum, colIndex).Value) Then` `cell.Value = Format(infoSheet.Cells(rowNum, colIndex).Value, "yyyy-mm-dd")` `Else` `cell.Value = infoSheet.Cells(rowNum, colIndex).Value` `End If` `Else` `cell.Value = "字段匹配失败"` `End If` `End If` `Next cell` `End With` `Next rowNum`` ` `' 保存优化(处理特殊字符)` `newWB.Sheets(1).Delete` `newWB.Sheets(1).Activate` `newWB.SaveAs Filename:=Environ("USERPROFILE") & "\Desktop\" & _` `Replace(criteria, "/", "-") & "委托单.xlsx", _` `FileFormat:=xlOpenXMLWorkbook` `MsgBox "成功生成 " & matchedRows.Count & " 张委托单!", vbInformation``End Sub
变量问题解决了,代码也进行了优化,但仍然存在1个未解决的问题:
newWB.Sheets(1).Delete不是删除在新建工作簿时自带的空工作表,而是将新添加的填写了信息的工作表给删除了。
我接着向deepseek提问:
上面的代码把不该删除的工作表给删除了,也就是新工作簿中已生成的工作表删除了而空工作表没有删除,请完善代码
这次虽然给出了修正,但又带来了新的问题,“委托单”填写的数量也有问题。本来还可以再接着问的,但我想我前面已经实现了我需要的功能,自己调整一下代码就行了,不想再花费时间试了。
最后,我选取了deepseek最初生成的代码并对其进行了稍微的修改,将新建工作簿保存在与当前工作簿相同的文件夹下。最终代码如下:
Sub GenerateCommissionSheetsPlus()` `Dim srcWB As Workbook, newWB As Workbook` `Dim infoSheet As Worksheet, templateSheet As Worksheet` `Dim criteria As String, lastRow As Long, i As Long` `Dim matchedRows As New Collection` `Dim Item As Variant` `Dim headerRow As Range, targetSheet As Worksheet` `Dim cell As Range, leftCell As Range, colIndex As Variant`` ` `Set srcWB = ThisWorkbook ' 假设代码在当前工作簿运行` `Set infoSheet = srcWB.Sheets("信息总表")` `Set templateSheet = srcWB.Sheets("委托单")`` ` `' 获取用户输入的使用单位` `criteria = InputBox("请输入要筛选的使用单位名称:", "输入筛选条件")` `If criteria = "" Then Exit Sub`` ` `' 在信息总表中查找匹配行` `With infoSheet` `lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row` `For i = 2 To lastRow ' 假设第1行为标题行` `If .Cells(i, 1).Value = criteria Then matchedRows.Add i` `Next i` `End With`` ` `If matchedRows.Count = 0 Then` `MsgBox "未找到匹配的使用单位记录。", vbInformation` `Exit Sub` `End If`` ` `' 创建新工作簿` `Set newWB = Workbooks.Add` `Application.DisplayAlerts = False` `While newWB.Sheets.Count > 1` `newWB.Sheets(1).Delete` `Wend` `Application.DisplayAlerts = True`` ` `' 为每个匹配行创建委托单` `For Each Item In matchedRows` `templateSheet.Copy after:=newWB.Sheets(Worksheets.Count)` `Set targetSheet = newWB.Sheets(Worksheets.Count)` `With targetSheet` `.Name = "委托单" & newWB.Sheets.Count - 1` `' 查找所有自动获取单元格` `For Each cell In .UsedRange` `If cell.Value Like "*自动获取*" Then` `Set leftCell = cell.Offset(0, -1)` `colIndex = Application.Match(leftCell.Value, infoSheet.Rows(1), 0)`` ` `If Not IsError(colIndex) Then` `cell.Value = infoSheet.Cells(Item, colIndex).Value` `Else` `cell.Value = "数据未找到"` `End If` `End If` `Next cell` `End With` `Next Item`` ` `' 删除初始空白表并整理工作簿` `newWB.Sheets(1).Delete` `newWB.Sheets(1).Activate` `MsgBox "已生成 " & matchedRows.Count & " 张委托单!", vbInformation` `newWB.SaveAs Filename:=ThisWorkbook.Path & "\" & criteria & "委托单.xlsx"` `newWB.Close SaveChanges:=True``End Sub
看来,要想让deepseek帮助编写VBA代码,除了要有完整的提问外,还是要懂得VBA一些知识的。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。