2016-08-17 5 views
1

Я использую создание материалов в Excel перед импортом в другую программу, и я пытаюсь сортировать эти списки по ссылочному обозначению, которые состоят из префикса страницы номер 1-200, а затем типа устройства A- ZZ, а затем номер устройства (ID) на этой странице 1-99, за которым следует буква, представляющая часть устройства AZ (если это устройство состоит из нескольких частей).
Вот примеры RefDes:
Буквенно-цифровая сортировка в Excel с использованием VBA

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 

Я хочу, чтобы он сначала сортируется по типу устройства A-ZZ, затем ID устройства, то устройство части, а затем на странице.

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

Так что список выше сортируется так:

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 

До сих пор я был в состоянии сортировать страницы, то по типу устройства, и даже тогда он сортирует неправильно: 1A-1ZZ, то 1xA-1xZZ, затем 2A-2ZZ, затем 2xA-2xZZ и т. Д. Я могу избавиться от тире (-) при создании спецификации.

+2

Когда я строил что-то подобное, я бы поставил все четыре части в свои ячейки. Затем вы можете сортировать по столбцам в желаемом порядке. Вы можете объединить столбцы, если хотите вывести одну ячейку. Вам нужно будет разобрать данные на четыре части, а затем отсортировать их. –

+0

Как 1VENT подходит для вашего шаблона? –

+0

1VENT является аномалией и будет сортироваться как VE для типа устройства, а затем 1 для листа. – MaxK

ответ

2

Я не знаю, является ли это наиболее эффективным способом его выполнения, но на основе того, как создаются ваши спецификации, может быть проще разделить данные на временные столбцы, затем отсортировать их, а затем удалить столбцы ,

Ваши требования и порядок сортировки кажутся слишком сложными, чтобы сделать это любым другим способом, о котором я знаю.

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 

После этого вы сможете отсортировать, как хотите. Кроме того, чтобы получить результаты, которые вы хотите сортировать в таком порядке, а не порядка вы упомянули в посте:

  1. Тип устройства
  2. Номер страницы
  3. Device ID
  4. Часть устройства
+1

Я бы использовал массивы, чтобы ускорить процесс, но по существу делал то же самое. –

+0

Это то, что я делал вручную, и мне даже не нужно разрывать идентификатор и часть устройства, поэтому у меня только 3 столбца. то я сортирую по типу, и он работает. Спасибо, это значительно ускоряет работу. – MaxK

+0

@MaxK без проблем. Если это то, что вы искали, просто нажмите галочку, чтобы закрыть вопрос. – TheGuyOverThere