使用VBA在Excel中进行字母数字sorting

在导入到另一个程序之前,我使用Excel中的创build材料清单,我尝试按参考指定对这些清单进行sorting,其中包括前缀页码1-200,其次是设备typesA-ZZ,后面是设备号(ID)在该页面1-99上,后跟代表设备AZ的一部分的字母(如果该设备由多个部分组成)。
这里是RefDes的例子:

1Q1 1S6 1S7 1T1 1VENT 1X1 1X2 1Y1 1Z1-A 1Z1-B 2A1-A 2A1-B 2A1-C 22M1 2QF1 2RB1 2Z1-A 2Z1-B 13A1-A 13A1-B 13A1-C 3A2-A 3A2-B 3A2-C 

我想先按设备typesA-ZZsorting,然后按设备ID,然后是设备部分,然后按页面sorting。

 1A1A .... 1A1Z 1A2A .... 1A2Z 2A1A .... 2A1Z .... 200A99Z 1B1A .... 200ZZ99Z 

所以上面的列表是这样sorting的:

 2A1-A 2A1-B 2A1-C 3A1-A 3A1-B 3A1-C 13A1-A 13A1-B 13A1-C 22M1 1Q1 2QF1 2RB1 1S6 1S7 1T1 1VENT 1X1 1X2 1Z1-A 1Z1-B 2Z1-A 2Z1-B 

到目前为止,我已经能够按页面,然后按设备types,然后sorting错误:1A-1ZZ,然后1xA-1xZZ,然后2A-2ZZ,然后2xA-2xZZ等…我可以摆脱破折号( – )当我build立BOM。

我不知道这是否是最有效的方式,但是根据您的BOM构build方式,将数据拆分成临时列,然后对其进行分类,然后删除列可能会更容易。

你的sorting要求和顺序似乎太复杂,以我所知的任何其他方式做。

 Sub SortBOMS() Dim workingRange As Range Dim workingCell As Range Dim pageNumber As String Dim deviceType As String Dim deviceID As String Dim devicePart As String Dim i As Integer Application.ScreenUpdating = False 'Obtains the full list. (Assumes you have no data after the 1millionth row) Set workingRange = Range("A1:A" & Range("A1000000").End(xlUp).Row) For Each workingCell In workingRange.Cells 'Builds the page number pageNumber = "" For i = 1 To 3 'Used 3 since 200 is 3 characters If IsNumeric(Mid(workingCell.Text, i, 1)) Then pageNumber = pageNumber & Mid(workingCell.Text, i, 1) Else Exit For 'Exits as soon as encounters a letter End If Next i 'Writes the value after converting it to an integer Range("B" & workingCell.Row).Value = CInt(pageNumber) 'Builds the device type deviceType = "" For i = 1 To 2 'Used 2 since ZZ is 2 characters If Not (IsNumeric(Mid(Split(workingCell.Text, pageNumber)(1), i, 1))) Then deviceType = deviceType & Mid(Split(workingCell.Text, pageNumber)(1), i, 1) Else Exit For 'Exits as soon as encounters a number End If Next i 'Writes the value Range("C" & workingCell.Row).Value = deviceType 'Builds the device ID deviceID = "" For i = 1 To 2 'Used 2 since 99 is 2 characters If IsNumeric(Mid(Split(workingCell.Text, pageNumber & deviceType)(1), i, 1)) Then deviceID = deviceID & Mid(Split(workingCell.Text, pageNumber & deviceType)(1), i, 1) Else Exit For 'Exits as soon as encounters a letter or a dash End If Next i 'Writes the value after converting it to an integer On Error Resume Next Range("D" & workingCell.Row).Value = CInt(deviceID) On Error GoTo 0 'Builds the device part devicePart = "" If InStr(1, workingCell.Text, "-", vbTextCompare) > 0 Then devicePart = Split(workingCell.Text, "-")(1) End If 'Writes the value Range("E" & workingCell.Row).Value = devicePart Next workingCell 'Clean up Application.ScreenUpdating = True Set workingRange = Nothing Set workingCell = Nothing End Sub 

运行后,你应该能够按照你想要的方式sorting。 此外,为了得到你想要的结果sorting顺序,而不是你在post中提到的顺序:

  1. 设备types
  2. 页码
  3. 设备ID
  4. 设备部分