2016-08-17 4 views
1

Ich benutze in Excel vor dem Import in einem anderen Programm die Erstellung von Stücklisten und versuche diese Listen nach Referenz zu sortieren, die aus der Prefix-Seitennummer 1-200, gefolgt vom Gerätetyp A- bestehen. ZZ, gefolgt von der Gerätenummer (ID) auf dieser Seite 1-99, gefolgt von einem Buchstaben, der einen Teil von Gerät AZ darstellt (wenn dieses Gerät aus mehreren Teilen besteht).
Hier sind Beispiele Ref-Bestimmung:
Alphanumerische Sortierung in Excel mit 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 

ich möchte es nach dem Gerätetyp A-ZZ, dann mit dem Geräte-ID zunächst sortiert, dann Geräteteil, dann von Seite.

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

Damit die obige Liste wie folgt sortiert:

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 

Bisher konnte ich von Seite sortieren dann nach Gerätetyp und selbst dann sortiert es falsch: 1A-1ZZ, dann 1xA-1xZZ, dann 2A-2ZZ, dann 2xA-2xZZ, etc ... Ich kann den Bindestrich (-) loswerden, wenn ich die BOM baue.

+2

Wenn ich so etwas baute, würde ich alle vier Teile in ihre eigenen Zellen stecken. Dann können Sie über die Spalten in der gewünschten Reihenfolge sortieren. Sie können die Spalten verketten, wenn Sie eine einzelne Zelle ausgeben möchten. Wie es ist, müssen Sie die Daten in ihre vier Teile analysieren und dann sortieren. –

+0

Wie passt 1VENT zu Ihrem Muster? –

+0

1VENT ist eine Anomalie und würde als VE für Gerätetyp und dann 1 für Blatt sortiert werden. – MaxK

Antwort

2

Ich weiß nicht, ob dies der effizienteste Weg ist, aber je nachdem, wie Ihre Stücklisten konstruiert werden, könnte es einfacher sein, die Daten in temporäre Spalten aufzuteilen, sie zu sortieren und dann die Spalten zu löschen .

Ihre Sortieranforderungen und Reihenfolge scheint zu komplex, um es auf eine andere Weise zu tun, die ich kenne.

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 

Nachdem dies ausgeführt wird, sollten Sie in der Lage sein, so zu sortieren, wie Sie möchten. Auch, um die gewünschten Ergebnisse zu erzielen Art in dieser Reihenfolge, nicht die Reihenfolge, die Sie in dem Beitrag erwähnt:

  1. Gerätetyp
  2. Seite Nummer
  3. Device ID
  4. Geräteteil
+1

Ich hätte Arrays verwendet, um die Dinge zu beschleunigen, aber im Wesentlichen dasselbe getan. –

+0

Das ist, was ich manuell gemacht habe und ich muss nicht einmal Geräte-ID und Teil ausbrechen, also habe ich nur 3 Spalten. dann sortiere ich nach Typ und es funktioniert. Danke, das beschleunigt die Dinge sehr. – MaxK

+0

@MaxK kein Problem. Wenn Sie das suchen, klicken Sie einfach auf das Häkchen, um die Frage zu schließen. – TheGuyOverThere