打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
菜鸟福音:有了ChatGPT,EXCEL数据处理VBA代码自动生成太简单

这一年来,老婆做社区团购上瘾了,每周都会有一大批订单蜂拥而至,订单都是在微信群里接龙生成的,送货时,就遇到了订单打印的问题,老婆要求我对订单进行以下处理:

1、分列:把订单的房号和货物清单内容分成两列,方便查阅;

2、排序:把订单按房号进行排序,方便邻居来取货时,快速查询订单明细。

微信接龙原始订单格式

看到订单格式,我就思考以下几个问题:

1、分列问题:发现订单中,房号与货物清单之间,有的有空格,有的没空格;有的有一个空格,有的有多个空格;这在EXCEL中手工操作分列处理时,要把没有空格的加上一个分隔符,以便有可用的“分隔符号”供EXCEL软件识别;做上述处理后,就可以在EXCEL中做“分列”操作,把订单数据分为三列,序号1列,房号1列,货物清单内容1列;

2、排序问题:分列后,要对订单数据按房号进行升序排序,排序时发现问题,房号2B-4A会被排在房号2B-27H的后面,这是因为EXCEL判断的依据是房号2B-4A的第4位字符4>房号2B-27H的第4位字符2,而不是我们以为的4<27;如果要实现正确的排序,则要在2B-4A中,4的前面补上一个0,变为2B-04A;这样在排序时,2B-04A就会按照要求排在2B-27H的前面;做上述处理后,排序结果正确。

3、以上操作都是在EXCEL中手工完成,那么如何用VBA代码来达成上述所要的结果呢,这时候我求助了ChatGPT。

ChatGPT能帮我们生成代码,但首先是你的诉求信息要准确,不会被误解,所以我们在描述功能需求时,要密切注意表达的内容要做到详细并有确定性。

在ChatGPT中请求生成VBA代码时,我的请求表述如下:

帮我写一段VBA代码,在EXCEL表中,在A列的每个单元格中,从右边开始找到第一个英文字母,在这个英文字母后插入符号“,”;将A列中包含的空格全部删除;将A列内容进行“分列”,“分隔符号”为”.”,将分列后的内容写入右侧相邻的单元格;再将C列内容进行“分列”,“分隔符号“为”,”,将分列后的内容写入C列和D列;如果C列单元格中的字符位数为5,但左起第1个字符不是“1“,则寻找单元格中的“-“符号,在”-“符号后面插入一个”0“; 如果C列单元格中的字符位数为4,则寻找单元格中的“-“符号,在”-“符号后面插入一个”0“;对C列内容按升序进行排序,对B列内容按1、2、3等差数列重新进行编号;所有有内容的单元格加上框线。

由于ChatGPT一次处理内容篇幅有限,上述300个字的诉求内容,ChatGPT处理到一半就会中止,无法完成后半部分的代码生成,为了让ChatGPT能生成完成的代码,我把上述300字的诉求内容分为两段来发送:

第一段,

帮我写一段VBA代码,在EXCEL表中,在A列的每个单元格中,从右边开始找到第一个英文字母,在这个英文字母后插入符号“,”;将A列中包含的空格全部删除;将A列内容进行“分列”,“分隔符号”为”.”,将分列后的内容写入右侧相邻的单元格;再将C列内容进行“分列”,“分隔符号“为”,”,将分列后的内容写入C列和D列;

第二段,

帮我写一段VBA代码,在EXCEL表中,如果C列单元格中的字符位数为5,但左起第1个字符不是“1“,则寻找单元格中的“-“符号,在”-“符号后面插入一个”0“; 如果C列单元格中的字符位数为4,则寻找单元格中的“-“符号,在”-“符号后面插入一个”0“;对C列内容按升序进行排序,对B列内容按1、2、3等差数列重新进行编号;所有有内容的单元格加上框线。

大家看到,上述请求内容,相比EXCEL软件手工处理流程,增加了以下细节:

1、由于房号和后面清单内容之间时常会包含多个空格,如果以空格为分隔符号,分列时,VBA代码会将多个空格视作多个分隔符号,最终会将内容分隔为多个空白列,这并不是我们所想的结果,因此需要先清除订单内容中的全部空格后,才不会出现上述错误;

订单内容清除空格的代码如下:

Cells(i, 'A').Value = Replace(Cells(i, 'A').Value, ' ', '')

2、清除全部空格后,你就会发现房号与货物清单之间缺少分隔符号,无法实现分列操作,那么就需要在房号后面补上分隔符号,譬如“:”,这样就可以实现让系统自动进行房号与货物清单的分列操作;请求内容为:从右边开始找到第一个英文字母,在这个英文字母后插入符号“;”.

代码如下:

Do While letterPos > 0

If Mid(cellValue, letterPos, 1) Like '[A-Za-z]' Then

Cells(i, 'A').Value = Left(cellValue, letterPos) & ':' & Right(cellValue, Len(cellValue) - letterPos)

