这一年来,老婆做社区团购上瘾了,每周都会有一大批订单蜂拥而至,订单都是在微信群里接龙生成的,送货时,就遇到了订单打印的问题,老婆要求我对订单进行以下处理: 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 ![]() 内容来自懂车帝 |
|