事情是这样的,有同学发来一个「很简单」的需求(网络上应该可以随意搜到“解决方案”,但是我不会),大意是需要将一个 Excel 表格里的内容,逐行填充到另外一个表格中,最终保存为很多新表。
大概是这样的:
其中 B 表需要一个客户一张。需求很典型,但是普通的 Excel 是没办法完成了。
第一回合
求助了 GPT,在经过两很多轮的对话之后,逐步修改提示词:
我有一个excel文件,每一行拥有的内容是客户名称、客户编号、合同号等,如何把每一行的数据批量填入另外一个新的表格中,新表是一份模板,里面需要填入第一个表格中对应的项目
如何将一个 excel 中的数据,批量生成新的表格,一行数据一个表格,并重新排版
如何将一个 excel 中的数据,批量填充到指定的 Excel 模板中,每一行数据都会填充到一个表格中,最终生成很多张新表。但注意需要指定数据填入的具体单元格
如何将一个 excel 中的数据,批量填充到指定的 Excel 模板中,每一行数据都会填充到一个表格中,最终生成很多张新表。比如,将 A 表格中的 B2 填入模板中的 C2,将 B 表格中的 C2 填入模板的 D2,填完后生成一张新表,然后继续处理第二行数据,生成第二张表
以上第一回合,GPT 提供的答案都是使用 python 来解决问题。
此时我并没有动手,只是在手机上和他聊天,然后睡觉了。
第二回合
第二天,准备动手实践一下,先让 GPT 生成了虚拟数据:
然后保存为 client.xlsx
文件,又自己动手创建了一个 final.xlsx
文件,内容就是最上面那张 B 图。
此时重新提问,经过了一个晚上,似乎清晰了许多(睡眠改善记忆力),提问:
如何将一个 excel 中的数据,批量填充到另外一个 Excel 中,每一行数据都会填充到一个表格中,最终生成很多张新表。
比如,将1表格中的 B2、C2 分别填入2表格中的 C2、D2,将1表格中的 B2、C3 分别填入2表格中的 C2、D2,将1表格中的。注意这里是将1表格中每一行的数据都按规则填入2表格中相同的单元格。
这次 GPT 并没有使用 python,而是返回了 VB 代码:
虽然不知道为什么,但 VB 比 python 好操作一些(不需要配置环境)
之后,就是使用 GPT 提供的代码进行测试,遇到问题就将错误提示发给 GPT,然后多方面解决代码问题。
期间碰到了 运行提示 下标超出范围
、运行时错误 '1004':应用程序定义或对象定义错误
,只生成一个文件,不生成多个文件、运行时错误 '-2147221080 (800401a8)':自动化 (Automation) 错误
,不知道将代码添加到哪等多个问题。
逐一完善了这些问题之后,就得到了最终的代码:
Sub copyData()
Dim sourceWorkbook As Workbook
Dim targetWorkbook As Workbook
Dim sourceSheet As Worksheet
Dim targetSheet As Worksheet
Set sourceWorkbook = Workbooks("client.xlsx")
Set targetWorkbook = Workbooks("final.xlsx")
Set sourceSheet = sourceWorkbook.Sheets("Sheet1")
Set targetSheet = targetWorkbook.Sheets("Sheet1")
Dim lastRow As Long
lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, 1).End(xlUp).Row
Dim i As Long
Dim fileName As String
For i = 2 To lastRow
targetSheet.Range("D3").Value = sourceSheet.Cells(i, 1).Value
targetSheet.Range("B3").Value = sourceSheet.Cells(i, 2).Value
targetSheet.Range("F3").Value = sourceSheet.Cells(i, 3).Value
targetSheet.Range("B4").Value = sourceSheet.Cells(i, 4).Value
targetSheet.Range("D4").Value = sourceSheet.Cells(i, 5).Value
fileName = Replace(sourceSheet.Cells(i, 2).Value, "/", "-")
targetWorkbook.SaveCopyAs "C:\Users\appinn\Desktop\" & fileName & ".xlsx"
Next i
End Sub
其中,只需要修改这个部分,即可一一对应填充内容:
targetSheet.Range("D3").Value = sourceSheet.Cells(i, 1).Value
D3 为目标 excel 单元格,1 为源表格列。
来回对话一共 46 次:
另外,同样的问题也抛到了群里,然后 excel 大佬手搓了一份宏过来,只需要点一个按钮就完成了,群里惊呼:
群比 GPT 厉害。
是的,有个群,啥都好。