Exit Do

End If

letterPos = letterPos – 1

Loop

3、分列后,在对房号排序时发现,单数字房号,在进行降序排序时会排到双数字房号后面,譬如2B-4A会被排序2B-27H的后面,这样就需要在4A前插入一个0。用代码的处理就是先判断房号的字符位数,如果字符位数为5,就是左起第一个英文字母前加”0”;考虑到有格式如1-4B的房号,要再加个条件“左起第一个字母不为1”;那就是,如果房号字符位数为5,左起第一个字母不为1,就在-符号后面加0;还有一个条件,如果格式如1-4B的房号,就是,如果房号字符位数为4,左起第一个字母为1,就在-符号后面加0;

代码如下:

For i = 1 To Cells(Rows.count, 'C').End(xlUp).Row

'如果字符位数为 5 且左起第 1 个字符不是 '1'

If Len(Cells(i, 'C').Value) = 5 And Left(Cells(i, 'C').Value, 1) <> '1' Then

'寻找单元格中的 '-' 符号

Cells(i, 'C').Value = Replace(Cells(i, 'C').Value, '-', '-0')

'如果字符位数为 4

ElseIf Len(Cells(i, 'C').Value) = 4 Then

'寻找单元格中的 '-' 符号

Cells(i, 'C').Value = Replace(Cells(i, 'C').Value, '-', '-0')

End If

Next i

其它的如排序、编序号、单元格加框线的操作都不难,这里不再赘述。

将诉求内容发送给ChatGPT获得自动生成的VBA代码

将诉求内容发给ChatGPT,ChatGPT自动生成代码,再把生成的代码张贴到EXCEL的开发工具菜单中的VBA对话框中,点击运行按钮,EXCEL自动进行数据处理,生成我们希望得到的结果。

原始订单数据经VBA处理后提到的结果符合诉求

附录:完整代码如下,

Sub ModifyData()

Dim lastRow As Long

lastRow = Cells(Rows.count, 'A').End(xlUp).Row

Dim i As Long

For i = 1 To lastRow

' 从右边开始找到第一个英文字母,在这个英文字母后插入符号':'

Dim cellValue As String

cellValue = Cells(i, 'A').Value

Dim letterPos As Integer

letterPos = Len(cellValue)

Do While letterPos > 0

If Mid(cellValue, letterPos, 1) Like '[A-Za-z]' Then

Cells(i, 'A').Value = Left(cellValue, letterPos) & ':' & Right(cellValue, Len(cellValue) - letterPos)

Exit Do

End If

letterPos = letterPos - 1

Loop

' 将A列中包含的空格全部删除

Cells(i, 'A').Value = Replace(Cells(i, 'A').Value, ' ', '')

' 将A列内容进行'分列','分隔符号'为'.',将分列后的内容写入右侧相邻的单元格

Dim arr() As String

arr = Split(Cells(i, 'A').Value, '.')

Cells(i, 'B').Value = arr(0)

Cells(i, 'C').Value = arr(1)

' 再将C列内容进行'分列','分隔符号'为':',将分列后的内容写入C列和D列

arr = Split(Cells(i, 'C').Value, ':')

Cells(i, 'C').Value = arr(0)

Cells(i, 'D').Value = arr(1)

Next i

'遍历 C 列的每个单元格

For i = 1 To Cells(Rows.count, 'C').End(xlUp).Row

'如果字符位数为 5 且左起第 1 个字符不是 '1'

If Len(Cells(i, 'C').Value) = 5 And Left(Cells(i, 'C').Value, 1) <> '1' Then

'寻找单元格中的 '-' 符号

Cells(i, 'C').Value = Replace(Cells(i, 'C').Value, '-', '-0')

'如果字符位数为 4

ElseIf Len(Cells(i, 'C').Value) = 4 Then

'寻找单元格中的 '-' 符号

Cells(i, 'C').Value = Replace(Cells(i, 'C').Value, '-', '-0')

End If

Next i

'对 C 列内容按升序进行排序

With Range('C1', Cells(Rows.count, 'C').End(xlUp))

.Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo

End With

'对 B 列内容按 1、2、3 等差数列重新进行编号

For i = 1 To Cells(Rows.count, 'B').End(xlUp).Row

Cells(i, 'B').Value = i

Next i

'所有有内容的单元格加上框线

Dim rng As Range

Dim ws As Worksheet

Set ws = ThisWorkbook.ActiveSheet

For Each rng In ws.UsedRange

If Len(rng.Value) > 0 Then

rng.Borders.LineStyle = xlContinuous

End If

Next rng

End Sub

内容来自懂车帝

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Excel如何批量为单元格数据插入分隔符号
按分隔符拆分单元格终结篇,利用VBA一劳永逸解决所有这类问题
利用java操作Excel文件
VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件
C#常见技能_Excel文件读写
VBA数组(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服