记一次使用 ChatGPT 实现零门槛 Excel Visual Basic 编程的过程

事情是这样的,有同学发来一个「很简单」的需求(网络上应该可以随意搜到“解决方案”,但是我不会),大意是需要将一个 Excel 表格里的内容,逐行填充到另外一个表格中,最终保存为很多新表。

大概是这样的:

其中 B 表需要一个客户一张。需求很典型,但是普通的 Excel 是没办法完成了。

第一回合

求助了 GPT,在经过两很多轮的对话之后,逐步修改提示词:

我有一个excel文件,每一行拥有的内容是客户名称、客户编号、合同号等,如何把每一行的数据批量填入另外一个新的表格中,新表是一份模板,里面需要填入第一个表格中对应的项目

如何将一个 excel 中的数据,批量生成新的表格,一行数据一个表格,并重新排版

如何将一个 excel 中的数据,批量填充到指定的 Excel 模板中,每一行数据都会填充到一个表格中,最终生成很多张新表。但注意需要指定数据填入的具体单元格

如何将一个 excel 中的数据,批量填充到指定的 Excel 模板中,每一行数据都会填充到一个表格中,最终生成很多张新表。比如,将 A 表格中的 B2 填入模板中的 C2,将 B 表格中的 C2 填入模板的 D2,填完后生成一张新表,然后继续处理第二行数据,生成第二张表

以上第一回合,GPT 提供的答案都是使用 python 来解决问题。

此时我并没有动手,只是在手机上和他聊天,然后睡觉了。

第二回合

第二天,准备动手实践一下,先让 GPT 生成了虚拟数据:

然后保存为 client.xlsx 文件,又自己动手创建了一个 final.xlsx 文件,内容就是最上面那张 B 图。

此时重新提问,经过了一个晚上,似乎清晰了许多(睡眠改善记忆力:+1:),提问:

如何将一个 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 厉害。

是的,有个群,啥都好。

3 个赞

求这个群~~~~ :sweat_smile:

同求!

  • 我也经常用来生成VBA代码,但是有些情况,他生成的代码是怎么都不行的。
  • 其实第二个表格是word文档的话,可以用邮件合并功能:

https://www.bilibili.com/video/BV1iv4y1y7Jk?p=1&unique_k=114514

想看看大佬的宏 和群 :upside_down_face:

话说可以考虑一下js,个人感觉比vb好读

把excel内容复制为 行列(tab分隔)格式的文本数据,
那就什么语言都方便处理了——否则vba有天然优势

这个需求,让我想起了word 里的邮件合并功能,虽然我也不太会用。:sweat_smile: